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

我已经尝试过$SERVER_LIST

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


没有运气。自动接受任何新密钥?

评论

Lekensteyn的回答是非常正确的,但是我只想指出,由于ssh期望“ yes”并且yes输出“ y”,因此$ SERVER_LIST中的h可能会更好。是是是| ssh $ h“正常运行时间”;完成(请注意额外的“是”,它告诉“是”而非“ y”)。

#1 楼

使用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选项降低安全性(但对于经常更改的主机密钥来说更方便)。这将丢弃所有接收到的主机密钥,因此它永远不会生成警告。


对于18.04,有一个新的可能性:StrictHostKeyChecking=accept-new。来自man 5 ssh_config

If this flag is set to “accept-new” then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to “no” or “off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.


评论


这不是最佳解决方案,因为它绕过了内置安全工具。如果您的系统上有ssh-keyscan,则最好使用ssh-keyscan。

– Stefan Lasiewski
15年11月11日在19:06

@StefanLasiewski如果您位于不受信任的网络上,则它可以使中间人受到攻击。对于接受固定主机的新密钥,ssh-keyscan方法更为明智。对于具有动态/重用IP地址的受信任网络中的本地虚拟机和其他主机,所描述的方法足够好。

– Lekensteyn
2015年11月11日在22:49

只是为了阐明两种解决方案之间的区别:ssh-keyscan解决方案仅在运行ssh-keyscan一次时才容易受到中间人攻击。每次运行ssh时-oStrictHostKeyChecking = no解决方案都容易受到中间人攻击。

– ErikSjölund
16年8月25日在13:03



#2 楼

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

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


注意:用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


删除只是为了重新添加时要记住的一件事,实际上是在删除验证指纹的安全性。因此,您绝对不希望在每次执行实用程序脚本之前都运行此脚本。

评论


通过排序运行| uniq,然后在之后使用awk查找重复的主机,将使脚本能够检测已更改的主机并仅警告用户有关主机的信息,因为具有不同密钥的同一主机可能会带来麻烦

–Lennart Rolland
15年5月21日在19:52



您可能需要添加一条注释,-H哈希主机名和地址。

–大卫库伦(David Cullen)
16-10-7在19:27

当我在Ubuntu 18.04上运行ssh-keyscan时,我得到几种键格式的输出以及每种格式的不需要的注释。因为我只对添加ssh-rsa感兴趣,所以我使用:ssh-keyscan -t rsa -h HOSTNAME 2> / dev / null >>〜/ .ssh / known_hosts

–院长家庭
20 Dec 1'在22:14



#3 楼

我对这个响应有些迟,但是明智的方法是在运行正常运行时间之前在新计算机上执行ssh-keyscan。

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


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

评论


运行上面的命令而不实际检查主机密钥是否与您从带外获取的指纹相对应,很容易受到与StrictHostKeyChecking相同的攻击

– code_monk
17年4月4日在20:17

@code_monk:不,不是。我打开了一次失败的机会(接受来自错误主机的密钥要添加到已知主机)。 StrictHostKeyChecking否将允许其他机器重复接受。

– tink
17年4月4日在20:20

#4 楼

将此条目添加到~/.ssh/config文件中

Host *
    StrictHostKeyChecking no


如果它抱怨对~/.ssh/config的访问权限,则尝试

#5 楼

为了自动添加服务器列表,我们可以执行以下操作:

在文件servers-list

中添加服务器IP。IP应该以以下格式添加。 >
cat servers-list的输出

123.1.2.3
124.1.2.4
123.1.2.5


通过替换您的IP来更改上述IP。

以下命令将添加列表中的所有服务器。

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts


评论


如果删除-p61,这对于大多数人来说会更好,因为ssh通常不在端口61上侦听。

–院长家庭
20年12月1日在22:11