~ / .profile no se carga cuando se usa SSH (Ubuntu)

22

Editado para reflejar el problema que realmente quería resolver:

Necesito configurar mi entorno rubí para poder implementarlo a través de Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Los puse en ~ deploy / .profile, pero cuando entro, no se están ejecutando. Ideas?

Estoy ejecutando Ubuntu 12.04.


La pregunta original fue:

Cuando ingreso a otra cuenta en localhost, no carga mi .profile. ¿Cómo puedo forzar a ssh a cargarlo? Estoy ejecutando Ubuntu 12.04.

Charles R
fuente

Respuestas:

15

Puede especificar explícitamente que desea iniciar un shell de inicio de sesión interactivo:

 ssh user@host bash --login -i 

El "rol" de ~/.profile(o ~. / Bash_profile) y .bashrcpara ssh tiene algunos otros archivos, (ver man sshpara más detalles):

~ / .ssh / environment

Contiene definiciones adicionales para variables de entorno; ver MEDIO AMBIENTE, arriba.

~ / .ssh / rc

Ssh ejecuta los comandos de este archivo cuando el usuario inicia sesión, justo antes de que se inicie el shell (o comando) del usuario. Consulte la página de manual de sshd (8) para obtener más información.


fuente
"Usted puede" a menudo no es cierto, porque ssh está siendo ejecutado por alguna otra herramienta (entrega continua) y el comando no se puede cambiar fácilmente.
Jan Hudec
6

.profilesolo se carga para shells de inicio de sesión, que no es una sesión ssh (de forma predeterminada). Si desea que algo se ejecute al inicio de todos los shells interactivos, póngalo en su .bashrclugar ( .zshrco lo que sea que use su shell).

Además, si solo desea iniciar sesión en otra cuenta en la máquina local, ssh probablemente sea excesivo. Es posible que desee usar suo algo en su lugar.

qmega
fuente
3
Parece .bashrcque tampoco está cargado.
kenorb
Esto es incorrecto. Se es un shell de entrada. Desde la página de manual: "Si se especifica el comando, se ejecuta en el host remoto en lugar de un shell de inicio de sesión".
mkj
~ / .zshenv funciona para mí. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Cuando a ssh se le da un comando para ejecutar, el valor predeterminado es no asignar un tty y luego el shell tampoco es "interactivo".
Jan Hudec
4

Usar bash debería resultar en lectura ~/.bashrc. Lo siguiente puede ayudar con ksh y sh (bash en modo sh), o cuando ~/.bashrcno se ejecuta durante el inicio de sesión.

El sshd consulta ~/.ssh/environment(verifique los permisos de sshd_config (5)) y ~/.ssh/sshrco ~/.ssh/rc. Esto da la posibilidad de configurar ENV=~/.profileo BASH_ENV=~/.profileySSH_LOGIN=Y

En ~/.profileTengo el siguiente diseño (Reemplazar ENVcon BASH_ENVcuando use bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
fuente
0

Bash ~/.profilesolo lee cuando es un shell de inicio de sesión y ~/.bash.bashrcsolo si tiene un terminal, ninguno de los cuales es verdadero por defecto cuando se invoca un comando con ssh. Sin embargo, hay varias otras opciones para configurar el entorno, en el servidor, todas desafortunadamente dependiendo de la configuración del sistema:

  • Zsh lee ~/.zshenvincluso en este caso; sin embargo, no hay un archivo de configuración correspondiente para bash.
  • Si la PermitUserEnvironmentopción está activada /etc/sshd_config, ssh leerá ~/.ssh/environment. Lamentablemente, esta opción está desactivada por defecto.
  • Si pam_env.sose llama con user_readenv=1in /etc/pam.d/sshd, se leerá ~/.pam_environment. Si bien el módulo no es el predeterminado, se llama así al menos en Ubuntu .
  • Si todo lo demás falla, puede poner una command=directiva en el archivo de claves autorizadas llamando a un script de contenedor que establece el entorno y ejecuta $SSH_ORIGINAL_COMMANDal final (I el comando es uno para shell, por lo que eval es apropiado aquí, pero no estoy seguro) .
Jan Hudec
fuente
0

Probablemente tenga un ~/.bash_profile, que anula ~/.profile.

Mehrdad
fuente