我正在reboot -f
远程使用该命令来强制重新启动 Unix 机器。问题是 ssh 连接长时间保持活动状态,我不知道为什么?我想在重新启动机器后立即关闭 ssh 连接并返回到我的本地 shell。我怎样才能做到这一点?请注意,没有-f
标志的重启命令不起作用。
Gil*_*il' 22
该命令reboot -f
永远不会返回(除非您无权导致重新启动)。在发出时,SSH 客户端正在等待执行某些操作,这可能是:
由于 SSH 服务器进程已死,SSH 客户端不会死,直到计时器启动。
如果你运行ssh remotehost 'reboot -f >/dev/null &'
,那么会发生什么:
reboot
在后台启动命令。reboot
命令会导致机器重新启动。然而,这并不可靠:根据时间的不同,第 3 步可能会在第 2 步之前发生。添加一个计时器使得这不太可能:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
Run Code Online (Sandbox Code Playgroud)
为了绝对确定服务器端已承诺运行reboot
,同时确保在通知客户端它已提交之前它实际上不会重新启动,您需要一个额外的通知从服务器到客户端。这可以通过 SSH 连接输出,但它变得复杂。
Rom*_*jev 11
我发现这个解决方案最适合我。
-o "ServerAliveInterval 2"
与您的ssh
命令一起使用,如下所示:
$ ssh -o "ServerAliveInterval 2" root@remotehost reboot
Run Code Online (Sandbox Code Playgroud)
所述选项使客户端每 2 秒通过安全通道戳服务器。最终随着重新启动的进行,它将停止响应并且客户端将断开连接。
小智 7
有些答案很接近,但正确的答案是:
ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"
Run Code Online (Sandbox Code Playgroud)
解释:
exit
作为最后一个命令,因此最后一个命令的状态为 0(成功)。如果你愿意,你可以预先准备一个睡眠,但这不是必需的stdin
和stdout
仍然通过 SSH 连接到虚拟终端,所以连接不会被关闭。您需要为 SSH 会话做两件额外的事情来结束并让命令在后台运行。
stdout
和stderr
到,/dev/null
因此它们不会被保存 SSH 会话的虚拟终端重定向。这是&>/dev/null
部分。stdin
相同的方式重定向到不可读的文件。这就是 shell 内置nohup
函数的作用。仅在后台运行的命令以各种方式与终端分离,exit
将关闭会话,并且由于虚拟终端上没有stdin
或stdout
剩余,SSH 将终止连接而不会出错。