~/.profilein genere non viene letto durante l'esecuzione ssh somecommand, al contrario di una sessione ssh interattiva (o altro metodo di accesso in cui si avvia una sessione interattiva).
Ssh supporta l'invio di variabili d'ambiente. In OpenSSH, usa la SendEnvdirettiva in ~/.ssh/config. Tuttavia, la variabile di ambiente specifica deve essere abilitata con una AcceptEnvdirettiva nella configurazione del server , quindi potrebbe non funzionare per te.
OpenSSH consente inoltre di impostare variabili di ambiente sul lato server. Ancora una volta, questo deve essere abilitato nella configurazione del server, qui con la PermitUserEnvironmentdirettiva. Le variabili possono essere impostate nel file ~/.ssh/environment. Supponendo che tu utilizzi l'autenticazione con chiave pubblica, puoi anche impostare variabili per chiave in ~/.ssh/authorized_keys: aggiungi environment="FOO=bar"all'inizio della riga pertinente.
Una cosa che penso funzioni sempre (abbastanza stranamente) fintanto che stai usando l'autenticazione con chiave pubblica è (ab) usare l' command=opzione nel authorized_keysfile. Una chiave con commandun'opzione è valida solo per l'esecuzione del comando specificato; ma il comando nel authorized_keysfile viene eseguito con la variabile di ambiente SSH_ORIGINAL_COMMANDimpostata sul comando specificato dall'utente (vuoto per sessioni interattive). Quindi puoi usare qualcosa del genere in ~/.ssh/authorized_keys(ovviamente, non si applicherà se non usi questa chiave per autenticarti):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Nota che ho messo le interruzioni di riga sopra per leggibilità, ma questo in realtà deve essere tutto su una riga.
Un'altra possibilità è scrivere uno script wrapper ~/bin/rsync-wrappersul server, qualcosa del genere
#!/bin/sh
. ~/.profile
exec rsync "$@"
Quindi passare --rsync-path='bin/rsync-wrapper'la rsyncriga di comando. L'argomento a --rsync-pathviene espanso da una shell, quindi se preferisci puoi rendere autonoma la riga di comando rsync passando qualcosa di simile --rsync-path='. ~/.profile; rsync'.
C'è un'altra strada che dipende dal fatto che la shell di accesso sia bash o zsh. Bash legge sempre ~/.bashrcquando viene invocato da rshd o sshd, anche se non è interattivo (ma non se si chiama come sh). Zsh legge sempre ~/.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