Ssh 如何重新连接到分离的mosh会话?

Ssh 如何重新连接到分离的mosh会话?,ssh,Ssh,如何重新连接到分离的mosh会话或以其他方式摆脱 Mosh: You have a detached Mosh session on this server (mosh [XXXX]). i、 mosh的等价物是什么 screen -D -R 或者可能 screen -wipe 此外,在文档中哪里可以找到此答案?出于安全原因,您不能重新连接,请参阅 要终止分离的会话,请使用该消息中显示的PID编号(即“XXXX”部分)。例如,如果您看到-- 并可以运行以下命令: kill 12345 k

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

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
i、 mosh的等价物是什么

screen -D -R
或者可能

screen -wipe

此外,在文档中哪里可以找到此答案?

出于安全原因,您不能重新连接,请参阅

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

并可以运行以下命令:

kill 12345
kill <pid>
此外,要关闭所有mosh连接,您可以:

kill `pidof mosh-server`

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

令我惊讶的是,我使用CRIU()检查并重新启动了mosh客户端,它成功了

令人震惊

查找mosh客户的PID:

$ps-ef | grep mosh

然后,按照他们的说明安装CRIU

然后,像这样检查它:

$mkdir检查点

$sudo./criu dump-D checkpoint-tpid——shell作业

然后,恢复它:

$sudo./criu restore-D检查点--shell作业

而且,就在这里。你的客户回来了

然而,需要注意的一点是,如果你的笔记本电脑重新启动(这正是我们试图防止的),mosh会在客户端使用一个
单调的
时钟来跟踪时间,这在重新启动时不起作用。但是,这将不起作用,如果您的笔记本电脑完全崩溃,它将不起作用,因为mosh序列号将与检查点的版本不同步(二进制将恢复,但通信将停止)

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

镉莫斯

vim configure.ac

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

然后做:

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

/配置

制造

安装

之后,您的CRIU检查点mosh客户端会话将在重新启动后仍然有效


(显然,您需要编写一些内容来定期执行检查点,以便发挥作用。但是,这是读者的练习)。

除了Varta的回答之外,我还使用以下命令关闭除当前连接之外的所有mosh连接:


pgrep-mosh server | grep-v$(ps-o-ppid-无头$$)| xargs kill

我意识到这是一篇老文章,但有一个非常简单的解决方案,正如mosh作者Keith Winstein所建议的:

“首先,如果您希望能够从多个客户端连接到会话(或在客户端死亡后),您应该使用screen或tmux。Mosh(在某些情况下)是SSH的替代品,而不是screen。许多Mosh用户将它与screen一起使用,并喜欢这种方式。”

场景:我通过mosh登录到远程服务器。然后我运行screen,并在screen会话中运行一个进程,例如htop。我失去连接(笔记本电脑电池耗尽、网络连接中断等)。我通过mosh再次连接,并在服务器上获取该消息

Mosh:您在此服务器上有一个分离的Mosh会话(Mosh[XXXX])

我所要做的就是取消之前的mosh会话

杀死XXXX

然后重新连接到屏幕会话,该会话仍然存在

屏幕-r


现在,htop(或任何正在运行的进程)恢复原状,没有中断。这对于运行升级或其他进程特别有用,因为如果突然中断,服务器将处于混乱、未知的状态。我假设你也可以用tmux做同样的事情,尽管我还没有尝试过。我相信这就是Annhilannic和eskhool的建议

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

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

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


注意,正如@Annihilannic所提到的,如果您在mosh会话中使用tmux/screen,那么在您终止mosh会话后,这些tmux/screen会话仍然存在。因此,您仍然可以连接到它们(这样,您就不会因为杀死mosh会话本身而损失太多)。

这里声称杀死
mosh服务器
是唯一的选择的答案基本上已经过时,因为我们可以使用
criu
reptyr
来恢复和重新连接任意进程

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

在Michael R.Hines给出的
criu
答案旁边,有一个稍微“轻量级”的
reptyr
,可用于重新连接由
mosh服务器启动的进程(即不是
mosh服务器本身)。我通常使用

pstree -p <mosh-server PID>
将所需进程重新连接到当前终端。在对我关心的所有流程重复该过程后,我

kill -USR1 <mosh-server PID>
kill-USR1

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

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

使用以下命令终止mosh PID:

kill 12345
kill <pid>
@巧妙的机器人因为
kill -USR1 <mosh-server PID>
kill <pid>
kill `pidof mosh-server`