Où est définie la variable d'environnement $ HOME?

17

Je cherche l'endroit où la variable d'environnement $ HOME est définie. C'est après la connexion, à mon avis.

J'utilise Linux debian 2.6.32-5-686.

webnoon
la source

Réponses:

2

Si vous essayez de modifier votre HOME, vous pouvez le faire

export HOME=/home/... 

soit dans votre shell, soit dans votre fichier ~ / .profile et / ou ~ / .bashrc (ou shell de connexion approprié).

(Le code ci-dessus fonctionnera pour bash et les shells similaires, qui sont par défaut dans Debian; sinon, vous feriez `setenv HOME $ HOME: / extra / path je pense sur les shells de type csh dans d'autres distributions.)

modifier - Cependant, ce n'est probablement pas la façon de le faire. Voir d'autres réponses. N'utilisez pas cette réponse.

user76871
la source
Vous confondez probablement $HOMEavec $PATH. Il n'est pas logique d'avoir plusieurs chemins d'accès $HOME(la valeur entière sera traitée comme un seul chemin d'accès) ou, dans la plupart des cas, de modifier $HOMEdu tout.
user1686
@grawity: oups désolé, merci. Malheureusement, je ne peux pas supprimer ma réponse.
user76871
22

Sous Linux, la HOMEvariable d'environnement est définie par le programme de connexion:

  • par des sessions loginsur console, telnet et rlogin
  • par sshdpour les connexions SSH
  • par gdm, kdmou xdmpour les sessions graphiques.
user1686
la source
8

Le programme de connexion l'arrange avant d'appeler exec sur votre shell (en l'incluant dans les arguments de exec), en fonction de la valeur dans / etc / passwd.

bmargulies
la source
1
Intéressant, cela n'a pas obtenu plus de votes. C'est la seule réponse qui spécifie réellement la variable d'environnement est définie, ce qui était la question réelle de l'OP.
Mike Williamson
5

Modifier en exécutant: usermod -d /home/whatever_dir whatever_user.

Veuillez noter que ce sera (évidemment) le nouveau répertoire personnel. Bash le fera cdà la connexion, alors assurez-vous qu'il existe et que les autorisations sont correctes. En outre, ne pas oublier .bashrc, .profile, .xinitrc, etc; s'ils ne sont pas dans le répertoire personnel, ils ne seront pas lus.

De 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
la source
0

J'ai creusé, et la réponse à cela est un peu surprenante. Prenez le script de test suivant et chmod +xle:

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

Nous pouvons l'exécuter avec ./test.shet voir:

Ma maison est: / home / user

Jetons un coup d'œil sous le capot avec strace.

$ 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

Je ne vois aucune mention de HOME, de fichiers rc ou de passwd. Essayons-le avec un environnement propre:

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

Rien, comme prévu. Exécutons le script dans l'environnement vide.

env -i bash
./test.sh 

Ma maison est: / home / user

Intéressant, le script peut rentrer à la maison. Voyons maintenant.

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

Maintenant, nous voyons:

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

J'ai mis en gras les lignes intéressantes. Comme nous pouvons le voir, il semblerait que lorsqu'il $HOMEn'est pas défini, le shell essaiera de le remplir, même lorsqu'il n'est pas en mode connexion ou interactif.

DeusXMachina
la source