从shell脚本运行ssh-agent

我正在尝试创build一个shell脚本,其中包括启动ssh-agent并将私钥添加到代理。 例:

#!/bin/bash # ... ssh-agent $SHELL ssh-add /path/to/key # ... 

这个问题是ssh-agent显然开始了$ SHELL的另一个实例(在我的情况下是bash),并且从脚本的angular度来看,它执行了所有的事情,并且ssh-add从来没有运行过。

我怎样才能从我的shell脚本运行ssh-agent并保持它在命令列表上移动?

ssh-agent应该开始一个会话,当它完成时,用户会话结束。 所以在注销之后,可能会执行ssh-agent之后的任何命令。

你想要的是一个包含会话命令的session-script ,如下所示:

 #!/bin/bash ssh-add /path/to/key bash -i # or other session starter 

然后启动ssh-agent session-script

将以下内容放在脚本的顶部:

 eval `ssh-agent` 

你的脚本应该是这样的:

 #!/bin/bash eval `ssh-agent` ssh-add /path/to/key ... ... 

说明

ssh-agent周围的反引号收集它的输出。 eval收集该输出,将其连接成单个命令,然后执行该命令。 然后你可以使用ssh-add来提供你的密钥凭据。

我倾向于在需要代理的脚本中做这样的事情。

 #!/bin/bash # if we can't find an agent, start one, and restart the script. if [ -z "$SSH_AUTH_SOCK" ] ; then exec ssh-agent bash -c "ssh-add ; $0" exit fi ... and so on. 

基本上,脚本首先检查代理是否正在运行。 如果不是exec,则用来启动一个新的进程来代替脚本。 代理启动,添encryption钥,最后再次调用脚本(请参阅$0 )。

我发现这对我有用。

 eval `ssh-agent` # create the process ssh-add ~/.ssh/priv_key # add the key git -C $repo_dir pull # this line is the reason for the ssh-agent eval `ssh-agent -k` # kill the process 

我创build了ssh-agent进程,添encryption钥,做我需要做的,然后杀死它。 不需要检查它是否运行。

在这种情况下使用钥匙链更好

于Debian / Ubuntu:

 apt-get install keychain 

RHEL / Fedora的/ CentOS的

 yum install keychain 

在您的.bashrc中添加以下内容:

 eval `keychain --eval id_rsa` 

我发现在Zoredache的解决scheme中,任何发生与共享与调用脚本的shell相同的ssh-agent的shell都可以使用该密钥。 我想避免这种情况,需要根访问远程机器的脚本,出于明显的安全原因。

我发现把下面的shebang放在脚本的顶部:

 #!/usr/bin/ssh-agent bash ssh-add /path/to/ssh-key ssh root@remotehost "remote commands" 

我试了很多,最终解决scheme是用空stringreplace我的密码。

 ssh-keygen -p