el archivo de puntos no se obtiene al ejecutar un comando a través de ssh

11

Cuando ejecuto mi programa de forma interactiva, funciona bien:

ssh somehost
$ ~/some/path/somescript.py

Cuando ejecuto mi programa sobre ssh directamente, no funciona. La variable PYTHONPATHno está establecida porque .bashrcno tiene su origen.

ssh somehost ~/some/path/somescript.py

Si corro ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py', funciona bien.

Pero esto último no funcionaría para otras personas, por ejemplo, usar tcsh y no tener ninguno ~/.bashrc).

¿Cuál es el comando para ejecutar una cosa a través de ssh en otro host que funciona para todos los shells?

bzdjamboo
fuente
1
Respondido aquí, stackoverflow.com/questions/820517/bashrc-at-ssh-login , básicamente, ssh no genera .bashrc, necesita obtener su .bashrc a través de .bash_profile u otras opciones.
EightBitTony
1
@EightBitTony: No, ese es un problema diferente. La pregunta de bzdjamboo es sobre una sesión no interactiva.
Gilles 'SO- deja de ser malvado'
En realidad, la última respuesta en el enlace que publiqué parece ser valiosa, ssh obtiene el código fuente .bashrc, pero no se ejecuta debido a la verificación de ser interactivo. Sin embargo, agradezco que su respuesta cubra todas las bases.
EightBitTony
3
@EightBitTony: en esa pregunta, la respuesta aceptada es una buena solución para el que pregunta, pero las respuestas no cuentan la historia completa. SSH en sí mismo no genera nada. Si el shell de entrada se invoca como fiesta bash, luego de TI fuentes .bash_profileo .profilepara un inicio de sesión interactivo, y .bashrcpara un inicio de sesión no interactiva. Si su shell de inicio de sesión se invoca bash como sho ash o ksh, .profilebusca un inicio de sesión interactivo y nada para un inicio de sesión no interactivo.
Gilles 'SO- deja de ser malvado'

Respuestas:

12

No existe un archivo estándar por usuario que se ejecute para inicios de sesión no interactivos. Debe hacer que el programa sea autónomo, de modo que pueda encontrar sus dependencias sin depender de variables de entorno no predeterminadas, o bien establecer explícitamente el entorno, generalmente con

ssh somehost '. ~/.profile; exec ~/some/path/somescript.py'

No debería establecer variables de entorno en .bashrc: este archivo está destinado a shells interactivos y se lee en cada instancia de bash. Las variables de entorno deben establecerse .profile, que se leen cuando inicia sesión. Aparte del número muy pequeño de personas que no usan un shell de estilo Bourne como su shell de inicio de sesión, .profilefunciona para todos, ya sea que usen bash o zsh o csh o pescado de forma interactiva. Consulte también Diferencia entre .bashrc y .bash_profile , ¿Qué archivos de configuración deben usarse para configurar variables de entorno con bash? .

Dicho esto, hay una manera de obtener un script cada vez que inicie sesión en ssh con una clave en particular. Consulte ¿Hay alguna forma de enviar información de configuración de shell cuando SSHing a un host? , sh archivos de inicio sobre ssh .

Gilles 'SO- deja de ser malvado'
fuente
Ahora, ¿cómo lo marco como "respondido"? :-)
bzdjamboo
En el lado izquierdo de esta sección de respuestas debería haber flechas de votación hacia arriba y hacia abajo y un contador de votos. Justo debajo de eso debería haber el contorno de una casilla de verificación. Puede hacer clic para activar la función de aceptar respuesta.
Caleb
Gracias a todos de nuevo, pero aparentemente sus respuestas no resolvieron mi problema.
bzdjamboo
Aquí hay una formulación un poco más reciente del problema y mi comprensión actual de la raíz del problema.
bzdjamboo
Parece que no puedo agregar más de 60 caracteres aquí, así que tengo que hacer mi pregunta por separado nuevamente. Lo siento ab. ese. Nuevamente, este no está resuelto, y cavar mucho más durante un par de días no ayudó.
bzdjamboo
0

Tuve el mismo problema, pero para mí la solución fue diferente. Mi usuario no estaba configurado para usar bash como shell, sino que usaba zsh como shell, por lo tanto, los archivos bash dot no se ejecutaron al iniciar sesión. Abra / etc / passwd con un editor de texto y busque su nombre de usuario y qué shell utiliza:

root:x:0:0:root:/root:/bin/zsh

Así es como se ve mi entrada de usuario. Observe que dice / bin / zsh en lugar de / bin / bash. Para zsh, el archivo de puntos correcto es ~ / .zprofile. Su contenido se ejecutará cada vez que inicie sesión con ssh.

Martin Hansen
fuente