Как мне установить $ PATH таким образом, чтобы `ssh user @ host command` работал?

111

Я не могу установить новый $PATH, чтобы он использовался при выполнении команд через ssh user@host command. Я попытался добавить export PATH=$PATH:$HOME/new_path в ~/.bashrc и ~/.profile на удаленном компьютере, но выполнение ssh user@host "echo \$PATH" показывает, что это изменение не было выбрано (оно показывает/usr/local/sbin:/usr/local/бен:/USR/SBIN:/USR/бен:/SBIN:/бен:/USR/игры). На удаленном компьютере работает Ubuntu 8.04.

Я уверен, что я мог взломать его в /etc/profile, но это не чистое решение, и оно работает только при наличии доступа root.

  • 1
    Я попытался добавить export PATH=$PATH:$HOME/new_path в ~ / .bash_login и ~ / .bash_profile (в дополнение к ранее опробованным ~ / .bashrc и ~ / .profile). Ни то, ни другое не работает. В обоих случаях мне пришлось создать файл.
  • 0
    В моем конкретном случае использования изменить команду, отправляемую в ssh, нелегко. Я использую stfufs ( guru-group.fi/too/sw/stfufs ), которая сама создает команду ssh. Я понимаю, что его метод не является отличным решением, но было бы неплохо исправить его без изменения stfufs.
Показать ещё 1 комментарий
Теги:
ssh
path

6 ответов

146
Лучший ответ

Как сказано в гравюре, ~/.bashrc - это то, что вы хотите, поскольку оно получено неинтерактивными оболочками без входа.

Я ожидаю, что проблема, с которой вы столкнулись, связана с файлом Ubuntu ~/.bashrc по умолчанию. Обычно он начинается с чего-то вроде этого:

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

Вы хотите поставить что-либо для неинтерактивных оболочек перед этой строкой.

  • 1
    Да, я переместил export PATH=$PATH:$HOME/new_path выше этой строки, и это сработало. Спасибо!
  • 3
    .bashrc ненадежен. man bash: «Bash пытается определить, когда он запускается со стандартным входом, подключенным к сетевому соединению». Это работает на RHEL, но не на Archlinux. Мне пришлось отредактировать / etc / environment, чтобы изменить путь по умолчанию
Показать ещё 1 комментарий
30

У вас есть ~/.bash_login или ~/.bash_profile?

Bash в интерактивном режиме проверяет эти файлы и использует первый существующий в следующем порядке:

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

Итак, если у вас есть ~/.bash_profile, то любые изменения, которые вы делаете в ~/.profile, будут недоступны.

Bash в неинтерактивном режиме иногда читает файл ~/.bashrc (который также часто является источником из интерактивных скриптов.) Под "иногда" я подразумеваю, что он зависит от распределения: довольно странно, есть параметр времени компиляции для включения этого. Debian позволяет читать ~/.bashrc, в то время как, например, Arch не делает.

ssh похоже, использует неинтерактивный режим, , поэтому ~/.bashrc должно быть достаточно. При возникновении таких проблем обычно я добавляю несколько эхо-сигналов, чтобы увидеть, какие файлы запускаются.

  • 0
    Добавление эха помогло ... но я все еще ищу способ выполнить 'ssh -X remotemachine "xterm"' и получить полный системный / пользовательский путь из / etc / profile и ~ / home / username / .bash_profile. Если я использую оба файла в команде, это работает .. но это ужасно :).
  • 0
    Откуда вы знаете, что «Bash в неинтерактивном режиме читает файл ~/.bashrc »? Я не вижу этого утверждения на странице руководства. Спасибо
Показать ещё 4 комментария
18

Документация ssh гласит:

Если задана команда, она выполняется на удаленном хосте вместо оболочки входа.

поэтому добавление к файлам bashrc не работает. однако у вас есть следующие возможности:

  • Если параметр PermitUserEnvironment задан в конфигурации sshd, вы можете добавить свой параметр PATH в ~/.ssh/environment

  • ssh remotemachine 'bash -l -c "somecommand"'

  • 0
    1. Это не установлено в моем конфиге sshd, и man sshd_config говорит, что по умолчанию он выключен, поэтому вряд ли это решение подойдет большинству людей. 2. Это будет работать, но я не могу легко изменить команду, отправленную в ssh (см. Второй комментарий к моему вопросу).
  • 1
    1. Не работает должным образом, потому что в ~ / .ssh / environment вы не можете добавлять патчи в PATH, потому что $ PATH не будет разрешен.
6

Вы всегда можете сказать:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
  • 0
    Это решение не требует каких-либо изменений на удаленном компьютере, и это хорошо.
2

В дополнение к ответу @signpolyma вам нужно будет добавить свой экспорт до этих строк

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
  • 0
    Я на самом деле только что закомментировал эти строки - в ~ / .bashrc на рабочем столе Ubuntu 16.04 LTS. Нет все работает. Также установите PermitUserEnvironment в значение yes.
2

Просто у меня была такая же проблема, я решил ее:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню