J'ai une commande qui fonctionne correctement si je ssh sur une machine et l'exécute, mais échoue lorsque j'essaie de l'exécuter à l'aide d'une commande ssh distante comme:
ssh user@IP <command>
La comparaison de la sortie de "env" en utilisant les deux méthodes se résume dans différents environnements. Lorsque je me connecte manuellement à la machine et que j'exécute env, j'obtiens beaucoup plus de variables d'environnement que lorsque j'exécute:
ssh user@IP "env"
Une idée pourquoi?
ssh
environment-variables
Tom Feiner
la source
la source
bash
n'est pas un langage de script?Réponses:
Il existe différents types d'obus. Le shell d'exécution de commande SSH est un shell non interactif, tandis que votre shell normal est soit un shell de connexion, soit un shell interactif. La description suit, de man bash:
la source
ssh user@host "bash --login -c 'command arg1 ...'"
le shell distant configurera l'environnement de connexion. La section que vous avez citée mentionne,--login
mais il serait facile de l'oublier.ssh <ssh options> <IP> bash --login my_script.sh
d'exécuter un script sur la machine distante, de travailler un régal et de m'avoir permis d'utiliser avec succès des vars env locaux commeJAVA_HOME
Que diriez-vous de trouver le profil avant d'exécuter la commande?
ssh user@host "source /etc/profile; /path/script.sh"
Vous trouverez peut - être qu'il valait mieux changer cela à
~/.bash_profile
,~/.bashrc
ou peu importe.(Comme ici (linuxquestions.org) )
la source
L'environnement Shell ne se charge pas lors de l'exécution de la commande ssh distante. Vous pouvez modifier le fichier d'environnement ssh:
Son format est:
Vérifiez également la
sshd
configuration pour l'PermitUserEnvironment=yes
option.la source
J'ai eu un problème similaire, mais à la fin j'ai découvert que ~ / .bashrc était tout ce dont j'avais besoin.
Cependant, dans Ubuntu, j'ai dû commenter la ligne qui arrête le traitement de ~ / .bashrc:
la source
/etc/bash.bashrc
.J'ai trouvé une solution facile à ce problème: ajouter le fichier source / etc / profile en haut du fichier script.sh que j'essayais d'exécuter sur le système cible. Sur les systèmes ici, cela a entraîné la configuration des variables d'environnement nécessaires à script.sh comme si elles s'exécutaient à partir d'un shell de connexion.
Dans l'une des réponses précédentes, il a été suggéré d'utiliser ~ / .bashr_profile etc ... Je n'y ai pas passé beaucoup de temps, mais le problème est que si vous utilisez un utilisateur différent sur le système cible que le shell du système source à partir duquel vous vous connectez, il me semble que cela provoque l'utilisateur du système source. nom à utiliser pour le ~.
la source
Exportez simplement les variables d'environnement que vous voulez au-dessus de la recherche d'un shell non interactif dans ~ / .bashrc.
la source