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.
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.
Odpowiedzi:
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.
W systemie Linux HOME
zmienna środowiskowa jest ustawiana przez program logowania:
login
konsoli, telnet i rloginsshd
dla połączeń SSHgdm
, kdm
lubxdm
na sesje graficznych.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.
Edytuj to, uruchamiając: usermod -d /home/whatever_dir whatever_user
.
Pamiętaj, że będzie to (oczywiście) nowy katalog domowy. Bash zrobi cd
to 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
Kopałem trochę, a odpowiedź na to pytanie jest nieco zaskakująca. Weź następujący skrypt testowy i chmod +x
to:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Możemy go uruchomić ./test.sh
i 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 $HOME
nie jest zdefiniowany, powłoka spróbuje go wypełnić, nawet gdy nie jest w trybie logowania ani w trybie interaktywnym.
$HOME
się$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,$HOME
w ogóle modyfikować .