ssh-agent 行为存在差异

ssh-agent 行为存在差异

似乎我配置的两个帐户的 ssh-agent 行为之间存在一些差异。

我编写了一个简单的监控脚本来检查我们正在运行的一些虚拟机的可用性。我使用我的主要访问帐户进行了所有测试和调试。在此过程中,我生成了一个 SSH 密钥对,启动了 ssh-agent,并将身份添加到代理,以允许脚本无需密码即可进行 ssh 连接。

现在,我想以服务帐户用户的身份运行此脚本。我创建了服务帐户,并为了生成密钥而临时将登录 shell 设置为 /bin/bash。我生成了密钥,删除了密码,并将身份添加到代理。

差异似乎在于 shell 连接代理的方式。在我的用户帐户中,自从我开始测试(大约两周)以来,我还没有重新启动过代理。但是,当我尝试在服务帐户下运行脚本时,我似乎每次都必须重新启动代理,添加身份,然后执行工作。

理想情况下,我希望代理无限期运行,并让服务帐户在脚本运行时自动重新连接到它,这样我就不需要管理脚本中的进程了。我查看了每个帐户的配置,没有发现任何差异。任何见解都将不胜感激。

**编辑:我忘了指出代理确实在持续运行,但是服务帐户的 shell 进程似乎没有使用它,所以必须启动一个新的代理:

ovmmon   14043  0.0  0.0  53916   204 ?        Ss   May17   0:00 ssh-agent
ovmmon   14952  0.0  0.0  53916   204 ?        Ss   May17   0:00 ssh-agent

答案1

这里发生了以下两件事之一:

  1. 当你注销时,ssh-agent 实际上被关闭了
  2. ssh-agent 仍在运行,但你正在丢失有关其 PID 和管道的信息

您可以通过执行 ps -ef 并检查 ssh-agent 来检查是哪种情况。

如果 ssh-agent 已停止运行,您需要一种方法来使其保持运行。以下是三种方法:

  1. 您可以在服务器启动时从启动脚本启动 ssh-agent,并将输出回显到文件(具有适当的访问权限以防止被滥用)。如果您将密钥设为无密码,也可以从脚本中添加密钥。(显然,最后一部分仅在您连接的帐户在远程服务器上的权限非常有限时才可行)。然后让您的脚本从启动时创建的文件中读取 SSH 代理信息。
  2. 当您登录到服务帐户时使用屏幕;然后在启动代理后断开与屏幕会话的连接。
  3. 启动代理时使用nohup。

如果 ssh-agent 未死,但您丢失了环境信息,请确保在启动它时将其环境变量写入特定文件。然后,在登录时让您的 shell 获取该文件。

答案2

如果您使用子 shell 调用方法,ssh-agent 将在退出 shell 时终止。如果您使用 eval 方法,shell 将保持运行,直到手动终止。

看:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm

具体来说:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm#ch06-50031.html

另外,我知道从 cron ENV 变量运行时可能会导致问题。所以这是另一个需要检查的地方。

相关内容