Ssh 如何重新连接到分离的mosh会话?
如何重新连接到分离的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: 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`