为了简化 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/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

修改 ssh 配置文件

# 编辑 sshd_config文件
vi /etc/ssh/sshd_config

# 请留意 root 用户能否通过 SSH 登录
# PermitRootLogin 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 "^$"

3、客户端免密码登录服务器

现在 Client 客户机可以不用密码登入 Upgrade 远程服务机了。

ssh root@Upgrade_ip_148.135.123.140 -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