¿Cómo ejecutar comandos automáticamente al iniciar sesión SSH?

17

Cada vez que inicio sesión en mi servidor Linux me gustaría que varios comandos se ejecuten automáticamente (establecer algunas variables, cambiar la ubicación, etc.)

Esto debe hacerse en el inicio de sesión del usuario, no en el inicio del sistema.

¿Cómo puedo configurarlo para hacer esto?

Alasdair
fuente
Debe leer la sección INVOCACIÓN en bash (1) ( man bash).
Andrew Schulman

Respuestas:

31

Pon los comandos en ~/.bashrc. Cualquier cosa allí se ejecuta cada vez que inicia sesión.

Si necesita que los comandos solo se ejecuten cuando inicie sesión a través de ssh (pero no cuando inicie sesión físicamente), probablemente podría probar la presencia de la SSH_CONNECTIONvariable de entorno y solo ejecutar los comandos si encuentra que existe.

David Z
fuente
No estoy iniciando sesión como root, es un servidor de AWS, así que tengo que iniciar sesión como "ec2-user" y luego cambiar a root usando "sudo su -". Entonces, ¿debo poner los comandos en "/home/ec2-user/.bashrc"?
55
Esto supone que ~ / .bashrc proviene de su ~ / .bash_profile. ~ / .bash_profile será el script que se invoca para un shell de inicio de sesión como ssh. Creo ~ / .bashrc se llamará si se abre una terminal de GNOME, por ejemplo, después de que ya ha iniciado la sesión.
dgrant
Me has confundido, déjame explicarte más: esta es una instancia de Amazon Web Services, que es prácticamente un servidor, por lo que nadie se registrará físicamente (ni siquiera estoy seguro de si existe físicamente como una sola máquina). Me conecto usando PUTTY con el nombre de usuario ec2-user. Esto me deja en el directorio / home / ec2-user. Luego cambio a usuario root escribiendo "sudo su -", que luego me deja en "/ root", luego tengo que escribir una serie de comandos, incluido volver a cambiar a "/ home / ec2-user" y configurar algunos variables, alias, etc. Entonces ... ¿cómo lo haría para hacer esto?
Además, dado que estoy cambiando de usuario, espero que en el perfil bash ec2-user debería poner solo "sudo su -", y luego el resto de los comandos en el archivo bash raíz.
NOTA: en realidad, se llama a .profile si existe, a menos que exista .bash_profile, entonces se llama en su lugar.
Dgrant
14

Simplemente ponga esto en ~ / .bashrc o /etc/bash.bashrc si desea esto para todos los usuarios:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi
Llamageddon
fuente
¿Y cómo pierdo la sesión después de cerrar la ejecución?
e-info128
1
@WHK ¿Qué quieres decir con perder la sesión?
Llamageddon
@Llamageddon: Creo que se pregunta lo mismo que yo. Si quisiera poner toda mi sesión SSH screen, podría usar su respuesta y ponerla en screenlugar del eco. El problema con eso es que al finalizar la sesión de pantalla volverá al indicador SSH en lugar de cerrar sesión. Sin embargo, solo escribir este comentario me dio la respuesta: agregue el logoutcomando después del screencomando.
zondo
Sin embargo, esto no funciona para la sesión ssh que no usa bash, por ejemplo, cuando abro una sesión sftp.
Fabio
@zondo @ e-info128 exec commandreemplazará el shell actual con lo que sea que ejecute.
Llamageddon el
5

Alternativamente, puede especificar un comando que se ejecutará durante la invocación de ssh:

$ ssh -t server 'cmd; exec bash -l'

El último comando en la lista debería iniciar una sesión interactiva en su shell preferido. Si tiene muchos comandos para ejecutar, considere crear un archivo de script en su servidor SSH.

Dmitry Grigoryev
fuente
1
ESTO es muy útil. No estoy seguro de si es exactamente la respuesta que hizo el interrogador, pero la gente debería saberlo, ya que puede no ser obvio. Por ejemplo "ssh user @ host" export x = 5; bash "Luego, en la terminal que aparece, echo $ x muestra 5.
clearlight
3

En realidad, ~/.ssh/rces un lugar adecuado para que usted agregue el comando para ejecutar cuando inicia sesión, en lugar de cualquier usuario del sistema.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.
arroyo hong
fuente
No necesariamente. Es una ubicación donde se pueden colocar comandos.
Daniel B
Eso REALMENTE podría meter a alguien en problemas si no supieran lo que están haciendo. Es potencialmente útil en casos de esquina, pero eso REALMENTE podría arruinar a alguien si olvida que pusieron comandos allí o el nombre y la ruta de ese archivo. En general, sería muy preferible colocar los comandos de inicio de sesión en el lugar esperado, .bashrc en el lado remoto y probar $ SSH_CONNECTION, como han sugerido otras respuestas aquí.
clearlight
1

Iniciar sesión en el host remoto después de ejecutar los comandos pasados ​​al host remoto:

  1. Se ejecuta .bashrcen host remoto
  2. Ejecuta comandos pasados ​​en la línea de comandos (usando env desde .bashrc remoto)
  3. Lo deja en el indicador de bash en el host remoto (si no hay errores)

    $ ssh user@host "bash -lc cmd; cmd; ..."

    -l opción lo convierte en un shell de inicio de sesión (por ejemplo, ejecutar .bashrc)

    -c opción proporciona el comando explícito bash se ejecutará

luz clara
fuente