我在我的Linux环境中有一个示例sh
脚本,它基本上运行当前shell的ssh-agent
,添加一个密钥并运行两个git命令:
#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa
git -C /var/www/duvdevan/ reset --hard origin/master
git -C /var/www/duvdevan/ pull origin master
脚本实际上工作得很好,但每次我运行它时,我都会得到一个新的进程,所以我认为它可能会成为一个性能问题,我可能最终会有一些无用的进程。
输出示例:
Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)
此外,还可以找到一个现有的ssh-agent
进程并将我的密钥添加到其中吗?
发布于 2016-11-11 22:16:53
如果您想在脚本退出后立即终止它,只需在eval行后面添加以下内容:
trap "kill $SSH_AGENT_PID" exit
或者:
trap "ssh-agent -k" exit
在ssh-agent -s
的求值中设置$SSH_AGENT_PID
。
您应该能够通过扫描整个ssh-agent
找到正在运行的/tmp/ssh-*
,并从中重新构造SSH_AGENT
变量(SSH_AUTH_SOCK
和SSH_AGENT_PID
)。
发布于 2018-04-21 11:40:31
ps -p $SSH_AGENT_PID > /dev/null || eval "$(ssh-agent -s)"
单行命令。第一次运行将启动ssh-agent。第二次运行不会启动ssh-agent。简单而优雅的伴侣!
发布于 2019-08-05 11:38:50
使用$SSH_AGENT_PID
只能测试ssh-agent
,但在尚未添加时会遗漏身份
$ eval `ssh-agent`
Agent pid 9906
$ echo $SSH_AGENT_PID
9906
$ ssh-add -l
The agent has no identities.
因此,使用如下示例中的expect script用ssh-add -l
检查它将会被保存:
$ eval `ssh-agent -k`
Agent pid 9906 killed
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-add -l &>/dev/null
$ [[ "$?" == 2 ]] && eval `ssh-agent`
Agent pid 9547
$ ssh-add -l &>/dev/null
$ [[ "$?" == 1 ]] && expect $HOME/.ssh/agent
spawn ssh-add /home/user/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa:
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)
因此,当ssh-agent
和ssh-add -l
都在bash脚本上运行时:
#!/bin/bash
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent`
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent
然后,它将始终检查并确保连接正在运行:
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)
您还可以使用do while模拟上述脚本中的重复命令
https://stackoverflow.com/questions/40549332
复制相似问题