Как оболочка узнает дом (а)?

Для меня это была проблема включения безопасной загрузки в настройках BIOS. Есть разные способы исправить это, но самый простой из них - отключить безопасную загрузку в BIOS.

25
29.11.2016, 19:46
3 ответа

Система установила переменную HOME во время входа в систему как путь к домашнему каталогу пользователя. Он устанавливается

  • gdm, kdm или xdm для графических сеансов.
  • вход в консоль, сеансы telnet и rlogin
  • sshd для соединений SSH

Вы можете изменить его значение, но обратите внимание, потому что .bashrc, .profile, .xinitrc и т. Д. Не будут прочитаны, если их нет в домашний каталог.

0
27.01.2020, 19:40

В случае csh и tcsh записывается значение $ HOME в момент запуска оболочки ( в ее переменной $ home , как указано @JdeBP ).

Если вы отключите его перед запуском csh , вы увидите что-то вроде:

$ (unset HOME; csh -c cd)
cd: No home directory.

Для bash (и большинства других оболочек, подобных Борну), я вижу другое поведение чем твой.

bash-4.4$ unset HOME; cd
bash: cd: HOME not set

Содержимое переменной $ HOME инициализируется процессом входа в систему на основе информации, хранящейся в базе данных пользователей относительно вашего имени пользователя .

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

Итак, как только $ HOME исчезнет, ​​нет надежного способа вернуть его.

Запрос к базе данных пользователей (с помощью стандартного API getpwxxx () ) о домашнем каталоге первого пользователя, имеющего тот же uid, что и тот, который запускает оболочку, будет лишь приблизительным (не говоря уже о том, что тот факт, что база данных пользователей могла измениться (или домашний каталог был определен как одноразовое значение) с момента начала сеанса входа в систему).

zsh - единственная известная мне оболочка, которая делает это:

$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697)      = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++

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

Другое поведение - поведение fish , которое, похоже, запрашивает в базе данных имя пользователя, хранящееся в $ USER , если оно есть, или выполняет getpwuid () , если нет:

$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin")  = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++


$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas")                                      = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++

SEGV, когда пользователь не существует ( https://github.com/fish-shell/fish-shell/issues/3599 ):

$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault  env -u HOME USER=foo fish -c ''
33
27.01.2020, 19:40

Итак, как оболочка узнает, где находится мой / other_user?

Не знает. Вы просто неправильно проводите эксперимент. Как видно из руководства по оболочке C, команда cd изменяет значение переменной home , если она не указана без аргументов. Если эта переменная не установлена, она не знает, куда сменить каталог, и выводит сообщение об ошибке:

machine:~> set home=/
machine:/home/user> cd
machine:~> unset home
machine:/> cd
cd: No home directory
machine:/> 

Вы сбросили неправильную переменную. Это не HOME , переменная среды, это home внутренняя переменная оболочки C (инициализируется значением первой при запуске оболочки, но в остальном является самостоятельной независимой переменной. Правильно).

7
27.01.2020, 19:40

Теги

Похожие вопросы