我如何重新连接到一个独立的mosh会话?

Joh*_*ero 147 ssh

我如何重新连接到一个独立的mosh会话或以其他方式摆脱

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
Run Code Online (Sandbox Code Playgroud)

也就是什么是mosh相当于

screen -D -R
Run Code Online (Sandbox Code Playgroud)

或者可能

screen -wipe
Run Code Online (Sandbox Code Playgroud)

此外,在文档中可以找到这个答案的位置?

小智 180

出于安全原因,您无法重新连接,请参阅https://github.com/keithw/mosh/issues/394

要终止分离的会话,请使用该消息中显示的PID编号(即'XXXX'部分.)例如,如果您看到 -

Mosh: You have a detached Mosh session on this server (mosh [12345]).
Run Code Online (Sandbox Code Playgroud)

并且可以运行此命令:

kill 12345
Run Code Online (Sandbox Code Playgroud)

此外,要关闭所有 mosh连接,您可以:

kill `pidof mosh-server`
Run Code Online (Sandbox Code Playgroud)

请注意,如果您当前通过mosh连接,则此最后一个命令也会断开您的连接.

  • @artfulrobot因为分离的会话有可能属于某个仍在某处的mosh-client.Mosh会话漫游并且可以通过暂停/恢复(例如,"休眠")周期生存.mosh没有(并且不能轻易)解决的问题是检测到客户端机器重新启动而没有正常关闭mosh会话. (33认同)
  • 想知道为什么莫什不会自己杀死它而不是发出警告...... (12认同)
  • 有没有理由不要"killall mosh-server"呢?特别是因为pidof和killall无论如何都是一样的. (7认同)
  • @Jordan:在某些系统(例如Solaris)上,`killall`确实*完全*它所说的. (6认同)
  • 如果你通过mosh连接并运行`killall mosh-server`,你将被断开连接. (3认同)
  • @0xcaff 如果你通过 mosh 连接并运行 `kill \`pidof mosh-server\` 你将被分离 (2认同)

Mic*_*nes 23

令我惊讶的是,我使用CRIU(https://criu.org)检查点并重新启动了一个mosh客户端并且它工作正常.

令人震惊的.

找到你的mosh-client的PID:

$ ps -ef | grep mosh

然后,根据他们的说明安装CRIU.

然后,检查点就像这样:

$ mkdir checkpoint

$ sudo ./criu dump -D checkpoint -t PID --shell-job

然后,恢复它:

$ sudo ./criu restore -D checkpoint --shell-job

而且,就是这样.你的mosh客户回来了.

然而,有一点需要注意的是,如果您的笔记本电脑重新启动(这是我们试图防范的全部内容),则mosh使用monotonic时钟跟踪客户端的时间,这在重新启动时无效.但这不起作用,如果您的笔记本电脑刚刚崩溃,它将无法工作,因为mosh序列号将与检查点的版本不同步(二进制文件将恢复,但通信将停止).

为了解决这个问题,你需要告诉mosh停止这样做并下载mosh源代码.然后,编辑此文件:

cd mosh

vim configure.ac

然后,搜索GETTIME并注释掉该行.

然后做:

autoreconf#或./autogen.sh,如果你刚刚第一次克隆它

./配置

使

make install

之后,您的CRIU-checkpointed mosh客户端会话将在重新启动后继续存在.

(显然你需要写一些东西来定期执行检查点才能有用.但是,这对读者来说是一种练习).

  • 出于纯粹的好奇心,恢复我失踪的mosh客户端会话是否有实际好处?我在mosh上运行tmux并且可以在客户端重新启动mosh并重新连接tmux ...除了它的酷之外还有其他好处(实际上真的是这样!)? (6认同)
  • _Mosh(在某些情况下)是 SSH 的替代品,而不是 screen._ [github 上的 keithw(mosh 作者)](https://github.com/mobile-shell/mosh/issues/394#issuecomment-15596586) (4认同)

小智 16

我意识到这是一个很老的帖子,但有一个非常简单的解决方案,正如Keith Winstein,mosh作者所建议的那样:https://github.com/mobile-shell/mosh/issues/394

"好吧,首先,如果你想要能够从多个客户端连接到一个会话(或者在客户端死亡之后),你应该使用screen或tmux .Mosh是SSH的替代品(在某些情况下),而不是屏幕.许多Mosh用户将它与屏幕一起使用,就像那样."

场景:我通过mosh登录了远程服务器.然后我运行屏幕并在屏幕会话中运行一个进程,例如htop.我失去连接(笔记本电脑电池死机,丢失网络连接等).我通过mosh再次连接并在服务器上获取该消息,

Mosh:你在这台服务器上有一个独立的Mosh会话(mosh [XXXX]).

我所要做的就是杀死之前的mosh会话

杀XXXX

重新连接到仍然存在的屏幕会话.

屏幕-r

现在,htop(或正在运行的任何进程)就像没有中断一样回来了.这对于运行升级或其他进程尤其有用,如果突然中断,服务器将处于凌乱的未知状态.我假设你可以用tmux做同样的事情,虽然我没有尝试过.我相信这就是Annihilannic和eskhool的建议.

  • 这是一个很好的答案.谢谢,是的,我确认它与tmux一样. (2认同)
  • 比已接受的答案更好的答案,谢谢。 (2认同)

小智 9

作为Varta答案的补充,我使用以下命令关闭除当前连接之外的所有mosh连接:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

  • 如果没有旧的 mosh 会话,xkill 将抛出错误。更好地使用`pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs Kill || echo“没有要杀死的活动会话”` (2认同)

Irf*_*rfy 7

mosh-server这里声称杀死是唯一选择的答案基本上已经过时了,因为我们可以使用criureptyr来恢复和重新附加任意进程。

更不用说现在我们只能kill -USR1 mosh-server以干净、安全的方式杀死分离的会话,而无需诉诸不安全的who输出或繁琐的命令来避免杀死我们自己的会话。

除了criuMichael R. Hines 的答案之外,还有稍微“轻量级”的内容reptyr,可用于重新附加由其启动的进程mosh-server(即不是其mosh-server本身)。我通常使用

pstree -p <mosh-server PID>
Run Code Online (Sandbox Code Playgroud)

列出分离的 mosh-server 下的进程树,然后

reptyr PID
Run Code Online (Sandbox Code Playgroud)

将所需的进程重新附加到我当前的终端。对我关心的所有流程重复该过程后,我

kill -USR1 <mosh-server PID>
Run Code Online (Sandbox Code Playgroud)

而我注意只终止我知道属于我的会话(共享系统)。


stu*_*eek 6

正如@varta 指出的那样,出于安全原因,mosh 所有者非常反对从不同客户端重新连接。因此,如果您的客户端不见了(例如,您重新启动了笔记本电脑),您唯一的选择就是终止会话。

要仅终止分离的会话,您可以使用以下行(我在我的 中将其作为别名.bashrc)。

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
Run Code Online (Sandbox Code Playgroud)

该命令取决于以下事实:who列出连接的用户,包括 mosh 会话,只有附加的 mosh 会话具有“via mosh”,并且 mosh 会话的 pid 位于方括号中。因此,它仅找到分离的 mosh 会话的 pid,并使用 xargs 将它们传递给 kill。

这是一个示例who结果供参考:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用 mosh-server 环境变量MOSH_SERVER_SIGNAL_TMOUT。您可以.bashrc服务器端将其设置为 300之类的值。然后,如果您执行 apkill -SIGUSER1 mosh-server它只会杀死在过去 300 秒内未连接的 mosh 服务器(其他服务器将忽略 SIGUSER1)。mosh-server 手册页中的更多信息。我正在使用上面的命令,因为一旦别名,它对我来说似乎更简单。

请注意,正如@Annihilannic 所提到的,如果您在 mosh 会话中使用 tmux/screen,那么在您杀死 mosh 会话后,那些 tmux/screen 会话仍然存在。所以你仍然可以附加到它们(所以你真的不会因为杀死 mosh 会话而损失太多)。