Execute o comando ssh remoto com o shell de login completo

45

Eu gostaria de fazer algo como ssh example.com 'ls' No entanto, por ssh manpage:

If command is specified, it is executed on the remote host instead of a login shell.

Então, o que acontece é que ls exibe sua saída e, em seguida, ssh sai.

O que não consigo descobrir é como abrir o shell de login completo e depois executar o comando dentro desse shell. Deixando o shell aberto após o comando ser executado. Como se eu tivesse feito manualmente o seguinte:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Alguma idéia?

    
por matthew 05.07.2011 / 14:14

4 respostas

38

Basta dizer ao bash para executar ls e depois ele mesmo em um shell de login

$ ssh user@host  -t 'bash -l -c "ls;bash"'
    
por 17.07.2013 / 15:58
28
ssh user@host -t 'ls; exec $SHELL -l'

-t Alocação pseudo-terminal de força. Isso pode ser usado para executar programas baseados em telas arbitrárias em uma máquina remota. É um pouco mais adequado que bash -i .

exec Nenhum novo processo é criado.

-l procura por ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos de ... Sem isso você provavelmente não pode executar scripts / comandos de ~ / diretório bin, porque este código de ~ / .profile não será executado sem -l flag:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
    
por 05.07.2011 / 15:26
1

Em seu comentário sobre a resposta de fons, você diz que não funciona enquanto usa screen .

Você poderia elaborar sobre isso? Olhando para o código fonte do openssh, o sshd executa o comando chamando

YOUR_DEFAULT_SHELL -c COMMAND

Portanto, por exemplo, se o seu shell padrão for screen , isso não funcionará muito bem, pois o screen -c flag substitui seu .scrreenrc . Então, não há realmente nenhuma maneira de enviar comandos para a tela se for o seu shell padrão. Você terá que executar a tela como o comando dado ao ssh, mas com um shell padrão que não é a tela .

Se é isso que você está tentando fazer, acho que as coisas ficarão muito estranhas, já que screen também fechará janelas com programas não interativos, então você terá que fazer um truque parecido com o de fons, mas um nível mais profundo. SO, com, por ex. / bin / bash (e não tela) como seu shell padrão Algo como:

ssh user@host -t 'screen bash -l -c "ls;bash"'

Qual deve - tomar uma respiração profunda - ssh no host, execute bash -c com um comando de tela, que fará uma nova janela. Se esta janela abrisse, seria terminar, e a tela terminaria, então usamos o truque do fons dentro da nova janela de tela .

Eu acho que isso vai funcionar, se é isso mesmo que você estava tentando fazer;)

    
por 23.07.2013 / 01:00
0

Múltiplas opções -t forçam a alocação tty, mesmo que ssh não tenha tty local:

ssh -tt user@host 'bash -l -c "/path/to/command'
    
por 26.05.2018 / 19:31

Tags