ssh-agent行为的差异

这似乎是我有两个帐户我configuration的ssh代理行为之间的差异。

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

现在,我想运行这个脚本作为服务帐户用户。 我创build了服务帐户,并生成密钥临时将loginshell设置为/ bin / bash。 我生成了我的密钥,删除了密码,并将身份添加到代理。

这种差异似乎与shell连接到代理的方式有关。 在我的用户帐户中,自从我开始testing(大约两周)以来,我不必重新启动代理。 但是,当我尝试运行服务帐户下的脚本时,我似乎不得不重新启动代理,每次添加标识,然后执行该工作。

理想情况下,我希望代理无限期地运行,并在脚本运行时自动重新连接服务帐户,这样我就不需要在脚本中pipe理进程。 我查看了每个帐户的configuration,找不到任何区别。 任何有识之士将不胜感激。

**编辑:我忘了指出,代理不断运行,但服务帐户的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. ssh-agent实际上是在注销时closures的
  2. ssh-agent仍在运行,但是你正在丢失关于它的PID和pipe道的信息

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

如果ssh代理已经死了,你需要一种方法来保持它的活着。 以下是三种方法:

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

如果ssh-agent没有死掉,但是你已经丢失了环境信息,那么确保当你启动它时,你需要把它的环境variables写到一个特定的文件中。 然后,login时,让你的shell源文件。

如果使用子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 ENVvariables运行可能会导致问题。 所以这是另一个需要检查的地方。