J'ai un utilisateur qui n'a apporté aucune modification au $ PATH dans aucun fichier dot: c'est exactement le paramètre par défaut du système. Depuis un shell de connexion:
$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash
echo "$SHELL"
echo "$PATH"
user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin
Exactement comme spécifié dans /etc/profile
. Je trouve cela plutôt inattendu:
$ ssh example.com '/tmp/hello.sh'
/bin/bash
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
Comme je l'ai dit, il n'y a pas de modification de $ PATH dans ~/.bashrc
, ni dans /etc/bash.bashrc
. Non ~/.ssh/environment
non plus. La ssh(1)
déclare que la variable d'environnement PATH
est
Définissez le PATH par défaut, comme spécifié lors de la compilation de ssh.
mais ce fil de StackOverflow et cet article de liste de diffusion suggèrent que je devrais être capable d'influencer $ PATH pour une commande donnée simplement en modifiant / etc / profile, l'un des fichiers de démarrage du shell, etc.
Que se passe t-il ici?
.bashrc
pourrait également fonctionner, mais dans l'ensemble, je contournerais cela si PATH est important. Ou pourquoi ne pas simplement spécifier des chemins d'accès complets si vous avez besoin de la méthode «command» pour exécuter ssh? :)bash(1)
INVOCATION suggère qu'aucun fichier de démarrage n'est lu de cette façon, mais je ne trouve pas de documentation sur la façon dont ssh appelle le shell. Cela semble contraire aux sources liées ci-dessus, sauf si d'autres ont le fichier de démarrage / etc / ssh / sshrc que je n'ai pas. (Il existe des solutions de contournement, bien sûr, mais il s'agit de comprendre exactement comment Debian SSHD gère les chemins par défaut.)/etc/profile
les mises à jour du chemin de ma boîte distante pour moi, alorsssh user@remotebox 'env'
me montre le PATH mis à jour. La même chose se passe si j'ajouteexport PATH=$PATH:/my/testpath
à .bashrc (mais dans mon cas en haut du fichier avant de vérifier les shells interactifs (-z "$PS1"
).J'ai pu obtenir ssh pour exécuter des commandes en utilisant le chemin d'accès distant en exécutant:
Ici, env peut être remplacé par la commande que vous souhaitez.
J'ai des clés autorisées, je n'ai donc pas eu besoin d'un mot de passe pour exécuter la commande ou ssh.
la source
J'ai trouvé une solution différente pour résoudre le problème. Ma préférence personnelle est de créer de nouveaux fichiers de configuration au lieu de modifier ceux existants. De cette façon, je peux plus facilement supprimer les modifications de la configuration par défaut.
Voici le contenu de
/etc/profile.d/ssh_login.sh
:En utilisant
dropbear
à la place deopenssh-server
(cela devrait également fonctionner avec openssh), la variable SSH_CONNECTION est définie automatiquement lorsque je me connecte à distance. J'ai créé une nouvelle configuration de profil de shell pour détecter les connexions SSH, afficher certaines informations à l'écran et, surtout, charger les paramètres d'environnement global à partir de/etc/environment
pour remplacer les valeurs compilées. Veuillez noter que cela n'affecte que les shells SSH interactifs, pas l'exécution des commandes à distance.Alternativement , si vous utilisez openssh et que vous souhaitez toujours charger l'environnement global, qu'il s'agisse d'un shell interactif, vous pouvez placer un lien symbolique
~/.ssh/
comme ceci:Ensuite, vous devez activer l'
PermitUserEnvironment
option dans/etc/sshd/sshd_config
. Ne faites cela que pour les utilisateurs de confiance, car cela pourrait leur permettre de contourner les restrictions d'accès dans certaines configurations à l'aide de mécanismes tels que LD_PRELOAD. Veuillez consulterman sshd_config
pour plus d'informations, en particulier comment utiliser desMatch
blocs pour contraindre les options à des utilisateurs / groupes spécifiques.la source
Si vous souhaitez charger le chemin du profil, essayez:
en haut du script. De cette façon, le shell est en mode interactif lors de l'exécution du script.
http://linux.die.net/man/1/bash
la source