Como usar efetivamente a tela e o SSH?

12

Gostaria de configurar o SSH e a tela para que um login sempre se reconecte a uma sessão de tela. Idealmente, essa sessão não seria encerrada, mas seria desconectada quando eu pressionasse Cd. Como isso pode ser alcançado? E que outras configurações úteis existem para facilitar minha vida SSH?

Tobias Kienzler
fonte

Respostas:

9

Eu fiz o seguinte em todos os meus servidores para que, quando eu me conecte via SSH, seja automaticamente colocado 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 main se não existir ou se reconectará a ela se existir. Isso foi feito porque eu tenho várias outras sessões de tela em execução desanexadas para vários serviços e não queria me conectar a elas.

Daemon of Chaos
fonte
Eu só queria acrescentar que a combinação de teclas CTRL-d é padrão na tela para desanexar de uma sessão de tela em execução.
Daemon of Chaos
8

Eu tenho o seguinte no meu .bash_profile nos 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 de shell para substituir o shell e levar adiante a conexão ssh-agent, depois chama a função após uma pausa por alguns segundos (caso você não queira que a tela inicie).

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

A reattachfunção primeiro verificará se o ssh foi chamado com uma porta ssh-agent ativa ( -n "${SSH_AUTH_SOCK}"). Em seguida, substituirá o que estiver no ~/.ssh/agent-scriptarquivo 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 screensessão (garantindo que apenas um exista). Quaisquer argumentos para a reattachfunção são passados ​​para o comando ( ${1:+"$@"}).

A última parte primeiro remove todas as sessões mortas ( screen -wipe), informa ao usuário (eu) que a tela começará em breve e poderá retornar ao shell pressionando Ctrl- C. Em seguida, aguarda 5 segundos e chama a reattachfunção.

Arcege
fonte
4

Primeiro, se você usar o byobu, poderá configurar uma nova sessão do shell para sempre iniciar automaticamente o byobu (que é essencialmente uma boa configuração de tela, embora as versões mais recentes possam usar o tmux como back-end). Se você realmente não quer o byobu, provavelmente pode configurar a tela para se conectar manualmente, editando seu .profileou outro script de configuração de shell para exec screenif TERM != "screen".

Se você não gostar disso, poderá usar o authorized_keysarquivo para executar um comando específico para conexões com uma chave específica (e poderá ter quantas chaves desejar). Veja man sshdpara detalhes. Eu sugiro que você faça o comando executar um script que verifique 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 os mapeamentos de teclas no seu .screenrc. Veja man screenpara detalhes. Você está procurando "bindkey".

ams
fonte
2

Talvez totalmente irrelevante para a sua pergunta, mas você já pensou em usar o TMUX. Ele oferece muitas funcionalidades que você procura imediatamente.

Por exemplo. se você se desconectar de uma sessão SSH quando estiver no TMUX, tudo o que você precisa fazer é voltar ao ssh e executar "tmux a" para anexar à sua sessão. Desde que comecei a usar o TMUX, esqueci o que são os comandos nohup / disown ... se você precisar executar algo e sair - execute-o 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 ao .bashrc:

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

ou ainda mais fácil

tmux a 2>/dev/null

Possui menor consumo de memória e o IMHO geral é muito melhor / mais fácil de usar.

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

Alex
fonte
0

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

Explicando brevemente os switches:

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

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

  • A - Como explicado acima ...
  • S default- Crie a nova sessão de tela com o nome padrão .
Batandwa
fonte
0

Eu sugiro usar byobu . Esta ferramenta usa o tmux e fornece uma barra de ferramentas agradável e outros recursos 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 esses comandos acima, após um SSH bem-sucedido, efetue login no sistema com try e connect a uma sessão existente do byobu-tmux; caso contrário, ele criará uma nova sessão.

Sandeep
fonte