3

Я провожу большую часть дня ssh'd на серверах. У меня есть серия псевдонимов / функций / сценариев, которые позволяют мне вводить p hostname из терминала и выполнять экран GNU (1) на удаленной стороне, используя следующую команду:

exec ssh hostname -t 'screen -RD'`

Я только недавно заметил, что ssh -t не получает мой пользовательский $PATH . Вот некоторые выводы терминала:

adam@workstation:~:0$ sh server 'echo $PATH'
/home/adam/bin:/usr/local/bin:/bin:/usr/bin:/opt/git/bin:/opt/git/libexec/git-core
adam@workstation:~:0$ ssh server -t 'echo $PATH'
/usr/local/bin:/bin:/usr/bin
Connection to uranus.plymouth.edu closed.

Моя самая большая проблема заключается в том, что мои пользовательские псевдонимы только пытаются выполнить screen , так как я не могу гарантировать абсолютный путь, а мой $PATH структурирован, поэтому оболочка должна найти правильный. Если мои настройки $PATH не соблюдаются, мои сценарии не работают. Есть ли способ, которым я могу использовать $PATH как определено моим .bashrc/.bash_profile?

Я считаю, что PermitUserEnvironment отключен.

4 ответа4

1

Если вы можете изменить команду, которую используют ваши псевдонимы, вы можете сделать так, чтобы удаленная сторона создала «интерактивный», «login» экземпляр bash (то есть тот, который использует ваши .bashrc и .bash_profile) для запуска экрана:

ssh server -t 'exec bash -ilc "exec screen -RD"'

Если, кроме того, вы не получаете свою обычную среду (PATH, настройки оболочки и т.д.) В оболочках, созданных внутри экрана, вам может потребоваться указать экран для создания оболочек «входа». Поместите shell -bash в ваш .screenrc на удаленных концах или добавьте -s -bash к вашему вызову экрана :

ssh server -t 'exec bash -ilc "exec screen -RDs -bash"'

Это, безусловно, запустит ваш .bash_profile дважды (один раз перед экраном, один раз для каждой оболочки, созданной внутри экрана). В зависимости от того, как вы выполняете манипуляции с PATH, это может привести к нескольким копиям одних и тех же дополнений к вашему PATH (как правило, это не проблема).

0

.bashrc и .bash_profile обрабатываются только для интерактивных оболочек, а любая оболочка, которая выполняет программу, такую как screen (или echo в тестовых случаях), - нет. Прочтите на странице руководства bash переменную среды BASH_ENV , которую можно настроить для запуска сценария запуска для неинтерактивных оболочек.

0

Вы также можете использовать ~/.ssh/rc или ~/.ssh/environment . Смотрите справочную страницу sshd(8) .

0

Ваш пользовательский $ PATH, вероятно, установлен в .bashrc, который завершается при запуске в псевдо-tty окружении ssh -t ...

У меня нет прямого опыта с этим, но держу пари, что если вы проверите .bashrc, то увидите, что он завершается, если не установлен $ PS1, или [-t 1] не работает, или что-то подобное, перед установкой $ PATH. И если вы поэкспериментируете, вы, вероятно, обнаружите, что ssh server 'try_that_test' и ssh server -t 'try_that_test' дают разные результаты.

Возможно, вы можете исправить это, сделав тест более сложным, чтобы проверить, работает ли он под ssh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .