iniciar automaticamente a tela após o login do ssh

18

Eu tenho lido sobre como iniciar automaticamente uma tela quando eu estiver sshem um servidor remoto. Gostaria de adicionar uma linha simples ao meu .bash_profilepara iniciar screenquando entro sshe NÃO sair da minha conexão remota quando desconectar a tela.

Eu tenho procurado em exec screene praticamente todas as combinações de -d, -r, -De -Re não pode descobrir o que as bandeiras que eu preciso.

Idealmente, eu digitaria e faria ssh whateverlogin no servidor em um novo screenou ele poderá reconectar uma tela antiga. Gostaria de saber como fazer as duas coisas para ver qual eu gosto mais. Então eu posso digitar Ctrl adou Ctrl dme trazer de volta ao sshlogin normal para esse servidor (onde você veria o motd). A partir daí, posso screen -rvoltar para a tela que desejar ou clicar Ctrl dnovamente para sair.

Ronald Dregan
fonte

Respostas:

18

Um simples screen -Rdeve fazer o truque.

Para verificar isso, adicionei screen -Rao meu .bash_profile em um servidor remoto, efetuei logon, desconectado da tela e retornei a um prompt de shell normal no servidor remoto. Verificado com .bashrc também. Logins subsequentes produziram o resultado esperado (reconecte-se à sessão de tela).

btanaka
fonte
Obrigado! Eu estava lendo e tinha a impressão de que precisaria da tela executiva -R. Esta contente trabalhou
Ronald Dregan
É uma má idéia colocar logoutou exitlogo após essa linha que uma sessão ssh seja imediatamente encerrada quando a tela for fechada com ctrl + D?
Griddo
Isto não funcionou para mim. Comecei algumas dezenas de telas desde que a linha é executada toda vez que uma sessão é iniciada. Como você fez isso para que isso não acontecesse?
Thomas
10

Eu tive problemas com a criação de 40 sessões de tela em cascata com algumas das soluções ao iniciar uma nova janela ou sessão de tela. Consegui eliminar a tela em cascata e criar uma nova sessão se não existisse com isso:

if [ -z "$STY" ]; then screen -R; fi

Ele testa se você está em uma sessão de tela e é executado screen -Rse não estiver. Sem o teste, você obtém o "Anexando de dentro da tela?" aviso da tela toda vez que você cria uma nova janela da tela.

seq3
fonte
+1 - como este melhor do que o screen -lsteste que Tony mencionado
cwd
9

screen -RR reconectará à primeira sessão disponível ou criará uma, se necessário.

user1187902
fonte
isso foi realmente útil, pois o uso da tela -R estava causando problemas em várias sessões.
David V.
Isso é incrível, obrigado! Ele se conecta à primeira sessão "Desanexada" encontrada (se houver) e ignora as sessões anexadas. Portanto, ele permite que você faça login e tenha várias janelas abertas, mas ainda assim verifique se cada sessão tem a proteção de execução em uma tela. Nosso pessoal da OPS, obrigado!
Ian McGowan
8

Se eu entender sua necessidade, tente:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

Ele criará apenas uma sessão de tela, caso contrário, será reconectado à existente de uma maneira para várias janelas (mesmo se você tiver várias sessões ssh, você terminará na mesma sessão de tela)

Tony
fonte
Gosto dessa idéia pelo reconhecimento de que temos clientes SSH com várias janelas (ou, às vezes, entram e fazem login diretamente na máquina). É bastante flexível se você usar algo como Bitvise e tiver várias janelas de terminal abertas - você pode transformar janelas de tela individuais em janelas físicas separadas.
Piku
1
Tudo isso pode ser substituído por screen -xR, que parece ser analisado como "anexar se houver algo a que anexar, caso contrário, criar nova tela".
Piskvor saiu do prédio 03/01/19
0

Aqui uma pequena extensão,

o script para o bashrc verifica se há mais de uma sessão de tela desanexada. Se houver mais, escolha a sessão manualmente. Quando houver uma sessão desanexada, você voltará a esta sessão. Se você sair da sessão, a sessão ssh também será fechada.

 #Start Screen
 if [ -z "$STY" ]; then

 value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )

 if [ $value -gt 1 ]; then

  screen -ls

 else

  screen -R

  echo 5 Sek. bis die SSH Session beendet wird.

  echo Strg + C - um ohne screen weiter zu arbeiten.

  sleep 6

  exit

 fi

fi
Thomas
fonte
0

Se você deseja se conectar automaticamente a uma sessão de tela ao se conectar via SSH, adicione o código abaixo ao seu .bash_profileou ao seu .bashrcem sua máquina remota:

  • Inicie uma nova sessão de tela toda vez que você se conectar através do SSH.
  • Reutilize a sessão de tela desanexada já existente , sempre começando pela mais recente. Se nenhuma sessão desanexada disponível, inicia uma nova.
  • Ao abrir várias conexões SSH na sua máquina, você terá uma sessão de tela diferente, pois estamos reutilizando apenas as que estão desanexadas.
  • Evite loops caso esteja adicionando o script ao seu .bashrc

Aqui está o script:

#!/bin/bash
#
#  Attaches to the first Detached Screen. Otherwise starts a new Screen.

# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
  detached_screens=($(screen -ls | grep pts | grep -v Attached))

  for screen in "${detached_screens[@]}"; do
    if [[ "${screen}" == *".pts"* ]]; then
      IFS='.pts' read -ra split <<< "${screen}"
      for id in "${split[@]}"; do
        first_id="${id}"
        break
      done 
      break
    fi
  done

  screen -R $first_id
fi

PS: Se você deseja habilitar isso para o terminal local, remova && ! -z "${SSH_CLIENT}na primeira linha.

Nicolas Garnier
fonte