Как установить PATH при запуске команды ssh?


18

Предполагая, что пользователь имеет /bin/bashв качестве оболочки в /etc/passwd. Затем ssh user@host commandзапускает команду, используя Bash. Однако эта оболочка не является ни логином, ни интерактивной, что означает, что она не является ~/.bash_profileни ~/.bashrcисточником. В таком случае, как установить PATHпеременную среды так, чтобы исполняемые файлы можно было найти и выполнить? Рекомендуется ли ставить перед командой префикс source ~/.bashrc?


5
.bashrcИсточник, но он, вероятно, имеет тест на интерактивность в верхней части. Вещи, которые вы ставите перед этой проверкой, должны применяться, и это то, что я делаю, чтобы заставить PATH, когда сервер не разрешает пользовательскую среду или использование ~/.pam_environment.
Муру

Ответы:


18

У вас есть несколько возможностей:

  • Установите PATHна сервере в ~/.ssh/environment(должен быть включен PermitUserEnvironment yesв sshd_config).
  • Используйте полный путь к бинарному файлу
  • Как вы уже упоминали, источник .bashrc: вручную префикс команды с . ~/.bashrc(или source)

Это в значительной степени зависит от варианта использования, в какую сторону вы пойдете.


6
Вручную поиск ~/.bashrcне является необходимым, это происходит по умолчанию. Это факт, мне кажется плохой идеей.
соронтар

$PATHне расширяется ~/.ssh/environment, по крайней мере, не в OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019.
Яакко

1
@Jaakko Вероятно, он отключен в sshd_config PermitUserEnvironment(по умолчанию в последних версиях)
Jakuje

Я понял это, это не расширялось, потому что я добавил строку PATH="$PATH:/new/path"к своему, ~/.ssh/environmentкогда это должно было бытьPATH=$PATH:/new/path
Jaakko

4

Вы приравниваете локальные настройки к удаленным настройкам.

Локально, экземпляр bash, текущая запущенная оболочка, в которой вы пишете:

ssh user@host command

Выполнит команду ssh (ничего более) как клиент ssh.
Для этого локальной оболочке не нужно запускать вложенную оболочку или новую оболочку или вход в систему.

Команда выполняется как lsкоманда: локально.

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

Это новый Remote оболочки обязательно будет Войти оболочки , как удаленный пользователь (к этой системе) необходимо пройти проверку подлинности входа в систему . Или, если задана какая-то конкретная команда, просто запустите такую ​​команду с привилегиями аутентифицированного пользователя.

Вы можете увидеть, какие файлы получены, добавив $file sourcedв начало каждого файла (в удаленной системе) (root нужен для изменения /etc/файлов):

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

А затем просто запустите консоль ssh:

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

В этом случае оба bashrcфайла были прочитаны, потому что у каждого profileфайла были команды для их включения, а не потому, что оболочка входа в систему непосредственно их получала.

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

В этой системе, где bashrcчитается в обоих случаях.

Нет необходимости добавлять source ~/.bashrcк команде для выполнения.

Изменить ПУТЬ

Все, что вам нужно сделать, это включить правильные настройки для изменения «$ PATH», либо /etc/bash.bashrcдля всех пользователей, которые запускают оболочку в этой системе. Или ~/.bashrcдля каждого пользователя, который нуждается в этом. Вы можете добавить (или изменить) в скелет пользователя , .bashrcчтобы /etc/skel/иметь какой - либо новый пользователь , созданный иметь правильный файл доступный.

Вышесказанное действует только для bash. Если вам нужно, чтобы этот параметр работал для всех оболочек, возможно, установите переменную среды PATH, используя файл ssh ~/.ssh/environmentдля каждого пользователя, который в этом нуждается. Или используйте /etc/ssh/sshrcглобальный параметр в системе, где работает ssh-сервер ( man sshdдля получения дополнительной информации прочтите раздел «Файлы» ).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.