web-dev-qa-db-ja.com

$ HOME環境変数はどこに設定されていますか?

$ HOME環境変数が設定されている場所を探しています。ログイン後のことです。

Linux debian 2.6.32-5-686を使用しています。

18
webnoon

あなたのホームを変更しようとしている場合は、行うことができます

export HOME=/home/... 

シェル、または〜/ .profileファイルまたは〜/ .bashrc(または適切なログインシェル)のいずれか。

(上記のコードは、Debianのデフォルトであるbashおよび類似のシェルで機能します。それ以外の場合は、 `setenv HOME $ HOME:/ extra/pathを実行します。他のディストリビューションのcshのようなシェルで考えます。)

編集-ただし、これはおそらくそうする方法ではありません。他の回答を参照してください。この回答は使用しないでください。

4
user76871

Linuxでは、HOME環境変数はログインプログラムによって設定されます。

  • コンソールのlogintelnetおよびrloginセッション
  • sSH接続の場合はsshd
  • グラフィカルセッションの場合、gdmkdmまたはxdm
22
user1686

ログインプログラムは、/ etc/passwdの値に基づいて、シェルでexecを呼び出す前に(execへの引数にそれを含めることで)配置します。

8
bmargulies

usermod -d /home/whatever_dir whatever_userを実行してこれを編集します。

これが(明らかに)新しいホームディレクトリになることに注意してください。 Bashはログイン時にcdを実行します。そのため、Bashが存在し、権限が正しいことを確認してください。また、.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
5
Synthead

私はいくつかの掘り出し物をしました、そしてこれに対する答えは少し意外です。次のテストスクリプトを取り、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が定義されていない場合、ログインモードまたはインタラクティブモードではない場合でも、シェルはそれを入力しようとします。

0
DeusXMachina