Ejecute el comando ssh remoto con el Shell de inicio de sesión completo

48

Me gustaría hacer algo como ssh example.com 'ls'Sin embargo por página de manual de ssh:

Si se especifica el comando , se ejecuta en el host remoto en lugar de un shell de inicio de sesión.

Entonces, lo que sucede es que lsmuestra su salida y luego ssh sale.

Lo que no puedo entender es cómo abrir el shell de inicio de sesión completo y luego ejecutar el comando dentro de ese shell. Dejando el shell abierto después de ejecutar el comando. Como si hubiera hecho manualmente lo siguiente:

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

¿Algunas ideas?

Mateo
fuente
esta es una pregunta similar superuser.com/questions/261617/… pero ninguna de las respuestas realmente parece ajustarse a lo que estoy tratando de hacer.
Mateo
¿Qué tal ssh example.com 'ls;bash'?
Andrejs Cainikovs
necesita el -i en mis sistemas para hacer que el segundo shell sea interactivo.
Flexo
opción -t es la respuesta a tu pregunta. Existen otras opciones (por ejemplo, llavero) pero depende de sus necesidades reales, que no son lo suficientemente claras para mí.
hornetbzz
@hornetbzz -t me da pseudo-tty. Pero por lo demás, el comportamiento es el mismo. Quiero iniciar un shell interactivo, ejecutar un comando dentro de ese shell y hacer que el shell permanezca abierto después de ejecutar el comando.
Mateo

Respuestas:

40

Solo dile a bash que se ejecute lsy luego se inicie en un shell de inicio de sesión

$ ssh user@host  -t 'bash -l -c "ls;bash"'
fons
fuente
2
Lamentablemente, esto no parece funcionar mientras se usa screen. De lo contrario, parece que hace lo que estaba tratando de hacer.
Mateo
31
ssh user@host -t 'ls; exec $SHELL -l'

-tForzar la asignación pseudo-terminal. Esto se puede usar para ejecutar programas arbitrarios basados ​​en pantalla en una máquina remota. Es un poco más apropiado que bash -i.

exec No se crea ningún proceso nuevo.

-lbusca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos desde ... Sin esto, probablemente no pueda ejecutar scripts / comandos desde el directorio ~ / bin, porque este código from ~ / .profile no se ejecutará sin -lbandera:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
Gravedad
fuente
@grawity @Alan Esto podría funcionar como una solución alternativa, pero realmente me gustaría que el comando se ejecute dentro del shell y no solo abra un nuevo shell después de ejecutar el comando.
Mateo
+1, -t definitivamente es la forma correcta de superarlo -i, simplemente lo olvidé.
Flexo
@matthew: Tendrás que remendarte bashpara permitir eso.
Grawity
@grawity no realmente, mira mi respuesta a continuación
fons
@matthew, use exec bashoexec $SHELL
Eugen Konkov
1

En su comentario sobre la respuesta de fons, usted dice que no funciona mientras lo usa screen.

¿Podrías dar más detalles sobre eso? Mirando el código fuente de openssh, sshd ejecuta el comando llamando

YOUR_DEFAULT_SHELL -c COMMAND

Entonces, por ejemplo, si su shell predeterminado es screen, entonces esto no funcionará tan bien porque screenla -cbandera simplemente anula su .scrreenrc. Entonces, realmente no hay forma de enviar comandos a la pantalla si es su shell predeterminado. Tendrás que ejecutar screen como el comando dado a ssh, pero con un shell predeterminado que no es screen .

Si eso es lo que estás tratando de hacer, creo que las cosas se pondrán realmente extrañas, ya screenque también cerrarán ventanas con programas no interactivos, por lo que tendrás que hacer un truco similar al de fons, pero un nivel más profundo. SO, con, por ejemplo, / bin / bash (y no la pantalla) como shell predeterminado Algo como:

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

Lo cual debería, tomar una respiración profunda, ssh en el host, ejecutar bash -c con un comando de pantalla, lo que abrirá una nueva ventana. Si esta ventana solo abriera ls, terminaría y la pantalla terminaría, por lo que usamos el truco de fons dentro de la nueva ventana de pantalla .

Creo que funcionará, incluso si eso es lo que intentabas hacer;)

Scott Walls
fuente
Creo que el problema que tengo screenen esta situación es que normalmente lo cargo exec screen -RRdesde mi .profile. Esto significa que bash -lintenta cargar la pantalla que arroja el resto. parece que puedo evitarlo eliminando '-l' en las soluciones suyas y @fons (la suya luego me deja dentro screen). Sin embargo, es algo inestable.
Mateo
0

Varias opciones -t fuerzan la asignación de tty, incluso si ssh no tiene tty local:

ssh -tt user@host 'bash -l -c "/path/to/command'
panticz.de
fuente