¿Cómo configuro $ PATH de modo que funcione el comando `ssh user @ host command`?

129

Parece que no puedo establecer un nuevo $ PATH tal que se use al ejecutar comandos a través de ssh user@host command. He intentado agregar export PATH=$PATH:$HOME/new_patha ~ / .bashrc y ~ / .profile en la máquina remota, pero la ejecución ssh user@host "echo \$PATH"muestra que el cambio no se ha recogido (muestra / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). La máquina remota está ejecutando 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.

Denver Gingerich
fuente
1
He intentado agregar export PATH=$PATH:$HOME/new_pathtanto a ~ / .bash_login como a ~ / .bash_profile (además de los ~ / .bashrc y ~ / .profile probados anteriormente). Ninguno de los dos funciona. En ambos casos tuve que crear el archivo.
Denver Gingerich
En mi caso de uso particular, no es fácil modificar el comando enviado a ssh. Estoy usando stfufs ( 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 stfufs.
Denver Gingerich
Se puede poner una envoltura ssh en forma stfufs', llame al ssh real con args modificados, si eso es más fácil
Hasturkun

Respuestas:

179

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

Espero que el problema que tienes tenga que ver con el archivo predeterminado de Ubuntu ~ / .bashrc. Suele comenzar con algo como esto:

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

Desea colocar cualquier cosa para shells no interactivos antes de esta línea.

singpolyma
fuente
1
Sí, moví la export PATH=$PATH:$HOME/new_pathlínea de arriba y funcionó. ¡Gracias!
Denver Gingerich
3
.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 predeterminada
basin
Debería agregar una mención .zshenvpara los usuarios de zsh, me tomó bastante tiempo encontrarlo en los comentarios sobre otras respuestas
Mike
30

¿Tienes un ~/.bash_logino ~/.bash_profile?

Bash en modo interactivo busca estos archivos y usa el primero existente , en este orden:

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

Entonces, si tiene un ~/.bash_profile, entonces cualquier cambio que haga no ~/.profilese verá.

Bash en modo no interactivo a veces lee el archivo ~/.bashrc(que a menudo también se obtiene de los scripts interactivos). Por "a veces" quiero decir que depende de la distribución: curiosamente, hay una opción de tiempo de compilación para habilitar esto . Debian permite la ~/.bashrclectura, mientras que, por ejemplo, Arch no.

ssh parece estar usando el modo no interactivo, entonces ~/.bashrcdebería ser suficiente. Cuando tengo problemas como este, generalmente agrego algunos ecos para ver qué archivos se están ejecutando.

usuario1686
fuente
Agregar los ecos ayudó ... pero todavía estoy buscando una forma de ejecutar 'ssh -X remotemachine "xterm"' y tener el sistema completo / ruta de usuario desde / etc / profile y ~ / home / username / .bash_profile. Si obtengo ambos archivos en el comando, funciona ... pero es feo:).
Jess
¿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
44
Si desea que se forme un shell no interactivo que no sea de inicio de sesión ~/.bashrc, parece que necesita establecer adicionalmente la variable de entorno BASH_ENV; ver superuser.com/a/585699/100843 . Para shells de inicio de sesión no interactivos, probablemente tenga que modificar uno de los tres scripts de inicio que mencionó.
nknight
3
Para ZSH el archivo no interactivo es:.zshenv
matemáticas
2
@math .zshenvsiempre se obtiene; no importa si es interactivo o no.
JoL
19

la documentación de ssh dice:

Si se especifica el comando, se ejecuta en el host remoto en lugar de un shell de inicio de sesión.

Es por eso que agregar a los archivos bashrc no funciona. Sin embargo, tiene las siguientes opciones:

  1. Si la PermitUserEnvironmentopción está configurada en la configuración sshd, puede agregar su configuración de RUTA a~/.ssh/environment

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

Hasturkun
fuente
1. No está configurado en mi configuración sshd y man sshd_configdice 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 (vea el segundo comentario sobre mi pregunta).
Denver Gingerich
1
1. No funciona como se esperaba, porque en ~ / .ssh / environment, no puede agregar pathes a PATH, porque $ PATH no se resolverá.
not2savvy
8

Siempre puedes decir:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
Chas Owens
fuente
Esta solución no necesita ningún cambio en la máquina remota, lo cual es algo bueno.
Ronny Andersson
2

Además de la respuesta @signpolyma, deberá agregar su exportación antes de estas líneas

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Codificación feliz
fuente
De hecho, acabo de comentar estas líneas por completo, que se encuentran en ~ / .bashrc en el escritorio Ubuntu 16.04 LTS. No todo funciona. Establezca también PermitUserEnvironment en yes.
Ernie S
2

Solo tuve el mismo problema, lo resolví con:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Indie
fuente