Réponses:
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.
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.
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
J'ai creusé, et la réponse à cela est un peu surprenante. Prenez le script de test suivant et chmod +x
le:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Nous pouvons l'exécuter avec ./test.sh
et 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 $HOME
n'est pas défini, le shell essaiera de le remplir, même lorsqu'il n'est pas en mode connexion ou interactif.
$HOME
avec$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$HOME
du tout.