Відповіді:
Якщо ви намагаєтесь змінити свій ДОМОВ, ви можете зробити це
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 / user
Давайте заглянемо під кришку з натяжкою.
$ 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_CLOEX) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
опенати (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, / us lib / x86_64-linux-gnu / gconv / gconv-module.cache ", O_RDONLY) = 3
опенати (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
Я не бачу жодної згадки про HOME, rc-файли чи passwd. Давайте спробуємо це з чистим оточенням:
env -i bash
echo $HOME #this will be blank since we cleared the env
Нічого, як очікувалося. Давайте запустимо сценарій у порожній env.
env -i bash
./test.sh
Мій дім: / home / user
Цікаво, що сценарій здатний повернутися додому. Тепер давайте простежимо.
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_CLOEX) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
опенати (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/etc/.cld / кеш ", 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.ca.ld.cache " , O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD," /lib/x86_64-linux-gnu/libnsl.so.1 ", O_RDONLY | O_CLOEXEC) = 3
опенати (AT_FDCWD," / lib / x86_64-linux libnss_files.so.2 ",O_RDONLY | O_CLOEXEC) = 3
опената (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "./test.sh", O_RDONLY) = 3
Я виділив цікаві лінії. Як ми бачимо, може здатися, що коли $HOME
не визначено, оболонка намагатиметься заповнити її, навіть коли не входить у режим входу чи інтерактивного режиму.
$HOME
з$PATH
. Немає сенсу мати кілька шляхів$HOME
(все значення розглядатиметься як одне ім’я шляху) або, в більшості випадків,$HOME
взагалі змінювати .