以下是我用来管理 ssh 代理设置的内容。
#!/bin/echo "Must source this:"
## Ensure that ~/.ssh/env contains valid values
unset SSH_AGENT_PID SSH_ENV_REFRESH
[ -r ~/.ssh/env ] && . ~/.ssh/env
[ -n "$SSH_AGENT_PID" ] || {
# No env file (or it's badly corrupted:
eval $(ssh-agent &>/dev/null) &> /dev/null
SSH_ENV_REFRESH=1
}
# Ping the agent process:
kill -0 "$SSH_AGENT_PID" >& /dev/null || {
# No process, so start a new one:
eval $(ssh-agent &>/dev/null) &> /dev/null
SSH_ENV_REFRESH=1
}
ssh-add -l &> /dev/null
[ "$?" -gt 1 ] && {
# Process alive but unable to be contacted
# for some reason (wedged/defunct process,
# or damaged/corrupt UNIX domain socket node?)
# So kill it:
kill "$SSH_AGENT_PID" >& /dev/null
# ... with extreme prejudice if necessary:
kill -0 "$SSH_AGENT_PID" >& /dev/null \
|| kill kill -9 "$SSH_AGENT_PID" >& /dev/null
# ... and start a new one
eval $(ssh-agent &>/dev/null) &> /dev/null
SSH_ENV_REFRESH=1
}
[ -z "$SSH_ENV_REFRESH" ] || {
# Over-write old env file:
printenv | grep "^SSH_A" > ~/.ssh/env
# Append export command:
echo "export SSH_AGENT_PID SSH_AUTH_SOCK" >> ~/.ssh/env
# Load the (null-passphrase) identites into the agent:
ssh-add < /dev/null &> /dev/null
}
它的目的是源自 ( . ~/lib/sshagent.sh
)~/.bashrc或其他登录或 shell 启动文件...甚至 cron 作业。它对我有用,但我希望这里的人们能够审查它并就我遗漏的任何极端情况提供建议。
我以前只从 ~/.bash_login 运行它...但后来我发现,在某些情况下,我的 shell 不会获取设置(X 显示管理器,我认为远程 ssh 非登录会话.. . 使用命令调用 ssh 的情况)。在其他一些情况下,当代理进程重新启动(无论出于何种原因)时,旧设置将持续存在且不会更新。所以我运行它~/.bashrc并尽量避免任何杂散输出...正如建议的那样~/.bashrc一般来说。
那么,是否存在任何明显的极端情况或错误?这对于类似的事情有意义吗/etc/bashrc?它是否可以合理地移植到其他 shell 上?
答案1
脚本中的一个可移植性问题是使用 来&> /dev/null
重定向 stdout 和 stderr。这是一种 bashism,不一定适用于其他 shell。 (我最近被这个咬了。)更便携的方法是使用> /dev/null 2>&1
.
答案2
你为什么要自己写?为什么不使用一个名为 的方便的花花公子小产品keychain
呢?
这是Gentoo 的钥匙串指南(可能是较新版本Funtoo 上的同一篇文章)
它基本上是一个小程序,允许您使用受密码保护的密钥,而无需始终键入密码。 (它应该在您使用的任何发行版上可用)
您可能还对 Gentoo 的 Open SSH Key Management 系列感兴趣:第1部分,第2部分, 和第 3 部分。看起来它包含了您正在尝试做的一些事情。