Como iniciar uma sessão de tela com um comando ssh em um servidor remoto da minha área de trabalho?

57

Quero poder iniciar sessões de tela em servidores remotos a partir de um único comando ssh na minha área de trabalho. No entanto, a tela parece precisar de um terminal, que não está disponível ao executar um comando através do ssh.

Então o óbvio

ssh [email protected] screen "tail -f /var/log/messages"

(como exemplo) não funciona e fornece

Must be connected to a terminal.

Quero que o ssh inicie o comando em uma tela para que possa efetuar logon mais tarde e anexar como faria em uma sessão de tela que eu teria iniciado manualmente.

Thomas Vander Stichele
fonte
Como um aparte, você pode encontrar esse erro não através do mau uso da tela. Eu tinha uma função de shell que estava executando exec <foo para ler de um arquivo. Muito mais tarde, em um script grande, tentei iniciar a tela. Todos os métodos abaixo obv. falhou como o verdadeiro culpado foi o executivo. Um a ter em mente. Verifique se você não matou seu próprio stdin inadvertidamente.
Neil McGill

Respostas:

77

Tente usar a opção -t para ssh

ssh -t [email protected] screen "tail -f /var/log/messages"

De man ssh

-t Força a alocação pseudo-tty. Isso pode ser usado para executar
        vários programas baseados em tela em uma máquina remota, que pode ser
        muito útil, por exemplo, ao implementar serviços de menu. Múltiplo -t
        opções forçam a alocação de tty, mesmo se ssh não tiver tty local.
Kjetil Joergensen
fonte
Estou tentando o mesmo com o tmux ssh -t user@machine tmux attache posso anexar uma sessão remota do tmux, mas ela mexe com a codificação de caracteres. Ele exibe apenas caracteres ascii. Existe uma correção para isso?
Macario 31/07
11
@ Macario, você pode abrir uma pergunta separada para isso, enquanto está relacionada tangencialmente à medida que você a executa com ssh -t, parece mais relacionado à configuração de LC_ * de maneira diferente para execução interativa e não interativa. Quando você passa uma linha de comando para a execução do ssh, ela é executada com o ambiente não interativo. Também é possível que a falta da variável de ambiente TERM seja transmitida durante a execução de maneira não interativa; nesse caso, o tmux não teria idéia de quais recursos seu terminal realmente possui e volta ao denominador menos comum.
Kjetil Joergensen
Eu não estou usando ssh, mas está enfrentando o mesmo problema. Por favor ajude. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Você pode usar:

ssh root@host screen -m -d "tail -f /var/log/messages"

Isso inicia uma tela desanexada com um comando em execução.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.
Alakdae
fonte
11
Sua resposta foi igualmente boa, pena que tenho que escolher. Talvez alguém deva editar a primeira resposta e adicionar suas informações.
Thomas Vander Stichele
8

Resposta tardia, mas é isso que faço, faço um apelido (vamos chamá-lo t) que faz isso:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Isso diz sshpara desativar o encaminhamento do agente e do X11 e screenpara anexar a uma sessão em execução, iniciar uma nova, se necessário, usar ^Zcomo o comando breakout, usar UTF-8 e ser inteligente sobre o terminal.

Tudo isso significa que eu posso abrir um terminal, digite te ele abrirá minha sessão de tela no $ MYSERVER. Posso abrir outro terminal, fazer a mesma coisa e obter outra janela na mesma sessão.

É muito bom ter várias janelas de terminal na mesma sessão de tela, para que você veja duas guias da tela ao mesmo tempo.

w00t
fonte
11
Eu li várias páginas sem responder exatamente o que estava procurando, mas você acertou em cheio. Estou assumindo que o screen ou o tmux provavelmente está na maioria dos servidores atualmente, e os que eu conecto são potencialmente efêmeros, então eu não queria mexer com o bashrc, como sugerem as respostas. Você também pode fazer disso uma função no seu shell e aceitar argumentos como $ host e $ command (que você colocaria no final). E, em vez de codificar seu alias para o tqual é um único host, você pode combiná-lo com nomes de host no seu ssh_config.
dragon788
@ dragon788 de fato, eu fiz uma função agora e substitui $ MYSERVER por "$ @". Eu ainda uso muito este.
W00t
4

Colocando o seguinte no arquivo ~ / .bashrc no meu servidor, ele inicia uma sessão de tela na primeira vez em que faço logon no servidor ou, se já estiver em execução, reconecta-me a essa sessão.

Acho isso muito útil:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
fonte
Eu tentei isso, mas quando eu faço screen -ls, então eu não vejo nenhuma sessão de tela
Tarun