~/.profile
por lo general, no se lee cuando ejecuta ssh somecommand
, a diferencia de una sesión ssh interactiva (u otro método de inicio de sesión donde inicia una sesión interactiva).
Ssh 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.
OpenSSH también permite configurar variables de entorno en el lado del servidor. Nuevamente, esto debe habilitarse en la configuración del servidor, aquí 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.
Una cosa que creo que siempre funciona (por extraño que parezca) siempre y cuando esté utilizando la autenticación de clave pública es (ab) usar la command=
opción en el authorized_keys
archivo. Una clave 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 (vacío para sesiones interactivas). Por lo tanto, puede usar algo como esto ~/.ssh/authorized_keys
(por supuesto, no se aplicará si no usa esta clave para autenticar):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Tenga en cuenta que puse saltos de línea arriba para la legibilidad, pero en realidad esto debe estar todo en una línea.
Otra posibilidad es escribir un script de envoltura ~/bin/rsync-wrapper
en el servidor, algo así como
#!/bin/sh
. ~/.profile
exec rsync "$@"
Luego pase --rsync-path='bin/rsync-wrapper'
la rsync
línea de comando. El argumento para --rsync-path
se expande mediante un shell, por lo que si lo prefiere, puede hacer que la línea de comando rsync sea autónoma pasando algo como --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