为了简化 SSH 登录过程, 实现从客户机 Client 登录服务机 Upgrade 只需要运行 ssh hostname
即可, 即不需要输入用户名和密码。
免密码登录服务器设置步骤
1. 在客户机生成 SSH 密钥和公钥
假设客户机 Client(192.168.0.104
) 和远程服务机 Upgrade(148.135.123.140
) 拥有相同的用户,名为 root。
Client 客户机执行
ssh-keygen -t rsa
ssh-keygen -t rsa -C "[email protected]" # 指定名字
ssh-keygen -t rsa -b 4096 -C "root" -f ~/.ssh/id_rsa # 指定文件路径
cat ~/.ssh/id_rsa.pub # 查看公钥内容确认一下
ssh-copy-id -p 22 -i ~/.ssh/id_rsa.pub [email protected] # 本地机器使用 ssh-copy-id 增加,或者直接步骤2 人工写入文件
cat ~/.ssh/id_rsa.pub | ssh -p 22 [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
ssh-keygen
常用参数
-t
:指定密钥的加密演算法,预设使用 SSH2d 的 rsa-f
:指定密钥的文件名,使用 rsa 加密时,默认为 id_rsa(私钥id_rsa
,公钥id_rsa.pub
)-P
:提供旧密码,空表示不需要密码(-P ''
)-N
:提供新密码,空表示不需要密码(-N ''
)-b
:指定密钥长度(bits)-C
:提供一个新标签
~/.ssh
目录下四文件及作用
authorized_keys
存放远程免密登录的公钥,删除了其它机器就不能免密码连接到此机器known_hosts
连接过的 SSH 服务器的公钥指纹。首次连接一个 SSH 服务器时,SSH 客户端会询问您是否信任该服务器的公钥。一旦您确认,它的公钥信息就会被存储在 known_hosts 文件中id_rsa
生成的私钥文件id_rsa.pub
: 生成的公钥文件
2. 将 SSH 公钥上传到远程服务器
通常三种方式,一是通过 ssh-copy-id
命令,二是通过 scp
命令,三是手工复制。
Upgrade 远程服务机执行
su - root
# 1. 检查
cat ~/.ssh/known_hosts # 查看认证文件
cat ~/.ssh/id_rsa.pub # 检查 ras 密钥不存在则新创建
ssh-keygen -f "/root/.ssh/known_hosts" -R "107.172.79.165" # 删除指定主机指纹
# 2. 创建
ssh-keygen -t rsa -b 4096
ssh-copy-id -p 22 -i ~/.ssh/id_rsa.pub [email protected] # x.x.x.x 为服务机(被推送到)机 IP
# 服务机(被推送到)机执行,可以修改 == 后,加入用户注释标识方便管理
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfHVlllJqcA9wO7daW1qJzNvECXsiWd5RhaYZxvi/WsspWy/f5lNdslROW2FPBqaDEyrKKBh1r+8KJe1in/7HecvlTsr9rSANdLVGoW6cnGKlC62jIvKbiiM3bugHTT89iuclOUwfWslvXwrMgf6STddAD3isQP8rkoMAP3sb9KDyaLNiJIRp2bKUf1r7Lfd45KGd/iUlC/C/t8GagFFHXwfu182DzWhFbVfqbULyH4a46t3RSIpz/rFtq5cG7jViDi3ZYI/VoJ0DJlejKKjyfzm3AAUbmNyq0nHU8lUotGj5DIWXnAXdp9ja3UTSNBjwzDwZltMPutr0ypmHR59xlSp1KHjxb3RW430nZDPii24c0cp3yhJPIyEw9d0odjkfwAODuz7qzShy/y+xiduCR/Q8cyO2ZCr7xhhelvZvcvhxzGEiGLsCKOyuOq9nZFLbuiX0BBFxjlxQkkRGlunWpONOvalDl297wJwj+d26HTDCIYg3d4BIlnjcuaFAQyf1I5xvZqP1FWMtzOBDFCt4iXZaNu4Qw+WKq8/jwcnHABZqTlcKnZjfx1IeyeVz1RaXmmgAfW7qXExKHXQFi35fblbGY7vjad617g0vpJfUxzlukEILIZrC13ft/vWBXHj8hoLmayFoh0boDxkcDaEoyVjXo4DpdsYUGRMwAYh4jKw== root@debian11-develop >> ~/.ssh/authorized_keys
# 3. 测试
# 客户机可以免密码 SSH 到服务机
ssh -p 22 [email protected] # 准备服务机(被推送到)机 root 密码
ssh -p 22 [email protected] -i .ssh/id_rsa -vv
# 4. 确认
# 确认相关权限无误
ssh -p 22 [email protected] "curl -s -4 ip.sb" # 可以执行远程 shell
cat ~/.ssh/authorized_keys # 如果不存在就新建,并确保权限
chmod 700 ~/.ssh # 确保目录权限 700,文件权限 600
chmod 600 ~/.ssh/authorized_keys
3. 远程服务器启用密钥验证
Upgrade 远程服务机执行
修改 ssh 配置文件
# 编辑 sshd_config文件
vi /etc/ssh/sshd_config
# 找到或添加以下配置项。确保它们的值如下所示
RSAAuthentication yes # RSAAuthentication 配置选项已经过时。在现代的 OpenSSH 版本中不再被使用。 默认启用对 RSA 密钥的支持
PubkeyAuthentication yes # 是否启用公钥验证 (默认已启用, 确认一下)
AuthorizedKeysFile .ssh/authorized_keys # 指定授权密钥文件位置 (默认)
PasswordAuthentication no # 用户(包括 root)能否使用密码进行 SSH 登录
ChallengeResponseAuthentication no # 禁用质询-响应验证(通常与密码验证一同禁用,提高安全性)
UsePAM no # 禁用 PAM (pluggable authentication modules) (安全增强)
PermitRootLogin no # root 用户能否登录,yes/no/prohibit-password(禁止 root 用户使用密码登录,但是允许使用密钥登录)
# 或 sed 如下
sed -i "s/^#PubkeyAuthentication.*/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/^#AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/g" /etc/ssh/sshd_config
注:重启 ssh 服务前建议多保留一个会话以防不测
# RHEL/CentOS 系统
service sshd restart
# Ubuntu 系统
service ssh restart
# Debian 系统
/etc/init.d/ssh restart
grep 过滤井号查看配置
# grep 命令 -v 参数(反向选择)分别去掉所有以 #(井号)和 ;(分号)开头的注释信息行,对于剩余的空白行可以再用 ^ $来表示并反选过滤
# ssh 服务端
root@cloudcone-140:~# cat /etc/ssh/sshd_config | grep -v "#" | grep -v ";" | grep -v "^$"
# ssh 客户端
root@cloudcone-140:~# cat /etc/ssh/ssh_config | grep -v "#" | grep -v ";" | grep -v "^$"
4. 客户端免密码登录服务器
Client 客户机执行
现在 Client 客户机可以不用密码登入 Upgrade 远程服务机了。
Client 首次连接 Upgrade 会提示你确认服务器的指纹,根据提示输入 yes
后,Client 下的 ~/.ssh/known_hosts
目录会增加一条对应远程机的认证信息,其文件的内容格式如下:
# <主机标识符> <密钥类型> <公钥> [注释]
|1|PY5c66/2FJblIyr8x48keIi2Tfk=|Iyz48oCDHpqkJoafO9g69jRJgTE= ssh-ed25519 AAAAC3NzaC1lZDI1HTE5AAAAIH87KRnMfVkNO6xzdXSZ2SlJlYLZR8aTvHG5KJp0P+H8
ssh [email protected](Upgrade ip) -v
ssh [email protected] -i ~/.ssh/id_rsa # 指定私钥,默认条件下使用 ~/.ssh/id_rsa
ssh [email protected] -i ~/.ssh/id_rsa -p 22 # 指定端口
免密码登录错误调试
ssh [email protected] -v
本地登录SSH小技巧
为了不每次输入 ssh user@hostname -p2022
长串的命令,我们可以在 ~/.ssh/config
中设置服务器别名来快捷登录
vi ~/.ssh/config
Host abc # 自定义别名
User root # 用户名
Hostname hostname # 服务器地址
Port 2022 # 端口号
IdentityFile ~/.ssh/id_ed25519 #本地证书
设置完成后,就可以使用 ssh abc
这样简介的方式来连接服务器了。