Di mana variabel lingkungan $ HOME diatur?

16

Saya mencari tempat di mana variabel lingkungan $ HOME diatur. Itu setelah login, menurut saya.

Saya menggunakan Linux debian 2.6.32-5-686.

webnoon
sumber

Jawaban:

2

Jika Anda mencoba mengubah HOME Anda, Anda dapat melakukannya

export HOME=/home/... 

baik di shell Anda, atau di file ~ / .profile Anda dan / atau ~ / .bashrc (atau shell login yang sesuai).

(Kode di atas akan bekerja untuk bash dan shell yang serupa, yang merupakan default di Debian; Anda akan melakukan `setenv HOME $ HOME: / extra / path Saya pikir pada shell mirip csh di distro lain.)

sunting - Namun ini mungkin bukan cara untuk melakukannya. Lihat jawaban lain. Jangan gunakan jawaban ini.

pengguna76871
sumber
Anda mungkin membingungkan $HOMEdengan $PATH. Tidak masuk akal untuk memiliki beberapa jalur $HOME(seluruh nilai akan diperlakukan sebagai satu pathname) atau, dalam banyak kasus, untuk memodifikasi $HOMEsama sekali.
user1686
@ kegembiraan: oops maaf, terima kasih. Sayangnya saya tidak bisa menghapus jawaban saya.
user76871
21

Di Linux, HOMEvariabel lingkungan diatur oleh program login:

  • oleh loginpada sesi konsol, telnet dan rlogin
  • oleh sshduntuk koneksi SSH
  • oleh gdm, kdmatau xdmuntuk sesi grafis.
pengguna1686
sumber
8

Program login mengaturnya sebelum memanggil exec pada shell Anda (dengan memasukkannya ke dalam argumen untuk exec), berdasarkan nilai pada / etc / passwd.

bmargulies
sumber
1
Menarik ini tidak mendapat lebih banyak suara. Itu satu-satunya jawaban yang benar-benar menentukan di mana variabel lingkungan diatur, yang merupakan pertanyaan aktual OP.
Mike Williamson
5

Menyunting ini dengan menjalankan: usermod -d /home/whatever_dir whatever_user.

Harap dicatat bahwa ini akan (jelas) menjadi direktori home baru. Bash akan cdmelakukannya saat login, jadi pastikan itu ada dan izin sudah benar. Selain itu, jangan lupa tentang .bashrc, .profile, .xinitrc, dll; jika mereka tidak ada di direktori home, mereka tidak akan dibaca.

Dari 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
Sintead
sumber
0

Saya melakukan beberapa penggalian, dan jawabannya cukup mengejutkan. Ambil skrip tes berikut dan chmod +x:

#!/bin/bash 
printf 'My home is: '
echo  ~ || echo 'nowhere'

Kita dapat menjalankannya dengan ./test.shdan melihat:

Rumah saya adalah: / home / pengguna

Mari kita mengintip di bawah tenda dengan 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 (3) 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_CLOEC | = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/ usr / lib / locale / arsip-lokal", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ usr /" / usr / "/ usr /) lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3

Saya tidak melihat penyebutan HOME, file rc, atau passwd. Mari kita coba dengan env bersih:

env -i bash
echo $HOME  #this will be blank since we cleared the env

Tidak ada, seperti yang diharapkan. Mari kita jalankan skrip di env kosong.

env -i bash
./test.sh 

Rumah saya adalah: / home / pengguna

Menarik, skripnya bisa pulang. Sekarang mari kita telusuri.

strace ./test.sh |& grep '^open[a-z]*'

Sekarang kita melihat:

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 (3) 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_CLOEC | = 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.co. 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

Saya sudah berani garis yang menarik. Seperti yang dapat kita lihat, akan terlihat bahwa ketika $HOMEtidak ditentukan, shell akan mencoba mengisinya, bahkan ketika tidak dalam mode login atau interaktif.

DeusXMachina
sumber