web-dev-qa-db-fra.com

Comment définir PATH lors de l'exécution d'une commande ssh?

En supposant que l'utilisateur a /bin/bash comme Shell dans /etc/passwd. Alors ssh user@Host command exécute la commande à l'aide de Bash. Cependant, ce Shell n'est ni de connexion ni interactif, ce qui signifie ni ~/.bash_profile ni ~/.bashrc provient. Dans ce cas, comment définir la variable d'environnement PATH pour que les exécutables puissent être trouvés et exécutés? Est-il recommandé de préfixer la commande réelle avec source ~/.bashrc?

20
Cyker

Vous avez peu de possibilités:

  • Définissez PATH sur le serveur dans ~/.ssh/environment (doit être activé par PermitUserEnvironment yes dans sshd_config).
  • Utiliser le chemin complet vers le binaire
  • Comme vous l'avez mentionné, source manuellement .bashrc: préfixez la commande avec . ~/.bashrc (ou source)

Cela dépend à peu près du cas d'utilisation, dans quelle direction vous irez.

21
Jakuje

Vous associez les paramètres locaux aux paramètres distants .

Localement, une instance bash, le shell en cours d'exécution dans lequel vous écrivez:

ssh user@Host command

Exécute la commande ssh (rien de plus) en tant que client ssh.
Pour ce faire, le shell local a besoin pas pour démarrer un sous-shell ou un nouveau shell ou se connecter .

La commande est exécutée comme une commande ls est: localement.

C'est la commande client ssh qui ouvre une connexion réseau à un système distant , où, s'il est correctement authentifié, un nouvea Shell sera démarré pour exécuter la commande écrite comme argument dans ssh, ou, si aucun argument n'est donné, attendez d'autres commandes sur cette connexion.

Ce nouveau shell distant sera nécessairement un shell de connexion car l'utilisateur distant (sur ce système) doit être authentifié pour se connecter. Ou, si une commande spécifique est donnée, exécutez simplement cette commande avec les privilèges utilisateur authentifiés.

Vous pouvez voir quels fichiers proviennent en ajoutant un $file sourced au début de chaque fichier (dans le système distant) (la racine est nécessaire pour changer /etc/ des dossiers):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

Et puis il suffit de démarrer une console ssh:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

Dans ce cas, les deux fichiers bashrc ont été lus parce que chaque fichier profile avait des commandes pour les inclure, et non parce que le shell de connexion les avait directement obtenus.

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

Dans ce système, où bashrc est lu dans les deux cas.

Pas besoin d'ajouter un source ~/.bashrc à la commande à exécuter.

Changer le CHEMIN

Tout ce que vous devez faire est d'inclure les paramètres corrects pour modifier le "$ PATH", soit dans /etc/bash.bashrc pour tous les utilisateurs qui démarrent un shell dans ce système. Ou dans ~/.bashrc pour chaque utilisateur qui en a besoin. Vous pouvez ajouter (ou modifier) ​​un squelette d'un utilisateur .bashrc à /etc/skel/ pour que tout nouvel utilisateur créé ait le bon fichier disponible.

Ce qui précède n'est valable que pour bash. Si vous avez besoin que le paramètre fonctionne pour tous les shells, définissez probablement la variable d'environnement PATH à l'aide du fichier ssh ~/.ssh/environment pour chaque utilisateur qui en a besoin. Ou utiliser /etc/ssh/sshrc pour un paramètre global dans le système où le serveur ssh est exécuté (veuillez lire la section Fichiers dans man sshd pour quelques détails supplémentaires).

5
Isaac