ssh, iniciar un shell específico y ejecutar un comando en la máquina remota?

11

Estoy en una situación en la que varios usuarios comparten la misma cuenta de usuario en una máquina remota. Tengo un directorio "personal" donde escribí mi propio .zshrcarchivo, y me gustaría tener una manera de:

  1. Iniciar una sesión ssh en la máquina remota con directivas de mi archivo de configuración ssh (por ejemplo ControlMaster auto)
  2. Esta sesión ejecuta un shell Z
  3. Se ejecuta .zshrcen mi directorio "personal" (no en el directorio de inicio del usuario compartido)

Sería bueno tener un alias o una forma simple de iniciar tales sesiones ssh (por eso pensé en usar el archivo de configuración de OpenSSH), ¡pero estoy abierto a cualquier otra idea!

¿Usando el archivo de configuración de OpenSSH?

Leí en la página de manual ssh_config de OpenSSH que puedo usar la directiva LocalCommandpara especificar un comando que se ejecute localmente después de conectarse con éxito al servidor. Esto me hizo pensar que puede haber una manera de decirle al configarchivo qué comando ejecutar de forma remota después de conectarse al servidor, pero no parece haber ninguno.

Amelio Vazquez-Reina
fuente
No creo que puedas. Pero estoy desconcertado de por qué quieres esto. Ya hay un comando en la línea de comando ssh. ¿Por qué no puedes correr ssh mycommand? Y si desea ejecutar algún comando de configuración antes de cada comando que viene sobre ssh, ¿por qué no configurar el lado del servidor?
Gilles 'SO- deja de ser malvado'
Gracias @Guilles. Estoy en una situación en la que varios usuarios comparten la misma cuenta remota, por lo que me gustaría configurar rápidamente algunas cosas al iniciar sesión de forma remota. Más específicamente, me gustaría iniciar un shell Z y pedirle que ejecute un .zshrcdirectorio específico (es decir, un directorio personal "personal"). Lo intenté ssh -t host_name 'zsh & source /path/to/my_zshrc'pero no funcionó (lo conseguí FPATH variable not defined, y creo que es porque zshtermina antes de que se ejecute my_zshrc, y mucho menos esto no me dio un Z shell)
Amelio Vazquez-Reina
Creo que esto merece una actualización del OP, así que lo acabo de actualizar.
Amelio Vazquez-Reina
Después de buscar una respuesta similar, se me ocurre que esta pregunta está muy cerca de lo que estás tratando de hacer.
Gilles 'SO- deja de ser malvado'

Respuestas:

15

La forma más obvia de ejecutar un comando de forma remota es especificarlo en la línea de comando ssh. El comando ssh siempre es interpretado por el shell del usuario remoto.

ssh [email protected] '. ~/.profile; command_that_needs_environment_variables'
ssh -t [email protected] '. ~/.profile; exec zsh'

Las cuentas compartidas son generalmente una mala idea; si es posible, obtenga cuentas separadas para cada usuario. Si está atascado con una cuenta compartida, puede crear un alias:

ssh -t [email protected] 'HOME=~/bob; . ~/.profile; exec zsh'

Si usa la autenticación de clave pública (nuevamente, recomendado), puede definir comandos por clave en ~/.ssh/authorized_keys. Vea esta respuesta para más explicaciones. Edite la línea para su clave en ~/.ssh/authorized_keysel servidor (todo en una línea):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== [email protected]
Gilles 'SO- deja de ser malvado'
fuente
Fantástico @Guilles. Sus contribuciones a este sitio lo están convirtiendo en un recurso tremendamente útil para todos nosotros. Muchas gracias de verdad. Por cierto, no sabía sobre el execcomando. ¿Cómo es exec zshdiferente de llamar zshdirectamente? ¿Por qué es importante en este caso particular?
Amelio Vazquez-Reina
Hmm, cuando corro ssh -t [email protected] 'HOME=~/bob; exec zsh'me sale HOME=~/bob: command not found. Creo que estoy en tcsh. Tengo el mismo problema si lo intento HOME=/home/bob. Probé con bash y zsh. ¿Alguna pista de lo que puede estar causando esto? Finalmente, ¿la sintaxis anterior me dejaría con la sesión ssh abierta? (lo que quiero). Gracias de nuevo.
Amelio Vazquez-Reina
1
@intrpc execreemplaza el shell original con zsh; sin zsh, el shell original permanecería en la memoria hasta que zsh salga y luego salga. La principal diferencia es ahorrar un poco de memoria, no es muy importante. Si su shell de inicio de sesión es (t) csh, use setenv HOME ~/bob; exec zsh. Finalmente, dado que zsh se inicia sin argumento, obtienes una sesión de shell, como la que obtendrías si solo ejecutaras sshy tuvieras zsh como shell de inicio de sesión.
Gilles 'SO- deja de ser malvado'
De nuevo, gracias por tu ayuda. Una pregunta de seguimiento aquí. ¿Alguna forma de ejecutar más comandos, después del exec zshcomando?
Amelio Vazquez-Reina
1
@ AmelioVazquez-Reina No es conveniente a menos que tenga algún control sobre uno de los archivos de puntos. Puede configurar la variable de entorno ZDOTDIRpara que zsh busque archivos de puntos en un directorio diferente. Si usted tiene algún control sobre los archivos punto a continuación, puede hacer algo como complemento eval $LC_STARTUP_CODEa $ZDOTDIR/.zshrcy pasar el código a ejecutar en la variable de entorno LC_STARTUP_CODE.
Gilles 'SO- deja de ser malvado'
-3

Para ejecutar un comando de forma remota después de conectar el servidor, agregue en su archivo .ssh / config el siguiente fragmento

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
parth115
fuente
2
Gracias @ user626129, pero como mencioné en la pregunta original, la LocalCommanddirectiva es ejecutar un comando en el shell local , no en el shell remoto .
Amelio Vazquez-Reina