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

时间:2013-07-25 12:14:18

标签: ssh

如何重新连接到分离的mosh会话或以其他方式摆脱

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

即。

是什么?
screen -D -R

或可能

screen -wipe

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

7 个答案:

答案 0 :(得分:169)

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

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

Mosh: You have a detached Mosh session on this server (mosh [12345]).

可以运行此命令:

kill 12345

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

kill `pidof mosh-server`

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

答案 1 :(得分:20)

令我惊讶的是,我使用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客户端会话将在重新启动后继续存在。

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

答案 2 :(得分:11)

我意识到这是一篇很老的帖子,但是有一个非常简单的解决方案,正如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

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

  

screen -r

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

答案 3 :(得分:8)

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

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

答案 4 :(得分:4)

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

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

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

该命令取决于who列出连接用户(包括mosh会话),仅附加的mosh会话具有“via mosh”,以及mosh会话将其pid放在方括号中的事实。所以它找到了仅用于分离的mosh会话的pids,并使用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)

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

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

答案 5 :(得分:0)

这里的答案声称杀死mosh-server是唯一的选择,因为我们可以使用criureptyr恢复并重新附加任意进程。

更不用说如今,我们可以kill -USR1 mosh-server仅以一种干净安全的方式杀死分离的会话,而不必借助不安全的who输出或繁琐的命令来避免杀死我们自己的会话。

Michael R. Hines的criu回答旁边是“轻量级” reptyr,它可以用来重新附加由mosh-server开始的进程(即mosh-server本身)。我通常使用

pstree -p <mosh-server PID>

列出分离的mosh服务器下的进程树,然后

reptyr PID

将所需的过程重新连接到我的当前终端。对我关心的所有过程重复该过程之后,我

kill -USR1 <mosh-server PID>

我会小心地只杀死我知道属于我(共享系统)的会话。

答案 6 :(得分:0)

使用 ps 命令获取正在运行的任务的列表,或使用 ps -ef | grep mosh

使用以下命令杀死Mosh PID:

kill <pid>

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

请注意,如果您当前通过mosh连接,那么这也会断开您的连接

kill `pidof mosh-server`