¿Por qué Bash no puede encontrar el comando incluso si $ PATH se especifica correctamente?

9

Estoy especificando la ruta a mi comando en el archivo / etc / profile :

export PATH=$PATH:/usr/app/cpn/bin

Mi comando se encuentra en:

$ which ydisplay 
/usr/app/cpn/bin/ydisplay

Entonces, cuando realizo la salida "echo $ PATH" se ve así:

$ echo $PATH
...:/usr/app/cpn/bin

Y todo está bien, pero cuando intento iniciar mi comando a través de SSH obtengo un error:

$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found

Pero el mi camino todavía está presente:

$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

Explíqueme por qué Bash no puede encontrar ydisplay durante la sesión SSH y cómo configurar SSH correctamente para evitar este problema.

Además, si especifico $ PATH en el archivo local .bashrc en el usuario actual, todo funciona correctamente. Pero quiero modificar solo un archivo en lugar de especificar muchos archivos para cada usuario. Es por eso que estoy preguntando.

SIGSEGV
fuente
1
no sólo correr ydisplaytrabajo? hace ssh 127.0.0.1 /usr/app/cpn/bin/ydisplayel trabajo?
Bananguin
@ user1129682 Sí, ydisplay con el nombre completo especificado funciona y solo ydisplay funciona
SIGSEGV
Cuando no está conectado (no tiene una sesión remota) pero solo envía un comando de forma remota y no tiene acceso a las variables de entorno de la misma manera porque sus archivos .bashrc / .profile no se ejecutan. Esta es la razón, ya que son responsables de establecer variables para la sesión actual.
mnmnc
14
Solo una nota al margen: ssh 127.0.0.1 echo $PATHno hace lo que podría pensar que hace: el shell expande $ PATH antes de que incluso se ejecute ssh, por lo que eso no prueba ni refuta nada.
Ulrich Schwarz
2
esta pregunta de stackoverflow podría ser de alguna ayuda
bsd

Respuestas:

5

tl; dr

Ejecutando ssh 127.0.0.1 ydisplayfuentes en ~/.bashrclugar de /etc/profile. Cambia tu camino en su ~/.bashrclugar.

detalles

El único momento que /etc/profilese lee es cuando su shell es un "shell de inicio de sesión".

Del Manual de referencia de Bash :

Cuando se invoca bash como un shell de inicio de sesión, ... primero lee y ejecuta comandos del archivo / etc / profile

Pero cuando ejecuta ssh 127.0.0.1 ydisplay, bashno se inicia como un shell de inicio de sesión. Sin embargo, sí lee un archivo de inicio diferente. El Manual de referencia de Bash dice:

cuando ... ejecutado por ... sshd. ... lee y ejecuta comandos desde~/.bashrc

Entonces deberías poner tu PATHconfiguración ~/.bashrc.

En la mayoría de los sistemas, las ~/.bash_profilefuentes ~/.bashrc, por lo que puede colocar su configuración solo en ~/.bashrclugar de colocarla en ambos archivos.

No hay manera estándar para cambiar la configuración para todos los usuarios, pero la mayoría de los sistemas tienen una /etc/bashrc, /etc/bash.bashrco similar.

De lo contrario, configure pam_envy ponga la PATHconfiguración /etc/environment.

Ver también:

Mikel
fuente
1

Históricamente, los archivos de perfil ( /etc/profiley ~/.profile) fueron invocados cuando inició sesión (en la consola de texto, ¿qué más?) Y sirvieron para muchos propósitos:

  • Establezca variables de entorno y otros parámetros (por ejemplo, umask) para la sesión.
  • Ejecute programas adicionales al comienzo de la sesión (por ejemplo, notificación por correo electrónico).
  • Ejecute el programa para la sesión, si es diferente del shell (por ejemplo, otro shell o X Window).
  • Establezca los parámetros del terminal (p stty. Ej .).
  • Establecer parámetros de shell (por ejemplo, alias).

Todos estos propósitos no se identificaron como separados hasta más tarde. Debido a que los scripts de perfil pueden hacer cosas que solo tienen sentido en una sesión interactiva (interacción de terminal, iniciar otros programas), cuando se introdujo la invocación de shell remoto ( rsh ), las marcas de rsh decidieron no invocar el shell remoto como un shell de inicio de sesión, para que los scripts de perfil no se ejecuten. (Algunas versiones de rshdtienen una opción para ejecutar el shell remoto como un shell de inicio de sesión). Ssh copió este comportamiento para ser un reemplazo directo de rsh.

Si desea ejecutar sus scripts de perfil, puede invocarlos explícitamente.

ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'

Tenga en cuenta el comando .para cargar los scripts de perfil dentro del shell: son comandos que se ejecutarán dentro de ese shell, no un programa externo.

Si desea establecer una variable de entorno globalmente para todos los usuarios, hay otro método en muchos sistemas: en lugar de definirlo en /etc/profile, defínalo en /etc/environment. Este archivo se lee a través del pam_envmódulo; la mayoría de las distribuciones de Linux están configuradas para leerlo.

Si su shell de inicio de sesión es bash, existe otra posibilidad. Normalmente, no debe establecer variables de entorno en.bashrc (porque no se establecerán en sesiones X, excepto si pasa por un terminal con un shell interactivo, porque no se establecerán si inicia sesión de forma interactiva en una consola de texto o más ssh, porque anularán la configuración personalizada si invoca un shell dentro de otro programa). Sin embargo, bash tiene una característica extraña que nunca he entendido: se lee ~/.bashrcen dos circunstancias no relacionadas:

  • en shells interactivos que no son shells de inicio de sesión;
  • en shells no interactivos que no son shells de inicio de sesión, si bash cree que ha sido invocado por rshdo sshd.

Cuando ejecuta un comando sobre ssh, se encuentra en el segundo caso. Puede organizar la lectura de su perfil leyendo /etc/profiley .profiledesde .bashrc. Incluya el siguiente código en su ~/.bashrc:

case $- in
  *i*) :;; # this is an interactive shell, fine
  *) # This is not an interactive shell! This must be a non-interactive remote shell session.
    . /etc/profile; . ~/.profile
    return;;
esac
Gilles 'SO- deja de ser malvado'
fuente