当前位置: 首页>>技术问答>>正文


ssh:自动接受密钥

, , ,

问题描述

我写了这个小实用程序脚本:

for h in $SERVER_LIST; do ssh $h "uptime"; done

将新服务器添加到$SERVER_LIST时,脚本将停止:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

我试过yes

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

没有运气。

有没有办法参数化ssh以自动接受任何新密钥?

最佳解决思路

使用StrictHostKeyChecking选项,例如:

ssh -oStrictHostKeyChecking=no $h uptime

这个选项也可以添加到〜/.ssh /config中,例如:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

请注意,如果主机密钥已更改,即使使用此选项,也会收到警告:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

如果您的主机不经常重新安装,您可以使用-oUserKnownHostsFile=/dev/null选项使其不太安全(但对于often-changing主机密钥更方便)。这将丢弃所有接收到的主机密钥,因此它永远不会生成警告。

次佳解决思路

您可以使用以下命令将服务器的指纹添加到known_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

注:替换< ip-address>和<主机名>用你想添加的服务器的IP和DNS名称。

唯一的问题是你最终会在你的known_hosts中有两次服务器。这并不是什么大事,只是提到。为确保没有重复,可以首先运行以下命令首先删除所有服务器:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

所以你可以运行:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

在删除re-add时要注意的一点是,您基本上将删除验证指纹的安全性。因此,在每次执行实用程序脚本之前,您肯定不希望运行此脚本。

第三种解决思路

对于这种响应,我迟了一点,但明智的做法是在运行正常运行时间采集之前在新机器上执行ssh-keyscan。

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

为了方便起见,禁用完整性检查听起来就像是一个糟糕的计划,即使您认为自己完全控制了环境。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/302.html,未经允许,请勿转载。