Dan*_*Dan 23 ssh shell bash ssh-agent shell-scripting
我正在尝试创建一个 shell 脚本,其中包括启动 ssh-agent 并向代理添加私钥。例子:
#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...
Run Code Online (Sandbox Code Playgroud)
问题在于 ssh-agent 显然启动了 $SHELL 的另一个实例(在我的情况下是 bash),从脚本的角度来看,它执行了所有内容,而 ssh-add 及其下面的任何内容都不会运行。
如何从我的 shell 脚本运行 ssh-agent 并让它在命令列表中继续移动?
sco*_*eus 20
将以下内容放在脚本的顶部:
eval `ssh-agent`
Run Code Online (Sandbox Code Playgroud)
您的脚本应如下所示:
#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...
Run Code Online (Sandbox Code Playgroud)
解释
周围的反引号ssh-agent收集其输出。eval收集该输出,将其连接成一个命令,然后执行该命令。然后您可以使用ssh-add来提供您的密钥凭据。
小智 12
ssh-agent 应该启动一个会话,当它完成时,用户会话就结束了。因此 ssh-agent 之后的任何命令都可能在注销后执行。
你想要的是一个session-script包含你的会话命令,如下所示:
#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter
Run Code Online (Sandbox Code Playgroud)
然后开始ssh-agent session-script。
我倾向于在需要代理的脚本中做这样的事情。
#!/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.
Run Code Online (Sandbox Code Playgroud)
基本上,脚本首先检查代理是否正在运行。如果它不是 exec 用于启动一个新进程来代替脚本。启动代理,添加密钥,最后再次调用脚本(参见$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
Run Code Online (Sandbox Code Playgroud)
我创建了 ssh-agent 进程,添加了密钥,做我需要做的事情,然后杀死它。以后无需检查它是否正在运行。
小智 5
在这种情况下最好使用钥匙扣
Debian/Ubuntu:
apt-get install keychain
Run Code Online (Sandbox Code Playgroud)
RHEL/Fedora/CentOS
yum install keychain
Run Code Online (Sandbox Code Playgroud)
在 .bashrc 中添加以下内容:
eval `keychain --eval id_rsa`
Run Code Online (Sandbox Code Playgroud)