我正在尝试创建一个 shell 脚本,除其他功能外,它还启动 ssh-agent 并向代理添加私钥。示例:
#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...
问题在于 ssh-agent 显然启动了 $SHELL 的另一个实例(在我的情况下是 bash),并且从脚本的角度来看,它执行了所有内容,而 ssh-add 及其下面的任何内容都不会运行。
我怎样才能从我的 shell 脚本运行 ssh-agent 并使其继续沿着命令列表前进?
答案1
ssh-agent 应该启动一个会话,当它完成时,用户会话就结束了。因此 ssh-agent 之后的任何命令都可能在注销后执行。
您需要的是session-script
包含如下会话命令:
#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter
然后开始ssh-agent session-script
。
答案2
将以下内容放在脚本的顶部:
eval `ssh-agent`
你的脚本看起来应该像这样:
#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...
解释
周围的反引号ssh-agent
收集其输出。eval
收集该输出,将其连接到单个命令,然后执行该命令。然后您可以使用它ssh-add
来提供您的密钥凭证。
答案3
我倾向于在需要代理的脚本中做类似的事情。
#!/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 代替脚本启动新进程。启动代理,添加密钥,最后再次调用脚本(参见$0
)。
答案4
最好使用钥匙链在这种情况下
Debian / Ubuntu:
apt-get install keychain
RHEL/Fedora/CentOS
yum install keychain
在你的 .bashrc 中添加以下内容:
eval `keychain --eval id_rsa`