为了简化 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
: 已知的主机公钥清单id_rsa
: 生成的私钥文件id_rsa.pub
: 生成的公钥文件
2. 将 SSH 公钥上传到远程服务器
通常三种方式,一是通过 ssh-copy-id
命令,二是通过 scp
命令,三是手工复制。
Upgrade 远程服务机执行
su - root # 切换当前用户到 root
cat ~/.ssh/known_hosts # 查看认证文件
cat ~/.ssh/authorized_keys # 如果不存在就新建,并确保权限
chmod 700 ~/.ssh # 确保目录权限 700,文件权限 600
chmod 600 ~/.ssh/authorized_keys
# 可以修改 == 后,加入用户注释标识方便管理
echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQC3ew6qUVc7jzyB/kW15QEbfLDSSAIFfslkneU9AfQ89tulTFaIfJlIBpIdb4egO5jJ39FB1jIAvB5WXYPuPc3WAcmzLWXWHjE4JqeqfT8a0veKpqg68d0LZqT+nMOKJ8MoF54zBi/fweA8VHw95Hn6sBgD/WoUqGriuW84MjENxEBTGtPZDgXkveLYvOXXc51A8IvEybjQNRkjJ9450srDETPFesak/mGykqSX1NktnheoJtCJU5eK1JzJz/j4hdbmXrRsmiw5L+EYkz9cQD4tE3cpuQhKuahX1579i8mMuYvqyVPAFrrMJLnQAYTSKWnIr+9jktPLyALVD2u2Df root@client-web >> ~/.ssh/authorized_keys
3. 远程服务器启用密钥验证
Upgrade 远程服务机执行
修改 ssh 配置文件
# 编辑 sshd_config文件
vi /etc/ssh/sshd_config
# 请留意 root 用户能否通过 SSH 登录
# PermitRootLogin yes
# PasswordAuthentication yes
# 禁用密码验证
PasswordAuthentication no
# 启用密钥验证
RSAAuthentication yes
PubkeyAuthentication yes
# 指定公钥数据库文件
AuthorsizedKeysFile .ssh/authorized_keys
sed -i "s/^PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
sed -i "s/^#RSAAuthentication.*/RSAAuthentication yes/g" /etc/ssh/sshd_config
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 远程服务机了。
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/known_hosts 文件内容对应 IP 的行的认证信息,可重新连接认证
免密码登录错误调试
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
这样简介的方式来连接服务器了。