Como reconectar a uma sessão mosh desanexada?

157

Como reconectar a uma sessão mosh separada ou me livrar de

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

ou seja, qual é o equivalente mosh de

screen -D -R

ou possivelmente

screen -wipe

Além disso, onde esta resposta pode ser encontrada na documentação?

John Baber-Lucero
fonte

Respostas:

197

Por motivos de segurança, não é possível reconectar, consulte https://github.com/keithw/mosh/issues/394

Para interromper a sessão desanexada, use o número PID exibido nessa mensagem (que é a parte 'XXXX'.) Por exemplo, se você vir -

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

E pode executar este comando:

kill 12345

Além disso, para fechar todas as conexões mosh, você pode:

kill `pidof mosh-server`

Observe que se você estiver atualmente conectado via mosh, este último comando também irá desconectá-lo.

varta
fonte
34
@artfulrobot Porque há uma chance de a sessão desanexada pertencer a um cliente mosh que ainda está vivo em algum lugar. As sessões do Mosh vagam e podem sobreviver através de um ciclo de suspensão / retomada (por exemplo, "Hibernação"). O problema que o mosh não resolve (e não pode facilmente) é detectar que a máquina do cliente foi reiniciada sem fechar normalmente a sessão do mosh.
binki
7
Existe uma razão para não fazer isso killall mosh-server? Especialmente porque pidof e killall são realmente a mesma coisa de qualquer maneira.
Jordânia
6
@ Jordan: Em alguns sistemas (Solaris, por exemplo), killallfaz exatamente o que diz.
Pausado até novo aviso.
4
Se você estiver conectado via mosh e executar killall mosh-server, será desconectado.
precisa saber é o seguinte
1
@ 0xcaff se você for conectar através de mosh e correr kill `pidof mosh-server`você vai ser retirado da mesma forma
David
26

Para minha surpresa, usei o CRIU ( https://criu.org ) para verificar e reiniciar um cliente mosh e funcionou.

Chocante.

Encontre o PID do seu mosh-client:

$ ps -ef | grep mosh

Em seguida, instale o CRIU de acordo com as instruções.

Em seguida, verifique-o assim:

ponto de verificação $ mkdir

$ sudo ./criu dump -D ponto de verificação -t PID --shell-job

Em seguida, restaure-o:

$ sudo ./criu restore -D ponto de verificação --shell-job

E aí está. Seu cliente mosh está de volta.

Uma coisa a ser observada, no entanto, é que, se o seu laptop for reiniciado (que é o objetivo principal do que estamos tentando proteger), o mosh usará um monotonicrelógio para rastrear o tempo no lado do cliente, o que não funcionará durante as reinicializações. Isso NÃO funcionará, no entanto, se seu laptop travar, ele não funcionará porque os números de sequência mosh estarão fora de sincronia com a versão que foi marcada (o binário será retomado, mas a comunicação será interrompida).

Para corrigir isso, você precisa dizer ao mosh para parar de fazer isso e baixar o código-fonte do mosh. Em seguida, edite este arquivo:

cd mosh

vim configure.ac

Em seguida, pesquise GETTIMEe comente essa linha.

Então faça:

autoreconf # ou ./autogen.sh se você o clonou pela primeira vez

./configure

faço

faça instalar

Depois disso, suas sessões mosh client com ponto de verificação CRIU sobreviverão às reinicializações.

(Obviamente, você precisará escrever algo para executar os pontos de verificação regularmente o suficiente para ser útil. Mas isso é um exercício para o leitor).

Michael Galaxy
fonte
1
Certifique-se de digitar 'CTRL-L' para atualizar a saída da tela após a restauração.
Michael Galaxy
6
Por pura curiosidade, há um benefício prático de restaurar a sessão do mosh client que estou perdendo? Eu corro o tmux no mosh e posso apenas reiniciar o mosh no cliente e reconectar o tmux ... existe um benefício em fazer isso além de ser legal (o que realmente é!)?
eskhool
1
A resposta longa: github.com/mobile-shell/mosh/issues/394 A resposta curta é sim: Não é necessário uma sessão tmux se o daemon mosh-server já estiver em execução no servidor de destino. Ele não apenas deixa mosh daemons pendurados, mas é outro conjunto de teclas que não devemos digitar em primeiro lugar.
Michael Galaxy
1
Mosh é um substituto (em alguns casos) para SSH, não para tela. quoth KeithW (mosh autor) no github
törzsmókus
19

Percebo que este é um post antigo, mas há uma solução muito simples para isso, conforme sugerido por Keith Winstein, autor do mosh, aqui: https://github.com/mobile-shell/mosh/issues/394

"Bem, primeiro, se você quiser se conectar a uma sessão de vários clientes (ou depois que o cliente morrer), use screen ou tmux. Mosh é um substituto (em alguns casos) para SSH, não para tela. Muitos usuários do Mosh o usam junto com a tela e gostam dessa maneira ".

Cenário: Estou conectado a um servidor remoto via mosh. Em seguida, executei a tela e tenho um processo em execução na sessão de tela, htop, por exemplo. Perco a conexão (a bateria do laptop acaba, a conexão de rede etc.). Eu me conecto novamente via mosh e recebo essa mensagem no servidor,

Mosh: você tem uma sessão Mosh desanexada neste servidor (mosh [XXXX]).

Tudo o que tenho a fazer é matar a sessão anterior do mosh

matar XXXX

e reconecte à sessão da tela, que ainda existe .

tela -r

Agora, o htop (ou qualquer outro processo em execução) está de volta exatamente como estava sem interrupção. Isso é especialmente útil para executar atualizações ou outros processos que deixariam o servidor em um estado desconhecido e confuso se interrompido repentinamente. Presumo que você possa fazer o mesmo com o tmux, embora eu não tenha tentado. Acredito que isso é o que Annihilannic e eskhool estavam sugerindo.

007
fonte
2
Esta é uma ótima resposta. Obrigado e sim, confirmei que funciona da mesma forma com o tmux.
laughing_man
10

Como complemento à resposta de Varta, uso o seguinte comando para fechar todas as conexões mosh, exceto a atual:

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

Alexander Burmak
fonte
Caso não haja uma sessão mosh antiga, o xkill lançará um erro. Melhor usopgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77 11/11/19
4

Como o @varta apontou, os proprietários do mosh são muito contra a recolocação de diferentes clientes por motivos de segurança. Portanto, se seu cliente se foi (por exemplo, você reiniciou o seu laptop), sua única opção é interromper as sessões.

Para matar apenas sessões desanexadas, você pode usar a seguinte linha (que eu tenho como um alias no meu .bashrc).

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

Esse comando depende do fato de que wholista usuários conectados, incluindo sessões mosh, apenas as sessões mosh anexadas têm "via mosh" e que as sessões mosh têm seu pid entre colchetes. Por isso, encontra os pids apenas das sessões mosh desanexadas e as transmite para matar usando xargs.

Aqui está um exemplo de whoresultado para referência:

$ 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)

Uma alternativa é usar a variável de ambiente mosh-server MOSH_SERVER_SIGNAL_TMOUT. Você pode configurá-lo para algo como 300 em sua .bashrcno lado do servidor . Então, se você fizer pkill -SIGUSER1 mosh-serverisso, ele matará apenas os servidores mosh que não foram conectados nos últimos 300 segundos (os outros ignorarão o SIGUSER1). Mais informações na página do manual mosh-server . Estou usando o comando acima porque, uma vez aliasado, parece mais simples para mim.

Observe, como mencionado por @Annihilannic, se você estiver usando o tmux / screen dentro de suas sessões mosh, essas sessões tmux / screen ainda estarão disponíveis depois que você terminar as sessões mosh. Então você ainda pode se apegar a eles (para não perder muito matando as próprias sessões do mosh).

studgeek
fonte
3

As respostas aqui alegando que matar mosh-serveré a única opção são em grande parte obsoletas, pois podemos usar criue reptyrrecuperar e anexar novamente processos arbitrários.

Sem mencionar que hoje em dia só podemos kill -USR1 mosh-servermatar sessões desanexadas de maneira limpa e segura, sem recorrer a whosaídas inseguras ou comandos pesados ​​para evitar matar nossa própria sessão.

Ao lado da criuresposta de Michael R. Hines, há um pouco mais "leve" reptyrque pode ser usado para anexar novamente os processos iniciados mosh-server(ou seja, não o mosh-serverpróprio). Eu normalmente uso

pstree -p <mosh-server PID>

para listar a árvore de processos no servidor mosh desanexado e, em seguida,

reptyr PID

para reconectar o processo desejado ao meu terminal atual. Depois de repetir o procedimento para todos os processos que me interessam, eu

kill -USR1 <mosh-server PID>

enquanto eu cuido de matar apenas as sessões que eu sei que são minhas (sistema compartilhado).

Irfy
fonte
Eu receboUnable to attach to pid 10103: Permission denied
rubo77 11/11/19
-1

Use o comando ps para obter a lista de tarefas em execução ou use ps -ef | grep mosh

Mate o PID mosh usando este comando:

kill <pid>

Além disso, para fechar todas as conexões mosh, você pode:

Observe que se você estiver atualmente conectado via mosh, isso também o desconectará

kill `pidof mosh-server`
Pankaj Chauhan
fonte