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

129

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

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

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

Ответы:

180

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

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

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

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

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

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

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

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

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

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

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

user1686
источник
Добавление эха помогло ... но я все еще ищу способ выполнить 'ssh -X remotemachine "xterm"' и получить полный путь к системе / пользователю из / etc / profile и ~ / home / username / .bash_profile. Если я использую оба файла в команде, она работает .. но уродливо :).
Джесс
Откуда вы знаете, что «Bash в неинтерактивном режиме читает файл ~/.bashrc»? Я не вижу этого утверждения на странице руководства. Спасибо
nknight 01
4
Если вы хотите использовать в качестве источника неинтерактивную оболочку без входа в систему ~/.bashrc, кажется, что вам нужно дополнительно установить переменную среды BASH_ENV; см. superuser.com/a/585699/100843 . Для неинтерактивных оболочек входа вам, вероятно, придется изменить один из трех сценариев запуска, которые вы упомянули.
nknight
3
Для ZSH неинтерактивный файл:.zshenv
math
2
Источник @math .zshenvвсегда; неважно, интерактивный он или нет.
JoL 01
19

В документации по ssh говорится:

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

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

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

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

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

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

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'
Чес. Owens
источник
Это решение не требует изменений на удаленной машине, что хорошо.
Ронни Андерссон
2

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

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

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

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Инди
источник