2

Я пытаюсь отладить проблему среды оболочки на машине, на которой работает lucid.

И root, и пользователь имеют /bin /bash в качестве оболочки в /etc /passwd. Когда я использую «sudo su - user», мой PATH включает в себя следующий каталог: /usr/local/rvm/rubies/ruby-1.9.3-p194 /bin /ruby, когда я "ssh user @ machine" имеет: /usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby

Теперь, вероятно, здесь есть несколько конкретных ответов по ruby/rvm - это не то, что я ищу, я пытаюсь понять, это общая проблема того, где искать, чтобы найти то, что определяет путь , Я знаю, что /etc /profile выполняется, но он выполняется в обоих случаях, поэтому я не уверен, в чем проблема - есть ли другие файлы, которые также загружаются при входе в систему - в 1 случае, но не в другом ? / что-нибудь еще, что загружается, что может быть установка PATH?

Похоже, что-то происходит до загрузки /etc /profile. Я повторил окружение в первой строке /etc /profile, а в случае ssh путь уже включал ссылку на /usr/local/rvm/rubies/ruby-1.9.2-p290/bin - в Судо su - дело это не так. Похоже, что /etc /environment используется в случае ssh, но не sudo su - case ...

Еще одна вещь, которую я недавно обнаружил, также актуальна:какая разница между "су" с дефисом и без него?

файл /etc/login.defs используется при выполнении su, а параметр PATH /etc /environment перезаписывается там ENV_PATH или ENV_SUPATH ...

одно пояснение /etc /profile используется для оболочек входа в систему, но не для оболочек без входа в систему - так, например, sudo env не показывает переменные, которые установлены только в /etc /profile

при входе в учетную запись не будут отображаться переменные, которые установлены только в /etc /environment

1 ответ1

3

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

Первый файл, который система читает для установки переменных, это /etc/environment . После этого, какие файлы будут прочитаны, зависит от того, как был вызван bash. Когда вы используете ssh user@machine , вы запускаете оболочку входа в систему, но когда вы su username , вы запускаете интерактивную оболочку, не входящую в систему . Bash будет читать настройки инициализации из разных файлов в каждом случае. Следующее от справочной страницы bash (выделено мое):

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла /etc /profile, если этот файл существует.После прочтения этого файла он ищет ~ /.bash_profile, ~ /.bash_login и ~ /.profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения. Опция --noprofile может использоваться, когда оболочка запущена, чтобы запретить это поведение.

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrc и ~ /.bashrc, если эти файлы существуют. Это может быть запрещено с помощью параметра --norc. Параметр --rcfile file заставит bash читать и выполнять команды из файла вместо /etc/bash.bashrc и ~ /.bashrc.

Таким образом, bash читает разные файлы запуска в зависимости от своего вызова. Посмотрите на содержимое этих файлов на вашем компьютере, вы, вероятно, обнаружите, что $PATH определяется по-разному.

Тем не менее, как правильно заметил @mpy в комментариях, sudo su - user должен запустить оболочку входа. Вы уверены, что используете sudo su - а не просто sudo su или просто su? - должен запустить оболочку входа в систему, которая должна читать те же файлы запуска, что и ssh user .

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