Wo ist die Umgebungsvariable $ HOME festgelegt?

16

Ich suche nach dem Ort, an dem $ HOME Umgebungsvariable gesetzt. Es ist nach dem Login, meiner Meinung nach.

Ich benutze Linux Debian 2.6.32-5-686.

webnoon
quelle

Antworten:

2

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.

user76871
quelle
Sie sind wahrscheinlich verwirrend $HOMEmit $PATH. Es ist nicht sinnvoll, mehrere Pfade $HOMEeinzugeben (der gesamte Wert wird als einzelner Pfadname behandelt) oder in den meisten Fällen überhaupt zu ändern $HOME.
user1686
@grawity: oops sorry, danke Leider kann ich meine Antwort nicht löschen.
user76871
21

Unter Linux wird die HOMEUmgebungsvariable vom Anmeldeprogramm festgelegt:

  • von loginauf Konsole, Telnet und Rlogin- Sitzungen
  • von sshdfür SSH-Verbindungen
  • durch gdm, kdmoder xdmfür grafische Sitzungen.
user1686
quelle
8

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.

margulies
quelle
1
Interessanterweise bekam dieser nicht mehr Stimmen. Dies ist die einzige Antwort, die tatsächlich angibt, wo die Umgebungsvariable gesetzt ist, was die eigentliche Frage des OP war.
Mike Williamson
5

Bearbeiten , indem Sie: usermod -d /home/whatever_dir whatever_user.

Bitte beachten Sie, dass dies (offensichtlich) das neue Ausgangsverzeichnis sein wird. Bash wird cdes 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
Synthead
quelle
0

Ich habe ein bisschen gegraben, und die Antwort darauf ist ein bisschen überraschend. Nehmen Sie das folgende Testskript und chmod +xes:

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

Wir können damit arbeiten ./test.shund 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 $HOMEdie Shell , wenn nicht definiert, versuchen, es auszufüllen, auch wenn sie sich nicht im Anmelde- oder interaktiven Modus befindet.

DeusXMachina
quelle