268 votes

Pourquoi une commande distante SSH devient-elle moins variables d’environnement puis en actionnant manuellement ?

J’ai une commande qui fonctionne très bien si j’ai ssh à une machine et de la course, mais ne réussit pas quand j’essaye de l’exécuter en utilisant une télécommande ssh commande telle que :

En comparant la sortie de « env » en utilisant les deux méthodes resutls dans des environnements différents. Lorsque j’ai manuellement la connexion à la machine et de l’exécution env, je reçois beaucoup plus variables d’environnement, puis quand je lance :

Aucune idée pourquoi ?

184voto

Vinko Vrsalovic Points 116138

Il existe différents types de coquillages. Le SSH exécution d'une commande shell non-interactif shell, alors que la normale de votre shell est un shell de connexion ou un shell interactif. La Description suit, à partir de l'homme bash:

 Un shell de connexion est celle dont le premier caractère de l'argument
 zéro est un -, ou l'on a commencé avec l'option --login.

 Un shell interactif est celui qui a débuté en l'absence d'une option
 arguments et sans l'option-c, dont l'entrée standard
 et l'erreur sont connectés aux bornes (tel que déterminé
 par isatty(3)), ou l'on a commencé avec l'option-i. PS1 est
 définir et $- comprend je si bash est interactif, ce qui permet une
 shell script ou un fichier de démarrage pour tester cet état.

 Les paragraphes suivants décrivent comment bash exécute ses
 les fichiers de démarrage. Si l'un des fichiers existent mais ne peut pas être
 lire, bash signale une erreur. Tildes sont développés dans le fichier
 des noms comme décrit ci-dessous en vertu de l'Expansion du Tilde
 L'EXPANSION de la section.

 Lorsque bash est invoqué comme un shell de connexion interactif, ou en tant que
 un non-shell interactif avec l'option --login, il est d'abord
 lit et exécute les commandes dans le fichier /etc/profile, si
 ce fichier existe. Après la lecture de ce fichier, il recherche
 ~/.bash_profile, ~/.bash_login, et ~/.de profil, en ce que
 l'ordre, et lit et exécute les commandes à partir de la première
 qui existe et est lisible. L' --noprofile option peut
 être utilisé lorsque le shell est lancé pour inhiber cette behav
ior.

 Quand un shell de connexion des sorties, bash lit et exécute les commandes
 dans le fichier ~/.bash_logout, si elle existe.

 Quand un shell interactif qui n'est pas un shell de connexion est
 commencé, bash lit et exécute les commandes à partir de ~/.bashrc,
 si ce fichier existe. Cela peut être inhibée par l'aide de la
 --norc option. L' --rcfile fichier option force bash
 de lire et d'exécuter des commandes à partir d'un fichier au lieu de
~/.bashrc.

 Lorsque bash est lancé en mode non interactif, d'exécuter un shell
 script, par exemple, il recherche la variable BASH_ENV dans
 l'environnement, élargit sa valeur s'il y figure,
 et utilise l'élargissement de la valeur que le nom d'un fichier à lire
 et de les exécuter. Bash se comporte comme si la commande suivante
 ont été exécutées:
 if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
 mais la valeur de la variable PATH n'est pas utilisé pour la recherche
 pour le nom de fichier.

125voto

Ian Vaughan Points 3510

Que diriez-vous d’approvisionnement du profil avant d’exécuter la commande ?

``

Il peut s’avérer préférable de changer cela pour , , ou que ce soit.

(Comme ici (linuxquestions.org))

106voto

dpedro Points 311

Environnement du shell ne se charge pas lorsque vous exécutez distant ssh command. Vous pouvez modifier ssh fichier d’environnement :

Son format est :

En outre, vérifiez la configuration de sshd pour PermitUserEnvironment = option Oui.

70voto

tomaszbak Points 1438

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 cesse de traiter ~ / .bashrc:

 #If not running interactively, don't do anything
[ -z "$PS1" ] && return
 

4voto

Chuck Points 21

J'ai trouvé facilement la résolution de ce problème a été ajouter source /etc/profile vers le haut de la script.sh fichier j'ai essayé de l'exécuter sur le système cible. Sur les systèmes d'ici, de ce fait, les variables d'environnement qui ont été nécessaires par script.sh pour être configuré comme s'exécute à partir d'un shell de connexion.

Dans une des réponses, il a été suggéré que ~/.bashr_profile etc... être utilisés. Je n'ai pas passé beaucoup de temps sur ce sujet, mais, le problème avec ceci est que si vous en ssh à un autre utilisateur sur le système cible que le shell sur le système source à partir de laquelle vous vous connectez, il m'est apparu que cela provoque la source de système de nom d'utilisateur à utiliser pour l' ~.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X