¿Puedo ejecutar algunos comandos al iniciar la sesión ssh antes de pasar al modo interactivo?

13

Al comenzar la sesión ssh con el comando ssh, parece que tengo dos opciones: sesión interactiva predeterminada con env predeterminado y comenzando desde el directorio de inicio, o ejecutar un comando arbitrario pero de forma no interactiva (incluso los trucos como ssh "command; command; bash -i -l"no parecen hacer mucho bien). Muy a menudo quiero una sesión interactiva, pero con algo que sucede antes, normalmente un cambio de directorio o, a veces, un ajuste del entorno del sistema. Estas cosas variarían de una sesión a otra, por lo que no puedo simplemente pegarlas .bashrco no.

¿Hay alguna manera de hacer que eso suceda?

taw
fuente

Respuestas:

13

Estoy respondiendo a mí mismo, ya que finalmente descubrí el secreto. Ni la -topción sshni la -lopción para bashconducirán al shell de inicio de sesión por sí mismos, pero en combinación funcionan.

ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'cambia las variables de entorno de directorio, conjuntos, y luego comienza shell de entrada adecuada (la única diferencia que he encontrado hasta ahora es que /etc/motdno se muestra de esta manera - la cual es normalmente ssh's o loginresponsabilidad' s, no bash's - aparte de eso todo parece funcionar perfectamente, y todas las variables ambientales son idénticas).

Estos cambios en el entorno / directorio ocurren después de ssh, por lo que no están restringidos por PermitUserEnvironmentconfiguraciones relacionadas (exactamente como se planeó), sino antes .bashrc/ .profileejecutarse. Esto tiene ventajas y desventajas: es más difícil anular algo que se establece a partir de scripts de bash init PS1, pero es más fácil empaquetar exactamente los valores correctos en las sshlíneas de comando y .profilehacer todo el trabajo pesado.

Y si es realmente necesario, en realidad es bastante fácil hacer que bash ejecute algo después .profilecon una línea de comando como ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx', muy feo cuando se pone de esa manera, pero estos .profilearchivos alternativos se pueden preparar antes. (Por lo que puedo decir, bashtiene algunas ubicaciones candidatas para el .profilescript y ejecutará la primera que se encuentre; . fileno tiene tales fallos automáticos, por lo que deberá verificar dónde está su normalidad profilesi desea hacer eso)

taw
fuente
Impresionante, gracias por esto! Estaba buscando encontrar una manera de ingresar a la cuenta de un usuario justo después de ingresar, y la opción "-t" lo hizo funcionar. Sin esa opción, su shell no tiene un mensaje, no tiene historial de comandos, muere por un SIGINT, etc.
Ashoat
Esta respuesta es realmente útil, pero le faltan algunos ;s de la primera cadena de inicio de sesión ssh. No me permitirá editar tu respuesta porque no estoy cambiando lo suficiente. Tengo esto para trabajar ssh [email protected] -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Creo que eso es lo que pretendías.
Rob Kwasowski el
2

Edite .bashrc e incluya su configuración de entorno específica de SSH en:

if [ $SSH_TTY ]; then
    ...
fi

Esto le permitiría agregar configuraciones específicamente para sesiones SSH. 'Por supuesto, si todo lo que quiere es establecer variables de entorno arbitrarias desde el principio que varían según la sesión, no sé cómo puede hacer que la máquina las adivine por usted además de escribirlas ... no importa qué, usted' necesitará alguna condición comprobable para basar la elección de la configuración.

Michael Louis Thaler
fuente
2

Desde la sshpágina del manual:

Además, ssh lee ~ / .ssh / environment y agrega líneas del formato "VARNAME = value" al entorno si el archivo existe y los usuarios pueden cambiar su entorno. Para obtener más información, consulte la opción PermitUserEnvironment en sshd_config (5).

que dice:

PermitUserEnvironment
Especifica si sshd (8) procesa las opciones ~ / .ssh / environment and environment = en ~ / .ssh / Authorizedkeys. El valor predeterminado es "no". Habilitar el procesamiento del entorno puede permitir a los usuarios eludir las restricciones de acceso en algunas configuraciones utilizando mecanismos como LD_PRELOAD.

Esta facilidad podría usarse para ejecutar condicionalmente declaraciones en su control remoto ~/.bashrcutilizando la ifestructura que Mickey sugirió.

Pausado hasta nuevo aviso.
fuente
1

Simplemente ejecute de esta manera: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : para que aparezca el mensaje
  • ; bash: para que devuelva el control a pesar de ejecutar el comando (aquí cd) y salir de la sesión ssh
Sumit Ramteke
fuente
¡Bienvenido a ServerFault! Proporcione una explicación y / o documentación para los comandos o scripts para explicar para qué sirven.
Cory Knutson
1
Gracias @CoryKnutson, he realizado los cambios como usted solicitó
Sumit Ramteke