Mic*_* H. 9 linux command-line gnu-screen ssh-agent
不久前在 StackOverflow 上,我问了这个关于 ssh-agent 和 crontab 的问题。我现在有一个关于 Linux 系统上的 ssh-agent 和 screen 的类似问题。
所以,在我的 Mac 上,ssh-agent 在系统启动时启动,所以我总是可以使用它。如果我使用的是 X-Windows,我认为在我的 linux (redhat el5/fedora) 下是正确的。但是,这是一台远程服务器机器,我总是通过 ssh 登录。
我希望正确设置 ssh 密钥,这样我就不必在 svn 更新或提交期间多次输入密码。我很高兴在每个会话中输入一次我的密码,并且我不鼓励我们的团队使用无密码的 ssh 密钥。
在短暂的闪光时刻,似乎在我的 .bash_profile 中执行“eval `ssh-agent -s`”,并在我注销时与一个命令杀死 ssh-agent 配对,会起作用。但是,我们大量使用screen来管理长时间运行的交互式程序和开发环境。如果您像我刚刚描述的那样启动和停止 ssh-agent,那么当您退出终端时它会被杀死,并且屏幕的子会话(曾经指代该 ssh-agent 实例)将被放弃。
那么......我怎么能成为一个控制台用户,谁使用屏幕,谁使用他的 ssh 密钥的密码,谁不必经常输入密码?
通过以下设置,您将不需要任何包装器来调用screen. 此外,它避免使用/tmp(随之而来的安全风险)。
确保您有 ~/tmp 目录:
mkdir ~/tmp
Run Code Online (Sandbox Code Playgroud)添加到.screenrc以下行:
setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
ssh看起来的位置)链接到真实位置,并且必须在启动后出现ssh-agent。[ -n "$SSH_AUTH_SOCK" ]将正确防止错误。SSH_AUTH_SOCK[ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]如果 screen 来源 ,将阻止屏幕会话将 $HOME/tmp/ssh-agent-screen 链接到自身.bash_profile。ssh-agent。.bash_profilessh -A完成此设置后,您就可以使用标准屏幕命令。您只需要重新创建现有会话或手动将其中的 SSH_AUTH_SOCK 设置为步骤 2 的固定位置。
这个想法归功于该网站;我避免使用/tmp.
这个答案类似,但使用了额外的别名。
您可以从 initscript 而不是启动 ssh-agent 吗.bash_profile?例如,我可能会放
su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername
Run Code Online (Sandbox Code Playgroud)
/etc/conf.d/local尽管 RHEL/Fedora 可能使用不同的系统,但在适当的部分。正如您在评论中指出的那样,终端会话需要能够连接到代理,这就是该命令.ssh_agent_env在用户主目录中创建文件的原因。然后你可以添加
[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null
Run Code Online (Sandbox Code Playgroud)
在.bash_profile。
您可以做的另一件事是将以下内容放入.bash_profile
ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null
Run Code Online (Sandbox Code Playgroud)
ssh-agent仅当它尚未运行时才会启动。那你就不用杀了它。
作为第二个建议的稍微不同的替代方案,您可以检查文件是否存在ssh-agent,而不是检查进程是否存在~/.ssh_agent_env,
[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null
Run Code Online (Sandbox Code Playgroud)
如果一切正常,两种方式之间不应该有任何显着差异。
| 归档时间: |
|
| 查看次数: |
4667 次 |
| 最近记录: |