Ssh, executa um comando no login e depois permanece conectado?

28

Eu tentei isso com o esperado, mas não funcionou: ele fechou a conexão no final.

Podemos executar um script via ssh, que fará o login em máquinas remotas, executará um comando e não desconectará?

Então, ssh em uma máquina, cd para tal e tal diretório, e então execute um comando e permaneça logado.

-Jonathan

(espere que eu usei)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact
    
por jonathan 29.10.2009 / 18:05

5 respostas

24

Adicione um ; /bin/bash ao final da sua linha de comando no lado remoto? Isso é:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Melhor ainda, altere o .bashrc do root para algo assim:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)

    
por 29.10.2009 / 18:28
4

Se você está bem em fazer isso em Python, pexpect tem um exemplo que faz quase exatamente o que você está pedindo :

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Para fazer isso com o ssh ao invés do ftp, você quer um código semelhante ao seguinte (os arquivos de exemplo no pexpect possuem muito mais detalhes e informações, mas aqui estão os princípios):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Não me entenda mal, EU AMO esperar (especialmente auto-estima), mas o Python é muuuuito mais fácil para mim.

    
por 28.05.2010 / 21:53
4

A maneira mais fácil e mais limpa de ssh em um servidor, gerar um shell interativo e executar comandos dentro desse shell é criar um arquivo rc customizado para o bash.

No seu arquivo bashrc personalizado no servidor, primeiro forneça o arquivo padrão e adicione seus comandos personalizados, por exemplo,

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

Você pode então iniciar sua sessão SSH assim:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

A opção -t força uma alocação pseudo-tty, de modo que coisas como o trabalho de conclusão de tabulação.

A opção --rcfile especifica qual rcfile será carregado em vez do padrão. Importante: você deve colocar "argumentos duplos" na linha de comando antes das opções de caractere único para ser reconhecido.

O argumento -i para / bin / bash está lá para invocar um shell interativo.

    
por 17.02.2012 / 12:16
1

Se alguém quiser informações sobre o que está acontecendo em segundo plano, você deve dar uma olhada no manual do sshd:

When a user successfully logs in, sshd does the following:

  1. If the login is on a tty, and no command has been specified, prints last login time and /etc/motd (unless prevented in the configuration file or by ~/.hushlogin; see the FILES section).
  2. If the login is on a tty, records login time.
  3. Checks /etc/nologin and /var/run/nologin; if one exists, it prints the contents and quits (unless root).
  4. Changes to run with normal user privileges.
  5. Sets up basic environment.
  6. Reads the file ~/.ssh/environment, if it exists, and users are allowed to change their environment. See the PermitUserEnvironment option in sshd_config(5).
  7. Changes to user's home directory.
  8. If ~/.ssh/rc exists, runs it; else if /etc/ssh/sshrc exists, runs it; otherwise runs xauth(1). The ''rc'' files are given the X11 authentication protocol and cookie in standard input. See SSHRC, below.
  9. Runs user's shell or command.

link

    
por 08.05.2015 / 01:29
0

Você geralmente deve evitar usar o ssh neste tipo de caminho, já que ele derrota seu propósito.
Faça um

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

para ver se sua chave está listada no conjunto de sessões ativas do ssh ou então inclua-a você mesmo (com ssh-add).

    
por 01.03.2011 / 21:14