ssh-agent 行为的差异

tdk*_*2fe 3 scripting linux ssh ssh-agent

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

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

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

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

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

**编辑:我忘了指出代理确实持续运行,但服务帐户的 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
Run Code Online (Sandbox Code Playgroud)

Jen*_*y D 5

这里发生了两件事之一:

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

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

如果 ssh-agent 已死,则您需要一种方法来使其保持活动状态。以下是三种方法:

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

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