Як встановити $ PATH таким чином, що працює `ssh user @ host command`?


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 / bin: / sbin: / bin: / usr / games). На віддаленій машині працює Ubuntu 8.04.

Я впевнений, що міг би зламати його в / etc / profile, але це не є чистим рішенням, і воно працює лише тоді, коли у вас є кореневий доступ.


1
Я спробував додати export PATH=$PATH:$HOME/new_pathдо ~ / .bash_login та ~ / .bash_profile (крім попередньо випробуваних ~ / .bashrc та ~ / .profile). Ні один не працює. В обох випадках мені довелося створити файл.
Денвер Джинджеріч

У моєму конкретному випадку використання не просто змінити команду, надіслану в ssh. Я використовую stfufs ( guru-group.fi/too/sw/stfufs ), який будує команду ssh. Я усвідомлюю, що його метод не є чудовим рішенням, але було б непогано виправити його, не змінюючи stfufs.
Денвер Джинджеріч

Ви можете поставити оболонку для ssh так, щоб викликати stfufs, зателефонувати на справжній ssh ​​із зміненими аргами, якщо це простіше
Hasturkun

Відповіді:


179

Як говорив grawity, ~ / .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, щоб змінити стандартний PATH
басейн

Вам слід додати згадку про .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має бути достатньо У таких проблемах, як правило, я додаю декілька відлунь, щоб побачити, які файли запущені.


Додавання відлуння допомогло ... але я все одно переслідую спосіб виконання 'ssh -X remotemachine "xterm"' і мати повний шлях до системи / користувача з / etc / profile та ~ / home / username / .bash_profile. Якщо я вказую обидва файли в команді, він працює .. але його некрасиво:).
Джесс

Звідки ви знаєте, що "Bash в неінтерактивному режимі читає файл ~/.bashrc"? Я не бачу цього твердження на сторінці сторінки. Дякую
п’ятницю

4
Якщо ви хочете, щоб неінтерактивна оболонка без входу в джерело ~/.bashrc, видається, що вам потрібно додатково встановити змінну середовища BASH_ENV; див. superuser.com/a/585699/100843 . Для неінтерактивних оболонок входу вам, мабуть, доведеться змінити один із трьох сценаріїв запуску, які ви згадали.
п’ятницю

3
Для ZSH неінтерактивним файлом є:.zshenv
математика

2
@math .zshenvзавжди поставлений ; не має значення, інтерактивна вона чи ні.
JoL

19

ssh документація говорить:

Якщо вказана команда, вона виконується на віддаленому хості замість оболонки входу.

тому додавання до файлів bashrc не працює. Однак у вас є такі варіанти:

  1. Якщо PermitUserEnvironmentпараметр встановлений у налаштуваннях sshd, ви можете додати свій параметр PATH~/.ssh/environment

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


1. Він не встановлений у моєму конфігурації sshd і man sshd_configкаже, що він вимкнено за замовчуванням, тому навряд чи це рішення буде працювати для більшості людей. 2. Це працювало б, але я не можу легко змінити команду, надіслану до ssh (див. Другий коментар до мого запитання).
Денвер Джинджеріч

1
1. Не працює, як очікувалося, тому що в ~ / .ssh / середовищі ви не можете додати патчі до PATH, оскільки $ PATH не буде вирішено.
not2savvy


2

Окрім @signpolyma відповіді, перед цим рядком вам доведеться додати експорт

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

Я фактично просто прокоментував ці рядки взагалі - знайдений у ~ / .bashrc на робочому столі Ubuntu 16.04 LTS. Нічого не працює. Також встановіть "Так" для "Дозвіл навколишнього середовища".
Ernie S

2

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

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.