34 votos

Ssh, ejecute un comando de inicio de sesión y, a continuación, Permanecer Conectado?

He intentado esto con esperar, pero no funcionó: se cierra la conexión a la final.

Podemos ejecutar una secuencia de comandos a través de ssh que va a entrar en máquinas remotas, ejecutar un comando, y no se desconecte?

Para ssh en una máquina de cd, un directorio y, a continuación, ejecutar un comando, y permanecer conectado.

-Jonathan

(esperar que he utilizado)

#!/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

28voto

Bill Weiss Puntos 6677

Añadir un ; /bin/bash hasta el final de la línea de comandos en el lado remoto? Que es:

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

Mejor aún, cambiar de root .bashrc a ser algo como esto:

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

:)

6voto

harms Puntos 6348

La que probablemente sea la más sencilla y limpia de ssh en un servidor, generar una shell interactiva y ejecutar comandos dentro de ese caparazón es crear una personalizada archivo rc para bash.

En su personalizados bashrc archivo en el servidor, de primera fuente el archivo predeterminado y, a continuación, añadir sus comandos personalizados, por ejemplo,

~/.bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

A continuación, puede iniciar su sesión de SSH como este:

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

El -t opción fuerzas de un pseudo-tty asignación, por lo que cosas como el autocompletado de trabajo.

El --rcfile opción especifica que rcfile a la carga en lugar de la predeterminada. Importante: debes poner el "doble dash argumentos" en la línea de comandos antes de que el único carácter de las opciones con el fin de ser reconocido.

El -i argumento a /bin/bash está ahí para invocar un shell interactivo.

4voto

Bryan Watts Puntos 22810

Si usted está bien con hacerlo en Python, pexpect tiene un ejemplo que hace casi exactamente lo que usted está pidiendo:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
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 hacer esto con ssh en lugar de ftp, te gustaría código similar al siguiente (el ejemplo de los archivos en pexpect tienen mucho más los detalles y la información, pero aquí están los fundamentos):

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.

No me malinterpreten, me ENCANTA esperar (especialmente autoexpect), pero python es soooo mucho más fácil para mí para novatos.

0voto

Kounavi Puntos 121

En general usted debe evitar el uso de ssh en este tipo de camino, como las derrotas de su propósito.
Hacer un

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

a ver si la clave se encuentra en el ssh sesión activa de la piscina o bien agregue usted (con ssh-add).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: