回答:
ホームを変更しようとしている場合は、次のことができます
export HOME=/home/...
シェル、または〜/ .profileファイルおよび/または〜/ .bashrc(または適切なログインシェル)のいずれか。
(上記のコードは、Debianのデフォルトであるbashおよび同様のシェルで動作します。そうでなければ、他のディストリビューションのcshのようなシェルで `setenv HOME $ HOME:/ extra / pathを実行します。)
編集 -しかし、これはおそらくそれを行う方法ではありません。他の回答をご覧ください。この回答は使用しないでください。
ログインプログラムは、/ etc / passwdの値に基づいて、シェルでexecを呼び出す前に(execの引数に含めることにより)配置します。
を実行してこれを編集します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で内部を覗いてみましょう。
$ 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
HOME、rcファイル、またはpasswdに関する言及はありません。きれいな環境で試してみましょう:
env -i bash
echo $HOME #this will be blank since we cleared the 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
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
興味深い線を太字にしました。ご覧のとおり、$HOME
定義されていない場合、シェルはログインモードまたはインタラクティブモードでない場合でも、それを埋めようとします。
$HOME
してい$PATH
ます。複数のパスを$HOME
含めること(値全体が単一のパス名として扱われること)、またはほとんどの場合、$HOME
まったく変更することは意味がありません。