关联文章
- Linux ssh 免密登录配置👍
- 对日开发 TeraTerm 批量向各台服务器传输文件
- SSH 教程👍👍👍👍👍👍
目录
- 一. ssh-keygen相关命令
- 1.1 简介
- 1.2 生成密钥
- 1.3 ssh-copy-id 上传公钥到指定的服务器
- 1.4 服务器的公钥指纹查看
- 1.4.1 ssh-keyscan 在客户端查看对方服务器的公钥指纹
- 1.4.2 在服务器端查看公钥指纹
- 1.5 `-F` 查看指定服务器对应的完整公钥
- 1.6 `-R` 删除指定服务器对应的公钥
- 二. ssh命令
- 2.1 `-v` 查看连接的详细信息
- 2.2 `-p` 指定端口号
- 2.3 连接远程服务器的时候执行命令
- 2.3.1 连接单台服务器时,执行命令
- 2.3.2 批量连接多台服务器时执行命令
一. ssh-keygen相关命令
1.1 简介
⏹ssh-keygen
是一个用于 创建 SSH 密钥对(公钥和私钥) 的命令行工具,主要用于 SSH 认证。这些密钥可以用来:
- 无密码地登录远程服务器(通过公钥认证)
- 对数据进行加密与签名(如 Git 签名等)
- 管理
known_hosts
文件中主机的指纹
⏹ SSH 密钥对的原理简述
- 在本地生成密钥对(私钥保存在本地,公钥可以公开)。
- 把公钥上传到服务器的 ~/.ssh/authorized_keys。
- 登录服务器时,SSH 客户端用私钥进行身份认证,服务器用你上传的公钥进行验证。
这样就能实现:免密码、安全登录远程主机。
1.2 生成密钥
-t ed25519
:指定加密算法-C "fengyehong123@example.com"
:- 公钥中会默认使用当前系统的用户名和主机名作为注释
- 指定给密钥添加注释(通常是邮箱或用户名,方便识别密钥用途)
-f ~/.ssh/key
:指定密钥输出的位置,会生成以下2个文件- ➡️ 私钥:
~/.ssh/key
- ➡️ 公钥:
~/.ssh/key.pub
- ➡️ 私钥:
ssh-keygen -t ed25519 -C "fengyehong123@example.com" -f ~/.ssh/key
1.3 ssh-copy-id 上传公钥到指定的服务器
- 命令执行之后,会把公钥的内容给追加到对方服务器的
~/.ssh/authorized_keys
文件中
ssh-copy-id -i ~/.ssh/key.pub apluser@172.22.118.28
1.4 服务器的公钥指纹查看
1.4.1 ssh-keyscan 在客户端查看对方服务器的公钥指纹
- 💥注意:这种方式不能 100% 保证安全(容易被中间人攻击),除非所在的网络环境受到信任
$ ssh-keyscan 172.22.118.28 2>/dev/null | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 172.22.118.28 (ED25519)
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 172.22.118.28 (RSA)
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o 172.22.118.28 (ECDSA)
- 指定查看某种加密方式所对应的密钥
$ ssh-keyscan -t ed25519 172.22.118.28 2>/dev/null | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 172.22.118.28 (ED25519)
1.4.2 在服务器端查看公钥指纹
- 服务器的公钥都保存在
/etc/ssh/
目录下
apluser@FengYeHong-HP:~$ ls -l /etc/ssh/*.pub
-rw-r--r-- 1 root root 180 May 25 21:45 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root 100 May 25 21:45 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 572 May 25 21:45 /etc/ssh/ssh_host_rsa_key.pub
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o root@FengYeHong-HP (ECDSA)
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 root@FengYeHong-HP (ED25519)
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 root@FengYeHong-HP (RSA)
1.5 -F
查看指定服务器对应的完整公钥
命令 | 显示内容 | 含义 |
---|---|---|
ssh-keygen -F <IP> | 显示的是完整公钥(Base64) | known_hosts 中保存的原始公钥 |
ssh-keygen -lf ~/.ssh/known_hosts | 显示的是指纹(SHA256 hash) | 便于人工比对、防止被伪造 |
- 当连接服务器成功之后,服务器的公钥会被保存到
- Linux环境:
~/.ssh/known_hosts
- Windows环境:
$HOME/.ssh/known_hosts
- Linux环境:
- 可以通过
-F
配置项查询指定服务器对应的公钥
$ ssh-keygen -F 172.22.118.28 | grep -v '#'
172.22.118.28 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICw5prT13UbYsJw4qzWDpq34WjbVpuT5xqNvb5hXMH8w
172.22.118.28 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCl/8jZjH5edrPIgtmGBg8NjfBk2b1aRqW66LZeD0vdiMEB8TYagccKYAg4h9RFyq2s/zjUh5EIK7gaYNapbLv/3ZtbwJf0UWieskK2x+dVbBySfKQjSobjCGrkf1ieLgv5ZIYmPxyT2lcTPOJLT3qQTVGr4Boygx2Ai3pOOqjs8jzVQaAPVnEGaHpqU4XyQxY2mvehe3lvvXd799vF3c5E+hKGJA2mGViYFSeZKhRXeoy/oTvEBYsAlYsT8efgyDE5F5ZqKXekxTy9bZbwutD4PDC6pt89h52oVoZJsuC28RsNmds/f0s8wJrsvantStZa9J1MiOTIgA4DsvvbwuSwMJLqis5pAFMV2IZ+efdrQPWeA2WKcBacCIjjfB4p5O3/HoXJFJfbWNJTnTbsCnyzlOZ42GZTB6JB192/LlPxsBDmeUrSZlPUjhGTxA8BEkzgL6a4HCzw0jKNGkR1L/UT4D/qcNWWZHhBvZaCWinYLUjXQpMNRKA51WM+GXChw+8=
172.22.118.28 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJu6r6tihFTYzSsXHk+fFp3Xnq7jNRJCrJbhdC8gpSJpoujxfv1JMVoYUiZNSI2ucR8oJFIgTul50ez31kXwX9c=
- 💥注意:
-F
查看的是服务器的完整公钥(Base64编码后),并不是公钥的指纹 - 可以通过下面的命令将Base64编码后完整公钥转换为公钥指纹,方便比对
# 服务器端查看公钥指纹
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 root@FengYeHong-HP (ED25519)# 在客户端将Base64编码后完整公钥转换为公钥指纹
$ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICw5prT13UbYsJw4qzWDpq34WjbVpuT5xqNvb5hXMH8w" | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 no comment (ED25519)
- 可以通过下面的命令批量查看服务器保存到客户端的全部公钥的指纹
$ ssh-keygen -F 172.22.118.28 | grep -v '#' | awk '{print $2 " " $3}' | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 no comment (ED25519)
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 no comment (RSA)
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o no comment (ECDSA)
- 💥需要:如果服务器使用的不是默认端口的话,需要指定端口才能查看
$ ssh-keygen -F [192.168.3.23]:2222
# Host [192.168.3.23]:2222 found: line 5
[192.168.3.23]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmXkFXdtiy/3q/+C0n4oZWjk9Ooaue+qH5Ps4BIHdlVgyu3jaTJ8NMmaYebgjkzYca+GvHM4ymZB5pt/iR9DDcjpwA66nVjra8SWLZqxsnlbcs8RMR2fp8dVPvnG2uKnn3S0CHV/7/XbFdvX0nzWxHdA/YqVlUR4TPKzhAmM62DBEvRdWpuok0r2xTsE8Q/xv+SKE08t3BzUde4iDV8rEoJQ130W96sZBnEadQtr//jPIDuJ4Vjfu/xzDgqLF463AGB51E6lu9Ix9TmC+nfHCENPRrBHh6VgxHVnNi5rv9NO4kRT1CNMIeVOVccP7NY+v6j2INiEX6vo08HHK0CoQp
1.6 -R
删除指定服务器对应的公钥
⏹当远程服务器被重新安装、密钥被更新或 IP 被他人占用时,就会出现类似于下面的警告
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:OYtwkILXy0dkzCTnO+2YclxZVOzQw9SzBHuaF3ve6Is.
Please contact your system administrator.
Add correct host key in /c/Users/Admin/.ssh/known_hosts to get rid of this message.
Offending RSA key in /c/Users/Admin/.ssh/known_hosts:2
Host key for [192.168.3.23]:2222 has changed and you have requested strict checking.
Host key verification failed.
Connection closed# 👇👇👇翻译成中文就是👇👇👇
该主机的公钥指纹跟 ~/.ssh/known_hosts 文件储存的不一样,必须处理以后才能连接。
这时,你需要确认是什么原因,使得公钥指纹发生变更,到底是恶意劫持,还是管理员变更了 SSH 服务器公钥。
# 👆👆👆翻译成中文就是👆👆👆
⏹如果服务器是值得被信任的,可以通过-R
配置项删除保存在known_hosts
文件中的服务器公钥
当通过ssh命令再次连接服务器时,新的服务器公钥指纹就会被重新添加到known_hosts
文件中。
# 删除指定服务器对应的公钥
$ ssh-keygen -R 172.22.118.28
# Host 172.22.118.28 found: line 6
# Host 172.22.118.28 found: line 7
# Host 172.22.118.28 found: line 8
~/.ssh/known_hosts updated.
Original contents retained as ~/.ssh/known_hosts.old# 再次连接时会出现提示
$ ssh apluser@172.22.118.28
The authenticity of host '172.22.118.28 (172.22.118.28)' can't be established.
ED25519 key fingerprint is SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
二. ssh命令
2.1 -v
查看连接的详细信息
2.2 -p
指定端口号
ssh -p 22 apluser@172.22.118.28
2.3 连接远程服务器的时候执行命令
2.3.1 连接单台服务器时,执行命令
# 要指定的命令可以不带单引号
ssh apluser@172.22.118.28 ls -l ~/work/
# 但最好还是带着单引号
ssh apluser@172.22.118.28 'ls -l ~/work/'
2.3.2 批量连接多台服务器时执行命令
⏹执行后,只需要输入服务器的密码即可
for i in {1..2}; do ssh c1kap1${i}a 'ls -l /data/work'; done
⏹如果使用的TeamTerm连接linux服务器的话,还可以写一个ttl脚本来批量执行
- 详情请参考这篇博客 → 对日开发 TeraTerm 批量向各台服务器传输文件
; -----------------------------------------
exec_cmd = "'ls -l /data/work/'"
SSH_PWD = 'pwd001'
; -----------------------------------------for i 1 2; 拼接ssh命令sprintf2 ssh_cmd 'ssh c1kap1%da %s' i exec_cmd; 执行ssh命令sendln ssh_cmdwait 'password:'sendln SSH_PWDwait '$'
next