Ответы:
Если вы пытаетесь изменить свой ДОМ, вы можете сделать
export HOME=/home/...
либо в вашей оболочке, либо в вашем файле ~ / .profile и / или ~ / .bashrc (или соответствующей оболочке входа в систему).
(Приведенный выше код будет работать для bash и аналогичных оболочек, которые по умолчанию установлены в Debian; в противном случае вы бы сделали `setenv HOME $ HOME: / extra / path, я думаю, на csh-подобных оболочках в других дистрибутивах.)
редактировать - однако это, вероятно, не способ сделать это. Смотрите другие ответы. Не используйте этот ответ.
Программа входа в систему организует его перед вызовом exec в вашей оболочке (включив его в аргументы exec), основываясь на значении в / etc / passwd.
Редактировать это, запустив: usermod -d /home/whatever_dir whatever_user
.
Обратите внимание, что это (очевидно) будет новый домашний каталог. Bash сделает cd
это при входе в систему, поэтому убедитесь, что он существует и права доступа правильные. Кроме того, не стоит забывать о том .bashrc
, .profile
, .xinitrc
и т.д.; если они не находятся в домашнем каталоге, они не будут прочитаны.
От 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
Я немного покопался, и ответ на это немного удивляет. Возьмите следующий тестовый скрипт и chmod +x
его:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Мы можем запустить его ./test.sh
и увидеть:
Мой дом: / home / пользователь
Давайте заглянем под капюшон со стразами.
$ 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
открытия (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
открытия (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ usr / lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
Я не вижу упоминаний о HOME, файлах rc или passwd. Давайте попробуем это с чистым env:
env -i bash
echo $HOME #this will be blank since we cleared the env
Ничего, как и ожидалось. Давайте запустим скрипт в пустом env.
env -i bash
./test.sh
Мой дом: / home / пользователь
Интересно, что сценарий способен добраться до дома. Теперь давайте проследим.
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
открытия (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
открытия (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
открытия (AT_FDCWD, "/etc/ld.so. кеш ", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD," /etc/ld.so.cache " , O_RDONLY | O_CLOEXEC) = 3
открытия (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
открытых (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
открытых (AT_FDCWD, "./test.sh", O_RDONLY) = 3
Я выделил интересные строки. Как мы видим, может показаться, что когда $HOME
не определено, оболочка будет пытаться заполнить его, даже когда не в логине или интерактивном режиме.
$HOME
с$PATH
. Не имеет смысла иметь несколько путей$HOME
(все значение будет обрабатываться как одно имя пути) или, в большинстве случаев, изменять$HOME
вообще.