Antworten:
Wenn Sie versuchen, Ihr HOME zu ändern, können Sie dies tun
export HOME=/home/...
entweder in Ihrer Shell oder in Ihrer ~ / .profile-Datei und / oder ~ / .bashrc (oder in der entsprechenden Login-Shell).
(Der obige Code funktioniert für bash und ähnliche Shells, die in Debian standardmäßig verwendet werden. Ansonsten würden Sie `setenv HOME $ HOME: / extra / path ausführen, wie ich es bei csh-ähnlichen Shells in anderen Distributionen finde.)
Bearbeiten - Dies ist jedoch wahrscheinlich nicht der richtige Weg. Siehe andere Antworten. Verwenden Sie diese Antwort nicht.
Das Anmeldeprogramm ordnet es vor dem Aufruf von exec auf Ihrer Shell an (indem es es in die Argumente für exec einfügt), basierend auf dem Wert in / etc / passwd.
Bearbeiten , indem Sie: usermod -d /home/whatever_dir whatever_user
.
Bitte beachten Sie, dass dies (offensichtlich) das neue Ausgangsverzeichnis sein wird. Bash wird cd
es bei der Anmeldung tun, also stellen Sie sicher, dass es existiert und die Berechtigungen korrekt sind. Darüber hinaus vergessen Sie nicht über .bashrc
, .profile
, .xinitrc
, etc; Wenn sie sich nicht im Basisverzeichnis befinden, werden sie nicht gelesen.
Von 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
Ich habe ein bisschen gegraben, und die Antwort darauf ist ein bisschen überraschend. Nehmen Sie das folgende Testskript und chmod +x
es:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Wir können damit arbeiten ./test.sh
und sehen:
Mein Zuhause ist: / home / user
Lassen Sie uns mit Spannung einen Blick unter die Haube werfen.
$ 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
Ich sehe keine Erwähnung von HOME, RC-Dateien oder passwd. Versuchen wir es mit einer sauberen Umgebung:
env -i bash
echo $HOME #this will be blank since we cleared the env
Nichts wie erwartet. Lassen Sie uns das Skript in der leeren Umgebung ausführen.
env -i bash
./test.sh
Mein Zuhause ist: / home / user
Interessanterweise kommt das Drehbuch nach Hause. Lassen Sie uns jetzt verfolgen.
strace ./test.sh |& grep '^open[a-z]*'
Jetzt sehen wir:
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
Ich habe die interessanten Zeilen fett geschrieben. Wie wir sehen können, scheint es, als würde $HOME
die Shell , wenn nicht definiert, versuchen, es auszufüllen, auch wenn sie sich nicht im Anmelde- oder interaktiven Modus befindet.
$HOME
mit$PATH
. Es ist nicht sinnvoll, mehrere Pfade$HOME
einzugeben (der gesamte Wert wird als einzelner Pfadname behandelt) oder in den meisten Fällen überhaupt zu ändern$HOME
.