使用ssh命令重新启动后关闭连接


18

我正在reboot -f远程使用命令来强制重新引导Unix计算机。问题是ssh连接长时间保持活动状态,我不知道为什么?我想在重启机器后立即关闭ssh连接,并返回到我的本地shell。我怎样才能做到这一点?请注意,没有-f标志的重新启动命令不起作用。


1
为什么不退出您的远程连接(Ctrl + D)并让服务器重新启动而又不必看着shell提示呢?
gertvdijk 2012年

如何在同一命令中执行此操作?
coffeMug ​​2012年

2
我找到了一个解决方案,可能也对其他人有所帮助。在启动ssh附带的命令后,我立即使用以下命令关闭了连接:ssh host“要在主机上运行的命令> / dev / null&”我不完全理解此命令强制连接到的原因。关闭完成,但至少对我有帮助。如果有人理解命令输出到/ dev / null的方向以及为什么它会终止ssh连接,那么如果他/她可以解释它会很好。:-)
coffeMug ​​2012年

ssh host“在主机上运行的命令> / dev / null&”
coffeMug ​​2012年

1
这不是对这个问题的答案,但无论如何还是有用的:SSH客户端具有一系列控制字符,这些字符可以用来杀死客户端。控制字符只能在换行符之后立即识别,因此请按Enter。然后例如~.终止会话。 Enter ~?以获得其他人的清单。
汤姆(Tom),

Answers:


22

该命令reboot -f从不返回(除非您没有导致重新引导的权限)。在发布时,SSH客户端正在等待做某事,这可能是:

  • SSH服务器通知客户端发生了需要引起注意的事情,例如,有一些输出要显示,或者远程命令已完成;
  • 客户端发生的一些事件,例如中继信号;
  • 触发计时器以使客户端发送保持活动消息(如果服务器未回复,则关闭连接)。

由于SSH服务器进程已终止,因此SSH客户端将不会死,直到计时器启动为止。

如果您运行ssh remotehost 'reboot -f >/dev/null &',那么将发生以下情况:

  1. 远程外壳程序将reboot在后台启动命令。
  2. 因为已经退出了服务器端shell命令,并且没有任何进程保持打开标准输出的文件描述符,所以SSH服务器关闭了连接。
  3. reboot命令使计算机重新引导。

但是,这并不可靠:根据时间的不同,步骤3可能会在步骤2之前发生。添加计时器使这种情况不太可能发生:

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

要绝对确保服务器端已承诺运行reboot,同时确保在通知客户端已提交之前实际上并未重新引导,则需要从服务器到客户端的附加通知。可以通过SSH连接输出,但是变得很复杂。


2
如果有人正在寻找一种方式来从远程主机(类似的解决方案)中做到这一点:(sleep 1 && sudo reboot &) && exit。括号产生一个子进程,该子进程等待一秒钟,然后启动重新启动。但是,主机进程立即终止ssh会话。我不是壳专家,但是到目前为止,这对我还是有用的。
Griddo

@Griddo效果很好,是一个简洁的小技巧。我喜欢它。感谢分享!
约书亚·品特

5

我发现此解决方案对我而言表现最佳。

-o "ServerAliveInterval 2"与您的ssh命令一起使用,如下所示:

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

所述选项使客户端每2秒通过安全通道戳服务器一次。最终,随着重新启动的进行,它将停止响应,并且客户端将断开连接。


谢谢罗曼,像魔术一样工作!:)
stdcerr

3

一些答案很接近,但是正确的答案是:

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

说明:

  • 你想要 exit作为最后一条命令,因此最后一条命令的状态为0(成功)。您可以根据需要睡个好觉,但这不是必需的
  • 您需要在后台运行重新启动,因为否则服务器将关闭连接并收到错误消息。它仍然可以在大多数系统上重新启动,但是如果您正在编写脚本,则即使命令正确执行,返回状态也将是错误(不是0)。
  • 在后台运行还不够,因为stdinstdout仍然通过SSH连接到虚拟终端,因此连接不会关闭。您需要完成两项额外的操作,以使SSH会话结束并在后台运行命令。
    • 1)您需要重定向stdoutstderr/dev/null使他们不被保存SSH会话虚拟终端重定向。这是&>/dev/null一部分。
    • 2)您需要以stdin相同的方式重定向到无法读取的文件。那就是shell内置的nohup功能。

只有在终端上以各种方式在后台运行命令时,该命令exit才能关闭会话,并且由于虚拟终端上没有任何内容stdinstdout剩余虚拟端口,SSH将无错误地终止连接。


1

我使用以下命令:

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

这是在做什么:

  • 它指示计算机在下一次重新启动,但不在此命令期间重新启动
  • 从SSH干净退出
  • 始终保持SSH TTY,因此sudo很高兴并且可以正确执行。

0

您是否尝试过以下

# shutdown -r now

我发现在通过测试的某些系统上,reboot命令存在一些问题。再一次,我在shutdown的联机帮助页中找不到与使用-f标志重新启动相同的功能。


1
是的,由于某些奇怪的原因,关机在我尝试连接的计算机上不起作用。这就是为什么我使用reboot -f强制关闭并重新启动的原因。
coffeMug ​​2012年


0

我为此找到了解决方案,这可能也对其他人有所帮助。在启动ssh附带的命令后,我使用以下命令关闭连接:

ssh host "command to run on the host machine > /dev/null &"

我不完全理解为什么该命令强制关闭连接的原因,但至少对我有帮助。如果有人明白为什么它会终止ssh连接;请解释。


0

这需要1分钟的延迟,但已经为我可靠地工作,并解决了SSH客户端挂起的问题:

    $ sudo shutdown +1; logout

这样可以将系统关机时间安排在1分钟后,这样就可以有时间注销,从而完成SSH终止。如果你要等待的时间越少越好,你可以更换+1HH:MM了一天的迅速到来,但时间可能会非常棘手的时间正确,可能有多达59秒的延迟。


0

我发现一种简单的方法是将关闭/重新启动作为后台任务(使用'&')命令,以防止当会话以'nohup'结束并立即退出shell /会话退出时关闭它:

nohup shutdown -r now & exit

这样,SSH客户端不会挂起,因为会话会立即退出,而远程系统将以异步方式重新启动。


或将系统的等效项替换为“ shutdown -r now”以重新启动..
MikeW

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.