前几天在公司看到有人使用"ssh-agent /bin/bash -c ‘ssh-add ~/.ssh/identity; git pull sth‘"这样的命令从gitlab上面拉应用.第一次见到这样的使用感觉好高端啊!(其实是本人孤陋寡闻了),于是抱着好奇的心使用man科普一下(这里装了一下逼,md结果什么都没看懂,这逼装得真失败还是直接百度吧),找到了两篇介绍挺详细的文章.
http://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html
http://www.ibm.com/developerworks/cn/linux/security/openssh/part2/
这里简单的介绍一下两个命令:
1)ssh-agent
ssh-agent是一个用来托管基于rsa,dsa认证的ssh在客户端本地生成的私钥文件的一个daemon.我们通过ssh-keygen -t dsa 在本地生成公,私密钥对时,会提示你输入私钥文件(默认为~/.ssh/id_rsa)的密码短语(当然你也可以选择不输入,但这样只要某个人拿到你的私钥文件他就可以直接免密码登录你的ssh服务器,因此存在一定的安全隐患),输入一长串的密码后结束. 这样每当你使用ssh连接远程时都要求你输入本地私钥的密码短语. 那么问题来了,我们使用rsa,dsa认证很多时候的目的都是为了免认证交互,绕了这么一大圈还是回到了原点.不用急,ssh-agent的出现就是为我们解决这样问题的,它会在本地缓存着你解密后的私钥,当使用ssh远程连接时,它会先从ssh-agent的高速缓存中检查私钥是否存在,如果存在就直接拿出来用就可以了,不在需要输入密码的交互
2)ssh-add
ssh-add是用来把你解密后的私钥加到ssh-agent的.既然要解密私钥那么使用该命令的时候当然要输入密码短语了,但只要输入一次密码之后,以后就不需要使用这个命令了.这就所谓的一次输入,多次使用
下面是使用例子:
eval `ssh-agent`
ssh-add [保存私钥的路径] #默认会查找~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 和 ~/.ssh/identity
注意点:
ssh-agent命令只会在当前终端生效,这意味着你每次打开一个新的终端后都要重复上面的两个步骤,这也是十分蛋痛的事情,解决方法请参考上面的第二个连接.
ssh-agent [command]这样的方式打开ssh-agent,这样command将会作为ssh-agent的子进程执行,当command执行结束后,ssh-agent的socket也会自动关闭.这适用于ssh协议通信的客户端如上面的git命令.
原文地址:http://978538.blog.51cto.com/968538/1722288