~/.profile
n'est généralement pas lu lorsque vous exécutez ssh somecommand
, contrairement à une session ssh interactive (ou à une autre méthode de connexion où vous démarrez une session interactive).
Ssh prend en charge l'envoi de variables d'environnement. Dans OpenSSH, utilisez la SendEnv
directive dans ~/.ssh/config
. Cependant, la variable d'environnement spécifique doit être activée avec une AcceptEnv
directive dans la configuration du serveur , donc cela risque de ne pas fonctionner pour vous.
OpenSSH permet également de définir des variables d'environnement côté serveur. Encore une fois, cela doit être activé dans la configuration du serveur, ici avec la PermitUserEnvironment
directive. Les variables peuvent être définies dans le fichier ~/.ssh/environment
. En supposant que vous utilisez l'authentification par clé publique, vous pouvez également définir des variables par clé dans ~/.ssh/authorized_keys
: ajouter environment="FOO=bar"
au début de la ligne appropriée.
Une chose qui, selon moi, fonctionne toujours (curieusement) tant que vous utilisez l'authentification par clé publique consiste à (ab) utiliser l' command=
option dans le authorized_keys
fichier. Une clé avec une command
option n'est valable que pour exécuter la commande spécifiée; mais la commande du authorized_keys
fichier s'exécute avec la variable d'environnement SSH_ORIGINAL_COMMAND
définie sur la commande spécifiée par l'utilisateur (vide pour les sessions interactives). Vous pouvez donc utiliser quelque chose comme ça dans ~/.ssh/authorized_keys
(bien sûr, cela ne s'appliquera pas si vous n'utilisez pas cette clé pour vous authentifier):
command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
eval \"$SSH_ORIGINAL_COMMAND\";
else exec \"$SHELL\"; fi" ssh-rsa …
Notez que j'ai mis des sauts de ligne ci-dessus pour plus de lisibilité, mais cela doit en fait être tout sur une seule ligne.
Une autre possibilité consiste à écrire un script wrapper ~/bin/rsync-wrapper
sur le serveur, quelque chose comme
#!/bin/sh
. ~/.profile
exec rsync "$@"
Passez ensuite --rsync-path='bin/rsync-wrapper'
sur la rsync
ligne de commande. L'argument to --rsync-path
est développé par un shell, donc si vous préférez, vous pouvez rendre la ligne de commande rsync autonome en passant quelque chose comme --rsync-path='. ~/.profile; rsync'
.
Il existe une autre avenue qui dépend de votre shell de connexion étant bash ou zsh. Bash lit toujours ~/.bashrc
quand il est invoqué par rshd ou sshd, même s'il n'est pas interactif (mais pas s'il est appelé comme sh
). Zsh lit toujours ~/.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