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 if
clá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 reattach
funçã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-script
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 screen
sessão (garantindo que apenas um exista). Quaisquer argumentos para a reattach
funçã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 reattach
função.