不久前,我在 StackOverflow 上问过关于 ssh-agent 和 crontab 的这个问题。我现在对 Linux 系统上的 ssh-agent 和 screen 也有类似的问题。
因此,在我的 Mac 上,ssh-agent 会在系统启动时启动,因此它始终可用。如果我使用 X-Windows,我认为在我的 Linux(redhat el5/fedora)下也是如此。但是,这是一台远程服务器计算机,我总是通过 ssh 登录。
我希望 ssh-keys 能够正确设置,这样我就不必在 svn 更新或提交期间多次输入密码。我很乐意在每个会话中输入一次密码,并且我不鼓励我们的团队使用无密码的 ssh-keys。
有那么一瞬间,我似乎觉得在我的 .bash_profile 中执行“eval `ssh-agent -s`”并配合一个在我注销时关闭 ssh-agent 的命令就可以了。然而,我们大量使用屏幕为了管理长时间运行的交互式程序和开发环境。如果您按照我刚才描述的方式启动和停止 ssh-agent,那么当您退出终端时它会被终止,并且曾经引用该 ssh-agent 实例的屏幕子会话将被放弃。
那么...我怎样才能成为一个使用屏幕的控制台用户,使用带有 ssh 密钥的密码,而不必不断输入密码?
答案1
使用以下设置,您不需要任何包装器来调用screen
。此外,它避免使用/tmp
(从而带来安全风险)。
确保您有一个 ~/tmp 目录:
mkdir ~/tmp
添加
.screenrc
以下行:setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
- 这确保了在内部
screen
始终ssh
在相同的位置寻找套接字,而不是在不断变化的路径上。 - 您必须使用
setenv
您所使用的任何 shell,因为它是一个屏幕而不是 shell 命令。
- 这确保了在内部
添加
.bash_profile
以下行:[ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
- 这将从固定位置(外观
ssh
)链接到真实位置,并且必须出现后开始ssh-agent
。 - 使用
[ -n "$SSH_AUTH_SOCK" ]
将正确防止SSH_AUTH_SOCK
未设置时出现错误。 [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]
如果屏幕来源,将阻止屏幕会话将 $HOME/tmp/ssh-agent-screen 链接到其自身.bash_profile
。
- 这将从固定位置(外观
- 您可以考虑使用 来连接,而不是从 启动
ssh-agent
(以使用代理转发并让远程机器使用您的代理)。.bash_profile
ssh -A
完成此设置后,您就可以使用标准屏幕命令。您只需重新创建现有会话或手动将其中的 SSH_AUTH_SOCK 设置为步骤 2 的固定位置。
答案2
你能从 initscript 启动 ssh-agent 吗.bash_profile
?例如,我可能会输入
su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername
在 的相应部分/etc/conf.d/local
,尽管 RHEL/Fedora 可能使用不同的系统。正如您在评论中指出的那样,终端会话需要能够连接到代理,这就是该命令.ssh_agent_env
在用户主目录中创建文件的原因。然后您可以添加
[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null
在.bash_profile
。
您可以做的另一件事是将以下内容放入.bash_profile
ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null
ssh-agent
仅当它尚未运行时才会启动。这样您就不必将其终止。
与第二个建议稍有不同的是,ssh-agent
您可以检查文件是否存在,而不是检查进程是否存在~/.ssh_agent_env
,
[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null
如果一切正常,这两种方式之间应该不会有任何显著的差异。
答案3
查看钥匙链。它可以完成上述所有操作。请特别注意--clear
和--timeout
选项。
答案4
跟进 ssh 代理转发,您会发现,一旦您注销、重新登录并重新连接到您的会话,转发的 ssh 凭据将默认不可用于您的屏幕会话。
不过,您可以通过让屏幕将 SSH_AUTH_SOCK 环境变量设置为某个众所周知的内容,并将该众所周知的位置更新为您当前的身份验证套接字,来解决此问题。
我使用这个 shell 函数重新进入屏幕并修复 ssh auth sock:
function sr () {
if [ ${+STY} = 1 ] ;then
echo already in screen\!
else
if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
if [ ! -d /tmp/screenssh ]; then
mkdir /tmp/screenssh
fi
rm -f /tmp/screenssh/socket
ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
echo $REMIP > /tmp/screenssh/remip
fi
screen -DR
fi
}
我的 .screenrc 中有这个:
setenv SSH_AUTH_SOCK /tmp/screenssh/socket
希望这可以帮助。