Где установлена ​​переменная окружения $ HOME?

16

Я ищу место, где установлена ​​переменная окружения $ HOME. Это после входа в систему, на мой взгляд.

Я использую Linux Debian 2.6.32-5-686.

webnoon
источник

Ответы:

2

Если вы пытаетесь изменить свой ДОМ, вы можете сделать

export HOME=/home/... 

либо в вашей оболочке, либо в вашем файле ~ / .profile и / или ~ / .bashrc (или соответствующей оболочке входа в систему).

(Приведенный выше код будет работать для bash и аналогичных оболочек, которые по умолчанию установлены в Debian; в противном случае вы бы сделали `setenv HOME $ HOME: / extra / path, я думаю, на csh-подобных оболочках в других дистрибутивах.)

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

user76871
источник
Вы, вероятно, путаете $HOMEс $PATH. Не имеет смысла иметь несколько путей $HOME(все значение будет обрабатываться как одно имя пути) или, в большинстве случаев, изменять $HOMEвообще.
user1686
@ Grawity: ой извините, спасибо. К сожалению, я не могу удалить свой ответ.
user76871
21

В Linux HOMEпеременная окружения устанавливается программой входа в систему:

  • по loginна консоли, телнет и RLogin сессий
  • по sshdдля соединений SSH
  • путем gdm, kdmили xdmдля графических сеансов.
user1686
источник
8

Программа входа в систему организует его перед вызовом exec в вашей оболочке (включив его в аргументы exec), основываясь на значении в / etc / passwd.

bmargulies
источник
1
Интересно, что не набрал больше голосов. Это единственный ответ, который фактически указывает, где установлена ​​переменная окружения, что было актуальным вопросом ОП.
Майк Уильямсон
5

Редактировать это, запустив: usermod -d /home/whatever_dir whatever_user.

Обратите внимание, что это (очевидно) будет новый домашний каталог. Bash сделает cdэто при входе в систему, поэтому убедитесь, что он существует и права доступа правильные. Кроме того, не стоит забывать о том .bashrc, .profile, .xinitrcи т.д.; если они не находятся в домашнем каталоге, они не будут прочитаны.

От usermod:

Usage: usermod [options] LOGIN

Options:
  -c, --comment COMMENT         new value of the GECOS field
  -d, --home HOME_DIR           new home directory for the user account
  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -f, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -g, --gid GROUP               force use GROUP as new primary group
  -G, --groups GROUPS           new list of supplementary GROUPS
  -a, --append                  append the user to the supplemental GROUPS
                                mentioned by the -G option without removing
                                him/her from other groups
  -h, --help                    display this help message and exit
  -l, --login NEW_LOGIN         new value of the login name
  -L, --lock                    lock the user account
  -m, --move-home               move contents of the home directory to the
                                new location (use only with -d)
  -o, --non-unique              allow using duplicate (non-unique) UID
  -p, --password PASSWORD       use encrypted password for the new password
  -R, --root CHROOT_DIR         directory to chroot into
  -s, --shell SHELL             new login shell for the user account
  -u, --uid UID                 new UID for the user account
  -U, --unlock                  unlock the user account
Synthead
источник
0

Я немного покопался, и ответ на это немного удивляет. Возьмите следующий тестовый скрипт и chmod +xего:

#!/bin/bash 
printf 'My home is: '
echo  ~ || echo 'nowhere'

Мы можем запустить его ./test.shи увидеть:

Мой дом: / home / пользователь

Давайте заглянем под капюшон со стразами.

$ strace ./test.sh |& grep '^open[a-z]*'

openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
открытия (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ usr / lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3

Я не вижу упоминаний о HOME, файлах rc или passwd. Давайте попробуем это с чистым env:

env -i bash
echo $HOME  #this will be blank since we cleared the env

Ничего, как и ожидалось. Давайте запустим скрипт в пустом env.

env -i bash
./test.sh 

Мой дом: / home / пользователь

Интересно, что сценарий способен добраться до дома. Теперь давайте проследим.

strace ./test.sh |& grep '^open[a-z]*'

Теперь мы видим:

openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
открытия (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/etc/ld.so. кеш ", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD," /etc/ld.so.cache " , O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnsl.so.1", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD, "./test.sh", O_RDONLY) = 3

Я выделил интересные строки. Как мы видим, может показаться, что когда $HOMEне определено, оболочка будет пытаться заполнить его, даже когда не в логине или интерактивном режиме.

DeusXMachina
источник