~/.profile
in 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 SendEnv
direttiva in ~/.ssh/config
. Tuttavia, la variabile di ambiente specifica deve essere abilitata con una AcceptEnv
direttiva 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 PermitUserEnvironment
direttiva. 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_keys
file. Una chiave con command
un'opzione è valida solo per l'esecuzione del comando specificato; ma il comando nel authorized_keys
file viene eseguito con la variabile di ambiente SSH_ORIGINAL_COMMAND
impostata 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-wrapper
sul server, qualcosa del genere
#!/bin/sh
. ~/.profile
exec rsync "$@"
Quindi passare --rsync-path='bin/rsync-wrapper'
la rsync
riga di comando. L'argomento a --rsync-path
viene 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 ~/.bashrc
quando 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