web-dev-qa-db-fra.com

Comment définir $ PATH de sorte que `ssh user @ Host command` fonctionne?

Je n'arrive pas à définir un nouveau $ PATH tel qu'il soit utilisé lors de l'exécution de commandes via ssh user@Host command. J'ai essayé d'ajouter export PATH=$PATH:$HOME/new_path vers ~/.bashrc et ~/.profile sur la machine distante, mais en exécutant ssh user@Host "echo \$PATH" indique que la modification n'a pas été prise en compte (elle indique/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games). La machine distante exécute Ubuntu 8.04.

Je suis sûr que je pourrais le pirater dans/etc/profile, mais ce n'est pas une solution propre et cela ne fonctionne que lorsqu'un utilisateur a un accès root.

123
Denver Gingerich

Comme l'a dit Grawity, ~/.bashrc est ce que vous voulez, car il provient de shells non-interactifs et non interactifs.

Je suppose que le problème que vous rencontrez concerne le fichier Ubuntu ~/.bashrc par défaut. Cela commence généralement par quelque chose comme ceci:

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

Vous voulez mettre n'importe quoi pour les shells non interactifs avant cette ligne.

172
singpolyma

As-tu un ~/.bash_login ou ~/.bash_profile?

Bash en mode interactif recherche ces fichiers et utilise le le premier existant, dans cet ordre:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Donc, si vous avez un ~/.bash_profile, alors quels que soient les changements que vous apportez à ~/.profile sera laissé invisible.

Bash en mode non interactif parfois lit le fichier ~/.bashrc (qui provient aussi souvent des scripts interactifs.) Par "parfois", je veux dire que cela dépend de la distribution: assez curieusement, il existe une option de compilation permettant de l'activer. Debian active le ~/.bashrc lecture, par exemple Arch ne le fait pas.

ssh semble utiliser le mode non interactif, alors ~/.bashrc devrait suffire. Lorsque j'ai des problèmes comme celui-ci, j'ajoute généralement quelques échos pour voir quels fichiers sont en cours d'exécution.

29
grawity

la documentation ssh indique:

Si commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un shell de connexion.

c'est pourquoi l'ajout aux fichiers bashrc ne fonctionne pas. vous avez cependant les options suivantes:

  1. Si l'option PermitUserEnvironment est définie dans la configuration sshd, vous pouvez ajouter votre paramètre PATH à ~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'

20
Hasturkun

Vous pouvez toujours dire:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
6
Chas. Owens

En plus de @signpolyma answer, vous devrez ajouter votre export avant ces lignes

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
2
Happy Coding

J'ai moi-même eu le même problème, résolu avec:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
2
Indie