Como posso me reconectar a uma sessão ssh após um cano quebrado?

21

Então, eu estava rodando apt-get upgrade em um servidor quando o roteador decidiu que fazia tempo demais desde a última vez que me irritou: Ele descartou toda a conexão. A moral da história é usar muito screen quando você está em um roteador ruim.

De qualquer forma, eu entrei e encontrei no htop que o processo ainda estava pendurado lá, ainda esperando meu Y / n atualizar (ainda não tinha acertado, felizmente). Existe alguma maneira que eu possa recolocar em uma sessão que foi interrompida? Acabei apenas matando-o, pois não estava no meio do gerenciamento de pacotes, mas seria ótimo saber para referência futura.

    
por hexafraction 22.09.2012 / 05:49

3 respostas

14

A resposta à sua pergunta é: você não pode . Eu acho que o principal problema é que os procedimentos de autenticação estarão fora de sincronia. Só não funciona assim.

Como você mesmo notou, a solução é usar a tela quando possível (a propósito, o tmux é uma alternativa à tela) .

    
por January 28.09.2012 / 12:11
8

Para executar processos de longa duração, eu uso tela ou byobu se você quiser uma interface mais amigável.

Para a tela, você pode usar:

screen [program] [args]

Isso executará [program] e seus [args] dentro de uma sessão screen . Quando o programa terminar, a sessão é automaticamente fechada. Se você deseja manter a sessão após a execução do programa, basta executar a tela sem nenhum argumento e um novo prompt aparecerá dentro da sessão. CTRL + A + D separa o terminal da sessão atual.

Para anexar novamente a uma sessão anterior:

screen -r

Se houver apenas uma sessão aberta, ela será reconectada imediatamente. Se várias sessões estiverem em andamento, ele perguntará para qual delas você deseja anexar. Se você souber o nome da sessão, basta adicioná-lo como um argumento a essa linha de comando.

Byobu é uma boa melhoria. Ele é baseado na tela , mas fornece uma barra na parte inferior que mostra todas as sessões atuais como guias e fornece atalhos mais fáceis para contorná-las. Você pode:

  • F2 inicia uma nova sessão
  • F3 passa para a próxima guia da sessão à esquerda
  • F4 passa para a próxima guia da sessão à direita
  • F8 fornece um nome amigável para a guia da sessão atual
  • F9 abre um menu de opções
  • CTRL + A + D desanexa todas as sessões do terminal.

PALAVRA DE CONSELHO : evite deixar uma sessão aberta com o usuário root . Se alguém obtiver acesso ao seu terminal (local ou remotamente), ele poderá se reconectar facilmente a uma sessão em andamento e usar seu sistema como root. Se necessário, é melhor iniciar uma sessão usando um usuário comum e as linhas de comando indivudual de sudo conforme necessário.

    
por JulioHM 27.09.2012 / 23:44
4

Embora não seja possível reconectar a uma sessão SSH quebrada, você pode reparar o processo executado internamente - funcionalmente equivalente ao que você deseja.

No seu caso, você assumiria o processo apt-get a ser controlado a partir de uma nova sessão SSH, screen sessão ou algo semelhante. Meu favorito para isso é o comando reptyr :

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Depois, com o pid que você encontrou para o seu processo:

$ reptyr 10626

Após este estágio, toda a entrada do seu teclado vai para o programa que você assumiu. Infelizmente, você não verá a saída antiga da sessão SSH, como a saída apt-get solicitando sua confirmação.

Existem várias outras ferramentas que basicamente funcionam da mesma forma que reptyr (ou seja, via ptrace debug attachment). Veja as seguintes perguntas e respostas onde elas são discutidas:

(Detalhes: O motivo pelo qual você não pode assumir uma sessão SSH dessa forma é porque um processo sshd não é controlado por um terminal host, em vez disso fornece a parte escrava de um terminal - um pts device - enquanto a parte mestra que o controla reside na máquina do cliente, aqui com uma sessão SSH quebrada no meio.Quando você forçar a assumir tal processo sshd com reptyr -s <pid> , sua entrada de teclado vai para esse processo, não o seu processo filho ativo. Então, um "Ctrl + Z" simplesmente irá matar esse sshd .)

    
O
por tanius 16.02.2017 / 15:12

Tags