Como usar efetivamente a tela e o SSH?

12

Gostaria de configurar o SSH e a tela de modo que um login sempre seja anexado a uma sessão de tela. O ideal é que essa sessão não saia, mas desanexe quando eu pressionar C-d. Como isso pode ser alcançado? E que outras configurações úteis estão lá para facilitar minha vida SSH?

    
por Tobias Kienzler 24.09.2012 / 15:21

6 respostas

9

Acabei de fazer o seguinte para todos os meus servidores para que, quando eu me conectar via SSH, eu seja colocado automaticamente em uma sessão de tela.

Adicione o seguinte ao ~ / .bashrc para suas contas de usuário:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Isso iniciará uma sessão de tela chamada principal, se ela não existir ou se reconectar a ela, se existir. Isso foi feito porque tenho várias outras sessões de tela sendo executadas desanexadas para vários serviços e não quero me conectar a elas.

    
por 24.09.2012 / 16:20
8

Eu tenho o seguinte no meu .bash_profile em meus servidores remotos:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Isso faz duas coisas: primeiro, configura uma função shell para substituir o shell e transportar a conexão ssh-agent, depois ele chama a função depois de pausar por alguns segundos (caso você não queira que a tela inicie ).

A primeira cláusula if será verdadeira se a tela já não estiver em execução ( -z "${STY}" ) estiver anexada a um terminal ( -t 0 ) e eu não estiver executando o sudo (que às vezes não muda $USER ) .

A função reattach primeiro verificará se o ssh foi chamado com uma porta do agente ssh ativa ( -n "${SSH_AUTH_SOCK}" ). Em seguida, ele substituirá o que estiver em ~/.ssh/agent-script pelo arquivo de soquete ativo no momento e substituirá a variável de ambiente ( $SSH_AUTH_SOCK ) pelo novo valor. Em seguida, o script substituirá o shell atual por uma única sessão screen (certificando-se de que apenas uma exista). Quaisquer argumentos para a função reattach são passados para o comando ( ${1:+"$@"} ).

A última parte remove primeiro todas as sessões mortas ( screen -wipe ), permite que o usuário (eu) saiba que a tela será iniciada em breve e pode retornar ao shell pressionando Ctrl - C . Em seguida, ele espera por 5 segundos e chama a função reattach .

    
por 24.09.2012 / 16:19
4

Primeiro, se você usar byobu, você pode configurar uma nova sessão de shell para iniciar automaticamente byobu (que é essencialmente uma configuração de tela agradável, embora versões mais novas possam usar o tmux como backend). Se você realmente não quer byobu, então provavelmente você pode configurar a tela para se conectar manualmente editando seu .profile ou outro script de configuração do shell para exec screen if TERM != "screen" .

Se você não gostar disso, poderá usar o arquivo authorized_keys para executar um comando específico para conexões com uma chave específica (e você pode ter quantas chaves desejar). Veja man sshd para detalhes. Eu sugiro que você faça o comando executar um script que verifica se a tela está em execução e se conecta, ou então inicia uma nova sessão.

Quanto à desconexão no Ctrl-D, a tela permite que você configure mapeamentos de teclas no seu .screenrc . Veja man screen para detalhes. Você está procurando por "bindkey".

    
por 24.09.2012 / 15:46
2

Talvez seja totalmente irrelevante para sua pergunta, mas você já considerou o uso do TMUX. Ele faz muita funcionalidade que você está procurando fora da caixa.

Se você se desconectar de uma sessão SSH quando estiver sob o TMUX, tudo o que você precisa fazer é fazer o ssh voltar e executar o "tmux a" para anexar à sua sessão. Desde que eu comecei a usar o TMUX, eu esqueci o que os comandos nohup / disown são ... se você precisa executar algo e logout - rode dentro do tmux e desanexe. A saída do comando será armazenada em buffer, para que você possa revisá-la mais tarde.

para anexar automaticamente, você pode adicionar algo como abaixo em .bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

ou ainda mais fácil

tmux a 2>/dev/null

Tem menor consumo de memória e IMHO geral muito melhor / mais fácil de usar opção.

O atalho meta-d é o mapeamento padrão para desanexar no TMUX.

    
por 26.10.2012 / 16:24
0

screen -dAr default || screen -AS default funciona para mim. Eu adiciono isso ao meu ~ / .bashrc .

Explicando brevemente os interruptores:

  • d - Desconecte a tela se ela ainda estiver anexada a outra sessão.
  • A - Adapte as janelas na tela ao novo tamanho de terminal.
  • r default - Anexe a uma tela chamada padrão.

Se o primeiro comando de tela (o anterior a || ) não for bem-sucedido, o segundo será executado:

  • A - conforme explicado acima ...
  • S default - Crie a nova sessão de tela com o nome default .
por 07.01.2014 / 22:21
0

Sugiro usar o byobu . Esta ferramenta usa o tmux e fornece uma bela barra de ferramentas & outras facilidades convenientes de troca de janelas, teclas de atalho, etc.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

Com estes comandos acima, depois de um SSH bem-sucedido, efetue login no sistema com try e conecte-se a uma sessão byobu-tmux existente, caso contrário, ele criará uma nova sessão.

    
por 18.03.2016 / 17:50