我正在尝试创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