使用ssh 密钥,为了安全起见,最好要给私钥设置一个复杂的密码,但是我们每次使用的时候又要输入该密码,非常麻烦。使用ssh-agent就避免了每次使用密钥的时候输入密码的麻烦,只需要在本次开机第一次打开bash的时候需要输入私钥的密码。
SSH Config
我们推荐使用ssh config进行设置。在~/.ssh/config文件中写入如下内容:
Host * AddKeysToAgent yes UseKeychain yes
即表示对于所有主机都使用agent,并且使用钥匙串。除些之外,还可能再给每一个Host使用不同的key,设置别名、用户名、端口号等。详见ssh_config。
Mac
在Mac下,系统自带钥匙串,密码存储到钥匙串即可,不需要做任何设置。
Windows
使用Powershell
# Make sure you're running as an Administrator
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
使用bash
在Windows下,在~/.bashrc文件(如果没有就新建这么一个文件)中加入如下两行代码:
eval $(ssh-agent) ssh-add
该设置仅仅针对git bash有效,在其他应用中,更普遍的是使用putty的pageant(很多程序都支持),只是这需要使用putty的ppk密钥,和ssh的私钥略有不同。
Linux/(Windows WSL在~/.profile文件中添加)
在Linux下,在~/.bash_profile的后面追加如下代码:
# # setup ssh-agent # SSH_ENV="$HOME/.ssh/environment" function start_agent { echo "Initialising new SSH agent..." /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add # 此处默认添加~/.ssh/id_rsa,如果想添加其他的或者多个key可以再加 } # Source SSH settings, if applicable if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null #ps ${SSH_AGENT_PID} doesn't work under cywgin ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent } else start_agent fi
如果想在ssh退出时关闭ssh-agent,可以在~/.bash_logout添加如下代码
# ssh-agent
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
注意使用这种方法由于每次ssh退出登录时都会关闭agent,在多个ssh窗口间$SSH_AGENT_PID变量可能会不同步,可以执行source ~/.bashrc解决变量同步问题。