有没有一种简便的方法来确保来自给定用户(即我)的所有登录都使用相同的ssh-agent?我破解了一个脚本,使它大部分时间都可以正常工作,但是我一直怀疑我错过了某种方法。此外,自那时以来,计算机技术有了惊人的进步,例如本网站。
所以这里的目标是
- 每当我登录到该框时,无论它是通过SSH还是在从gdm / kdm / etc启动的图形会话中,还是在控制台上:
- 如果我的用户名当前没有
ssh-agent
运行,则启动,导出并ssh-add
调用环境变量。 - 否则,现有座席的坐标将导出到登录会话的环境变量中。
- 如果我的用户名当前没有
当所涉及的盒子在ssh
进入第三个盒子时用作中继点时,此功能特别有价值。在这种情况下,它避免了每次ssh进入然后想要执行git push
某事时都必须键入私钥的密码。
下面给出的脚本可以可靠地完成此任务,尽管它最近在X崩溃时崩溃了,然后我开始了另一个图形化会话。在这种情况下,可能还有其他问题。
这是我的好坏脚本。我从我的来源.bashrc
。
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
请告诉我,有一种更好的方法可以做到这一点。另外,请不要挑剔不一致/失误(例如,放入var
东西etc
);我前一阵子写了这篇,从那以后学到了很多东西。