Gdzie jest ustawiona zmienna środowiskowa $ HOME?

17

Szukam miejsca, w którym ustawiono zmienną środowiskową $ HOME. Moim zdaniem jest to po zalogowaniu.

Używam systemu Linux Debian 2.6.32-5-686.

popołudnie
źródło

Odpowiedzi:

2

Jeśli próbujesz zmodyfikować swój DOM, możesz to zrobić

export HOME=/home/... 

albo w powłoce, albo w pliku ~ / .profile i / lub ~ / .bashrc (lub odpowiedniej powłoce logowania).

(Powyższy kod będzie działał dla bash i podobnych powłok, które są domyślne w Debianie; w przeciwnym razie zrobiłbyś `setenv HOME $ HOME: / extra / path Myślę, że na powłokach podobnych do csh w innych dystrybucjach.)

edytuj - jednak prawdopodobnie nie jest to odpowiedni sposób. Zobacz inne odpowiedzi. Nie używaj tej odpowiedzi.

użytkownik76871
źródło
Jesteś prawdopodobnie myli $HOMEsię $PATH. Nie ma sensu mieć wielu ścieżek w $HOME(cała wartość będzie traktowana jako pojedyncza nazwa ścieżki) lub, w większości przypadków, $HOMEw ogóle modyfikować .
user1686
@grawity: Ups przepraszam, dziękuję. Niestety nie mogę usunąć mojej odpowiedzi.
user76871,
22

W systemie Linux HOMEzmienna środowiskowa jest ustawiana przez program logowania:

  • przez sesje loginkonsoli, telnet i rlogin
  • przez sshddla połączeń SSH
  • przez gdm, kdmlubxdm na sesje graficznych.
użytkownik1686
źródło
8

Program logowania porządkuje go przed wywołaniem exec w powłoce (poprzez włączenie go w argumentach exec), na podstawie wartości w / etc / passwd.

bmargulies
źródło
1
Ciekawe, że nie uzyskał więcej głosów. To jedyna odpowiedź, która faktycznie określa, gdzie ustawiona jest zmienna środowiskowa, co było faktycznym pytaniem PO.
Mike Williamson,
5

Edytuj to, uruchamiając: usermod -d /home/whatever_dir whatever_user .

Pamiętaj, że będzie to (oczywiście) nowy katalog domowy. Bash zrobi cdto przy logowaniu, więc upewnij się, że istnieje i uprawnienia są prawidłowe. Ponadto, nie zapomnij o .bashrc, .profile,.xinitrc , etc; jeśli nie ma ich w katalogu domowym, nie zostaną odczytane.

Od 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
źródło
0

Kopałem trochę, a odpowiedź na to pytanie jest nieco zaskakująca. Weź następujący skrypt testowy i chmod +xto:

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

Możemy go uruchomić ./test.shi zobaczyć:

Mój dom to: / home / user

Rzućmy okiem pod maską ze sznurkiem.

$ 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
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ usr / lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3

Nie widzę żadnej wzmianki o HOME, plikach rc ani passwd. Spróbujmy z czystą env:

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

Nic, zgodnie z oczekiwaniami. Uruchommy skrypt w pustej env.

env -i bash
./test.sh 

Mój dom to: / home / user

Ciekawe, że skrypt może wrócić do domu. Teraz prześledźmy.

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

Teraz widzimy:

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
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ etc /ld.so. cache ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /etc/ld.so.cache " , O_RDONLY | O_CLOEXEC) = 3
openat (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
openat (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, „./test.sh”, O_RDONLY) = 3

Pogrubiłem ciekawe linie. Jak widzimy, wydaje się, że gdy $HOMEnie jest zdefiniowany, powłoka spróbuje go wypełnić, nawet gdy nie jest w trybie logowania ani w trybie interaktywnym.

DeusXMachina
źródło