~/.profilesolo 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, ~/.profileno se leerá.
OpenSSH permite configurar variables de entorno en el lado del servidor. Esto debe habilitarse en la configuración del servidor , con la PermitUserEnvironmentdirectiva. 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 SendEnvdirectiva en ~/.ssh/config. Sin embargo, la variable de entorno específica debe habilitarse con una AcceptEnvdirectiva 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_keysarchivo . Una tecla con una commandopción es buena solo para ejecutar el comando especificado; pero el comando en el authorized_keysarchivo se ejecuta con la variable de entorno SSH_ORIGINAL_COMMANDestablecida 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, unisonetc. Pase --rsync-path='bin/rsync'la rsynclí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 ~/.bashrccuando 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