~/.profile
solo se ejecuta mediante shells de inicio de sesión. El programa que llama al shell decide si el shell será un shell de inicio de sesión (colocando un -
como el primer carácter del argumento zeroth en la invocación del shell). Por lo general, no se ejecuta cuando inicia sesión para ejecutar un comando específico.
OpenSSH en particular invoca un shell de inicio de sesión solo si no especifica un comando. Entonces, si especifica un comando, ~/.profile
no se leerá.
OpenSSH permite configurar variables de entorno en el lado del servidor. Esto debe habilitarse en la configuración del servidor , con la PermitUserEnvironment
directiva. Las variables se pueden establecer en el archivo ~/.ssh/environment
. Suponiendo que use la autenticación de clave pública, también puede establecer variables por clave en ~/.ssh/authorized_keys
: agregar environment="FOO=bar"
al comienzo de la línea correspondiente.
Ssh también admite el envío de variables de entorno. En OpenSSH, use la SendEnv
directiva en ~/.ssh/config
. Sin embargo, la variable de entorno específica debe habilitarse con una AcceptEnv
directiva en la configuración del servidor, por lo que es posible que esto no funcione para usted.
Una cosa que creo que siempre funciona (por extraño que parezca) siempre que esté utilizando la autenticación de clave pública es (ab) usar la command=
opción en el authorized_keys
archivo . Una tecla con una command
opción es buena solo para ejecutar el comando especificado; pero el comando en el authorized_keys
archivo se ejecuta con la variable de entorno SSH_ORIGINAL_COMMAND
establecida en el comando que especificó el usuario. Esta variable está vacía si el usuario no especificó un comando y, por lo tanto, esperaba un shell interactivo. Por lo tanto, puede usar algo como esto ~/.ssh/authorized_keys
(por supuesto, no se aplicará si no usa esta clave para autenticar):
command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa …
Otra posibilidad es escribir scripts de envoltura en el servidor. Algo como lo siguiente en ~/bin/ssh-wrapper
:
#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"
Luego haga enlaces simbólicos a este script llamado rsync
, unison
etc. Pase --rsync-path='bin/rsync'
la rsync
línea de comando, y así sucesivamente para otros programas. Alternativamente, algunos comandos le permiten especificar un fragmento de shell completo para que se ejecute de forma remota, lo que le permite hacer que el comando sea autónomo: por ejemplo, con rsync, puede usarlo --rsync-path='. ~/.profile; rsync'
.
Hay otra vía que depende de que su shell de inicio de sesión sea bash o zsh. Bash siempre lee ~/.bashrc
cuando es invocado por rshd o sshd, incluso si no es interactivo (pero no si se llama como sh
). Zsh siempre lee ~/.zshenv
.
## ~/.bashrc
if [[ $- != *i* ]]; then
# Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
. ~/.profile
fi
## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
# Not a login shell, but this is an rsh/ssh session
. ~/.profile
fi