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.

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.


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.

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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.