是否可以触发`ssh-add` 仅当我 ssh 进入盒子时? (来自赛格温)

是否可以触发`ssh-add` 仅当我 ssh 进入盒子时? (来自赛格温)

我已完成.bash_profile设置,eval $(ssh-agent)以便可以快速连接到服务器。如果我也添加ssh-add ~/.ssh/id_rsa_my_key到 my .bash_profile,我将必须在每个终端窗口中输入 ssh 密钥密码,即使我不打算使用该终端窗口登录服务器。

我可以创建一个别名,以便轻松键入该ssh-add ~/.ssh/id_rsa_my_key行(这样我就不必停止思考我要完成的任务,而是思考如何命名我的密钥),但我仍然必须请记住在 ssh 进入盒子之前执行此操作。

我习惯在 OS X 中工作,所有这些都几乎由钥匙串透明地处理,我就可以ssh离开,而不必考虑访问。我宁愿不必改变我的思维习惯,尽管我现在主要在 Windows 机器上工作。在 Windows 中,ssh-agent 一旦我死了

如果可以避免的话,我也不想使用 ssh 的别名或函数来执行此操作。我认为创建别名和函数来替换普通命令和程序是一个有点脆弱且有风险的解决方案:如果其他将来会出现问题,唯一的解决方案是替换ssh我的别名或(更有可能)函数变得更加复杂和脆弱。第三次越来越如此,等等。尽管如此,这可能成为唯一的解决方案。此外,为了发挥作用,该函数必须首先检查密钥是否已添加,否则我每次登录时都会添加它,这将一事无成。

是否ssh有一些设置可以自动执行此操作?有没有比添加ssh-add ~/.ssh/id_rsa_my_key到 my更好的解决方案.bash_profile

答案1

不要在任何 shell 启动脚本中添加任何内容,这是不必要的黑客行为。

相反,添加

AddKeysToAgent yes

到你的 .ssh/config

像这样,当您第一次 ssh 到另一个盒子时,ssh-add 会自动运行。仅当 ssh-agent 的密钥过期或重新启动后,您才需要重新输入密钥。

答案2

使用该选项使其始终使用相同的名称,而不是ssh-agent生成随机套接字名称。-a将此名称导出到SSH_AUTH_SOCK环境变量中。当您登录时,运行

rm -f "$SSH_AUTH_SOCK"
ssh-agent -a "$SSH_AUTH_SOCK"

这样您的所有终端都将连接到同一个代理。然后,您可以在登录时启动一个终端,该终端运行ssh-add并提示您输入密码,或者设置SSH_ASKPASSwin-ssh-askpassssh 本身将提示您输入密码。

答案3

当然,创建一个包装函数并将其放入您的.bashrc.

像这样的东西:

ssh () {
  ssh-add -l | grep 'The agent has no identities.' 2>&1 > /dev/null && ssh-add
  /usr/bin/ssh "$@"
}

尽管由于您使用的是 Cygwin,所以您将需要到达 ssh 真正所在位置的正确路径。

相关内容