Update: 因为Openssh 5.0p1已经具备更新公钥的功能,因此该脚本不再更新。 谢谢wirlfly的提醒
ssh是在Linux下最常用的工具,安全,小巧,且不失强大。
唯一的一个遗憾是,当需要连接的机器的公钥发生改变时,ssh并不会自动更新存储在本地($HOME/.ssh/known_hosts)的公钥,这个时候你需要手动更新。我的一般做法是删除该行。
而有些ssh工具具有自动更新公钥的能力,比如windows下常用的putty,pietty
我一直都认为ssh这个命令应该有这个功能,但是我都没有找到。我还记得pczou曾经给出过一个让ssh自动更新公钥的patch,可惜,每次OpenSSh升级,都需要重新编译,很麻烦。
于是写了下面的这个小脚本,用来方便添加新公钥,和修改已经更新的公钥。
脚本主要是利用了OpenSSH自带的ssh-keyscan命令。使用的参数和ssh使用时没有任何区别,实际上,最后是把你输入参数原封不动的传递给ssh命令,但是因为需要分析参数,主要要获得端口号(如果指定的话)和主机名(或者ip地址)。所以对参数的位置一些限制,主要是要求主机名或者ip地址这个参数一定是最后一个参数。
原因是我暂时还不知道如何从一堆的参数中识别出哪个是主机名(ip地址还好识别一点),端口号还是比较用以识别,因为他有一个-p打头的参数。所以我暂时的解决办法把这个参数放到最后。
这样我只需要使用eval host=$$#就可以得到主机名/IP地址了。如果大家能提供给我好的识别它的方法,那么这个限制就可以取消了。
另外就是保存在known_hosts文件里的主机名/IP地址不能采取加密的方式,我不知道其他发行办法默认是怎么样。我知道的红旗软件的各类发行版本默认不会加密,但是Ubuntu的会。
所以如果使用ubuntu的话,首先的修改/etc/ssh/ssh_config文件,把其中的
HashKnownHosts yes
注释掉或者改成no,然后保存。只所以这样,是因为我在bash下不知道如何hash一个字符串(对bash的了解还是很差劲的),如果有人告诉我如何hash一个字符串,那么这个限制也可以取消了。
最后一个是暂时只对RSA算法的公钥进行处理,对DSA的算法不理睬。当然,如果你一开始保存的是DSA算法的公钥,我还是会去处理的。我的做法是,如果当前要连接的主机公钥已经存在了,我会去查询你用的什么算法,是ssh-rsa,还是ssh-dss,然后根据这个算法扫描出需要连接的机器的公钥;如果不存在,我则直接采取RSA算法来扫描。
罗嗦了半天,还是贴出代码比较直观
File /Users/wgzhao/Sites/blog.wgzhao.com/source/downloads/code/akssh.sh could not be found
鉴于上次写的IP切换器脚本,没有写示例程序,导致很多人不知道用,真是失败,所以这次叫上示例。
下面的例子都是正确的做法(假定脚本名称是akssh):
$akssh usernam@22.24.56.66 $akssh -X -p 44 xplore.cn
下面的例子是不成功的,主要是没有把主机/IP地址放最后
$akssh username@22.24.56.66 -X
$akssh -p 44 xplore.cn -lroot