2009-06-02 6 views
112

Parece que no puedo establecer una nueva $ PATH de modo que se use al ejecutar comandos a través del ssh [email protected] command. He intentado agregar export PATH=$PATH:$HOME/new_path a ~/.bashrc y ~/.profile en la máquina remota, pero ejecutando ssh [email protected] "echo \$PATH" muestra que el cambio no se ha recogido (muestra/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/juegos). La máquina remota ejecuta Ubuntu 8.04.

Estoy seguro de que podría hackearlo en/etc/profile, pero esa no es una solución limpia y solo funciona cuando uno tiene acceso de root.

+0

He intentado añadir ' export PATH = $ PATH: $ HOME/new_path' a ~/.bash_login y ~/.bash_profile (además del ~/.bashrc previamente probado y ~/.profile). Ninguno de los dos funciona En ambos casos, tuve que crear el archivo. –

+0

En mi caso particular de uso, no es fácil modificar el comando enviado a ssh. Estoy usando stfufs (http://www.guru-group.fi/too/sw/stfufs/), que construye el comando ssh en sí. Me doy cuenta de que su método no es una gran solución, pero sería bueno arreglarlo sin modificar los stfufs. –

+0

Puedes poner un envoltorio ssh de la mejor manera, llama al ssh real con args modificados, si es más fácil – Hasturkun

Respuesta

152

Como dijo grawity , ~/.bashrc es lo que desea, ya que proviene de shells no interactivos que no son de inicio de sesión.

Supongo que el problema que está teniendo tiene que ver con el archivo Ubuntu ~/.bashrc predeterminado.Por lo general comienza con algo como esto:

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

usted quiere poner nada de conchas no interactivas antes de esta línea.

+1

Sí, moví 'export PATH = $ PATH: $ HOME/new_path' por encima de esa línea y funcionó. ¡Gracias! –

+2

.bashrc no es confiable. man bash: "Bash intenta determinar cuándo se está ejecutando con su entrada estándar conectada a una conexión de red". Esto funciona en RHEL, pero no en Archlinux. Tuve que editar/etc/environment para cambiar la ruta de acceso predeterminada – basin

6

Siempre se puede decir:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH' 
+0

Esta solución no necesita ningún cambio en el equipo remoto, lo cual es una buena cosa. –

29

¿Tiene una ~/.bash_login o ~/.bash_profile?

Bash en los controles de modo interactivo para estos archivos, y utiliza el primera existente, en este orden:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Así que si tener un ~/.bash_profile, luego cualquier cambio que haga a ~/.profile no se verá.

Bash en modo no interactivo veces lee el archivo ~/.bashrc (que es también a menudo source'd de las secuencias de comandos interactivos.) Por "a veces" quiero decir que depende de la distribución: bastante extraño, hay una opción de tiempo de compilación para habilitar esto. Debian habilita la lectura ~/.bashrc, mientras que p. Arch no.

ssh parece estar utilizando el modo no interactivo, por lo que ~/.bashrc debería ser suficiente. Cuando tengo problemas como este, generalmente agrego algunos ecos para ver qué archivos se están ejecutando.

+0

Agregando los ecos ayudados ... pero todavía estoy buscando una manera de ejecutar 'ssh -X remotemachine "xterm"' y tengo la ruta completa del sistema/usuario desde/etc/profile y ~/home/username/.bash_profile . Si fuente ambos archivos en el comando, funciona ... pero es feo:). – Jess

+0

¿Cómo sabes que "Bash en modo no interactivo lee el archivo' ~/.bashrc' "? No veo esta declaración en la página de manual. Gracias – nknight

+3

Si desea un shell que no sea de inicio de sesión no interactivo para la fuente '~/.bashrc', parece que necesita establecer adicionalmente la variable de entorno' BASH_ENV'; ver http://superuser.com/a/585699/100843. Para los shells de inicio de sesión no interactivos, probablemente tenga que modificar uno de los tres scripts de inicio que mencionó. – nknight

18

documentación de ssh dice:

Si se especifica comando, se ejecuta en el host remoto en lugar de un shell de entrada.

por lo que no funciona agregar archivos bashrc. Sin embargo, usted tiene las siguientes opciones:

  1. Si la opción PermitUserEnvironment se establece en la configuración sshd, puede añadir su camino de ajuste a ~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'

+0

1. No está configurado en mi configuración de sshd y 'man sshd_config' dice que está desactivado de manera predeterminada, por lo que es poco probable que esta solución funcione para la mayoría de las personas. 2. Esto funcionaría, pero no puedo modificar fácilmente el comando enviado a ssh (ver el segundo comentario sobre mi pregunta). –

+1

1. No funciona como se esperaba, porque en ~/.ssh/environment, no puede agregar pathes a PATH, porque $ PATH no se resolverá. – not2savvy

2

Sólo tenían el mismo problema por mí mismo, resuelto con:

ssh [email protected] PATH=\$HOME/bin:\$PATH\; remote-command 
2

Además de @signpolyma respuesta, usted tendrá que añadir su exportación antes de que estas líneas

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
+0

De hecho, acabo de comentar estas líneas en conjunto, que se encuentran en ~/.bashrc en el escritorio Ubuntu 16.04 LTS. No todo funciona Configure también PermitUserEnvironment en yes. – Ernie

Cuestiones relacionadas