使用ssh-agent之前
使用ssh公钥认证的方式可以免去ssh客户端(如ssh命令、xshell等)连接远端主机sshd时需要输入对方用户密码的问题。
但如果执行ssh命令所在的主机上保存了多套秘钥且将各公钥分发给了不同的远端主机,这时即使使用了公钥认证,也依然需要输入密码,因为ssh客户端不知道要读取哪个私钥去和该远端主机上的公钥配对。
看下面这张图描述的情况:
上面描述的情形是这样的:ssh客户端要管理web server群,还要管理mysql server群,ssh客户端要为这两个群内的主机使用不同的密钥对。例如要连接web server群内的主机,使用~/.ssh/id_rsa_1这一套秘钥,连接mysql server群内的主机,使用~/.ssh/id_rsa_2这一套秘钥。
于是,将id_rsa_1.pub分发给web server群内的每个主机,将id_rsa_2.pub分发给mysql server群内的每个主机:
$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver1 $ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver2 $ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver3 $ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver1 $ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver2 $ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver3这一切进行的都很欢乐,但是一连接,发现还是要密码:
$ ssh root@webserver1 快输入 root@webserver's 密码:??? $ ssh root@mysqlserver1 快输入 root@mysqlserver's 密码:???这是因为ssh客户端连接webserver1的时候,除了默认会读取的规范私钥文件id_rsa(或其它秘钥类型)外,不会自动读取任何一个文件,同理连接mysqlserver1也一样。
正确的连接方式是指定连接时使用哪个私钥去配对:
$ ssh -i ~/.ssh/id_rsa_1 root@webserver1 $ ssh -i ~/.ssh/id_rsa_2 root@mysqlserver1好欢乐,终于连上了。但是真恶心,还要指定连接私钥。
不仅如此,如果私钥是加密(passprase)的,指定私钥的时候还得输入这个passprase密码。