Где обычно устанавливается $ BASH_ENV?

19

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

Файлы / etc / profile и / etc / environment на обоих серверах идентичны, однако $ BASH_ENV установлен на ~ / .bashrc на сервере, который работает правильно. Я хочу установить $ BASH_ENV на сервере, который не работает, но я бы предпочел установить его в том же месте, что и на рабочем сервере. В каких местах Linux будет работать во время неинтерактивного входа в систему, например команды ssh с другого компьютера?

edit: строка в / etc / passwd для пользователя указывает / bin / bash на обоих серверах. Файл ~ / .bash_profile для обоих серверов идентичен и содержит if [ -f ~/.bashrc ]; then . ~/.bashrc; fi. Единственная разница между системами заключается в том, что $ BASH_ENV - это пустая строка на сервере, которая не работает, и я не могу найти, где она была установлена ​​на сервере, который работает.

edit 2: файл ~ / .ssh / environment на обоих серверах имеет BASH_ENV = ~ / .bashrc

Бэзил
источник
1
На обоих серверах файл / etc / passwd идентичен? Если bash называется «/ bin / sh» вместо «/ bin / bash», он не будет читать никакие файлы bashrc (только файлы профиля).
Freiheit
Не идентично, но пользователь, которому я отправляю команды, имеет одинаковую строку в / etc / passwd в обеих системах.
Василий
А как насчет ~ / .profile и ~ / .bash_profile?
Freiheit
они идентичны и оба содержатif [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Василий
Вы убедились, что / etc / bashrc и /etc/profile.d/* идентичны? ~ / .bash_login? /etc/pam.d/*? /etc/security/pam_env.conf?
freiheit

Ответы:

21

BASH_ENVбудет установлен только через среду или другой скрипт, который получен во время инициализации. Для неинтерактивной оболочки он будет пытаться получить дополнительные файлы, только если эта оболочка также является оболочкой входа в систему. (в этом случае он будет читать ~/.bash_profile, ~/.bash_loginи ~/.profile... но если бы он делал это, у вас не возникло бы проблемы)

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

  • Экспортированная BASH_ENVпеременная будет передана. Имейте в виду, что это может быть похоронено в файле источника.
  • Он может быть подан в качестве параметра на той же строке , вызывающей сценарий, то есть BASH_ENV=blah /path/to/somecommand.sh. Это похоже на боль в пальце, так что вы, вероятно, поймали бы это.

Если он установлен после входа в систему, но вы не можете выяснить, где, возможно, вам придется посмотреть, что отвечает за создание среды входа в систему.

  • Все обычные файлы, полученные из оболочки входа. man bashдля исчерпывающего списка.

  • PAM : как указано в комментариях freiheit, проверьте /etc/security/pam_env.confи любые дополнительные файлы, на которые ссылается pam_env.so. Другие модули PAM также могут быть ответственны, но если ваши конфигурации PAM выглядят одинаково, это, вероятно, не тот случай.

  • sshd : сканирует следующие файлы по порядку:

    • ~/.ssh/environment(до перехода в домашний каталог; только если PermitUserEnvironmentвключен в sshd_config)
    • ~/.ssh/rc (после перехода в домашний каталог; всегда)
    • /etc/ssh/sshrc(если ~/.ssh/rcнет)

Примечание: sshdтакже будет сканировать environment=valueстроки в файле авторизованных ключей пользователя (если PermitUserEnvironmentон включен), но со страницы руководства неясно, где этот шаг попадает в вышеуказанную последовательность.

Андрей Б
источник
Я нашел разницу! PermitUserEnvironment yesустанавливается в / etc / ssh / sshd_config на рабочем сервере, но не проблемный. Я изменил его, но я просто протестировал команду, и она снова не сработала. Этот файл анализируется каждый раз, когда я пытаюсь войти в ssh? У меня нет ~ / .ssh / rc для пользователя, с которым я работаю, и нет файла / etc / ssh / sshrc ни в одной системе.
Василий
О, я думаю, мне нужно повторно инициализировать SSH? /etc/init.d/sshd?
Василий
@Basil Да, тебе нужно перезагрузить sshd. Это также означает, что на рабочем сервере может быть файл (проверьте список из тех, что я вам дал sshd), который задает среду.
Андрей Б
Да, это была неприятная часть - все, что мне нужно, установлено в .bashrc, который просто не запускался :) Большое спасибо за вашу помощь - я планирую внести изменения для повторной инициализации SSH, и я сообщу об этом. Я предполагаю, что это сработает.
Василий
Я только что закончил повторную инициализацию SSH, и мои неинтерактивные команды SSH теперь работают! Большое спасибо за вашу помощь, я бы никогда не нашел это поле самостоятельно.
Василий