Tôi đang tìm nơi đặt biến môi trường $ HOME. Đó là sau khi đăng nhập, với tâm trí của tôi.
Tôi đang sử dụng Linux debian 2.6.32-5-686.
Tôi đang tìm nơi đặt biến môi trường $ HOME. Đó là sau khi đăng nhập, với tâm trí của tôi.
Tôi đang sử dụng Linux debian 2.6.32-5-686.
Câu trả lời:
Nếu bạn đang cố gắng sửa đổi TRANG CHỦ của mình, bạn có thể làm
export HOME=/home/...
trong vỏ của bạn hoặc trong tệp ~ / .profile của bạn và / hoặc ~ / .bashrc (hoặc vỏ đăng nhập thích hợp).
(Đoạn mã trên sẽ hoạt động cho bash và các shell tương tự, được mặc định trong Debian; nếu không thì bạn sẽ làm `setenv HOME $ HOME: / thêm / đường dẫn tôi nghĩ trên các shell giống như csh trong các bản phát hành khác.)
chỉnh sửa - Tuy nhiên, đây có lẽ không phải là cách để làm điều đó. Xem câu trả lời khác. Không sử dụng câu trả lời này.
Trên Linux, HOME
biến môi trường được đặt bởi chương trình đăng nhập:
login
trên các phiên giao diện điều khiển, telnet và rloginsshd
các kết nối SSHgdm
, kdm
hoặc xdm
cho các phiên đồ họa.Chương trình đăng nhập sắp xếp nó trước khi gọi exec trên shell của bạn (bằng cách đưa nó vào đối số để thực thi), dựa trên giá trị trong / etc / passwd.
Chỉnh sửa điều này bằng cách chạy : usermod -d /home/whatever_dir whatever_user
.
Xin lưu ý rằng đây sẽ (rõ ràng) là thư mục nhà mới. Bash sẽ cd
đăng nhập, vì vậy hãy chắc chắn rằng nó tồn tại và các quyền là chính xác. Bên cạnh đó, đừng quên về .bashrc
, .profile
, .xinitrc
, vv; nếu chúng không có trong thư mục chính, chúng sẽ không được đọc.
Từ 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
Tôi đã thực hiện một số hoạt động đào, và câu trả lời cho điều này là một chút ngạc nhiên. Lấy kịch bản kiểm tra sau đây và chmod +x
nó:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Chúng ta có thể chạy nó với ./test.sh
và xem:
Nhà tôi là: / nhà / người dùng
Chúng ta hãy nhìn trộm dưới mui xe với sải chân.
$ 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 = 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-Module.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
Tôi không thấy bất kỳ đề cập nào về HOME, các tệp RC hoặc passwd. Hãy thử với một env sạch:
env -i bash
echo $HOME #this will be blank since we cleared the env
Không có gì, như mong đợi. Hãy chạy tập lệnh trong env trống.
env -i bash
./test.sh
Nhà tôi là: / nhà / người dùng
Thú vị, kịch bản có thể về nhà. Bây giờ hãy theo dõi.
strace ./test.sh |& grep '^open[a-z]*'
Bây giờ chúng ta thấy:
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_ = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
openat (AT_ bộ nhớ 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" , 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/l O_CLOEXEC) = 3
openat (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "./test.sh", O_RDONLY) = 3
Tôi đã in đậm những dòng thú vị. Như chúng ta có thể thấy, có vẻ như khi $HOME
không được xác định, shell sẽ cố gắng điền nó vào, ngay cả khi không ở chế độ đăng nhập hoặc tương tác.
$HOME
với$PATH
. Không có nghĩa là có nhiều đường dẫn trong$HOME
(toàn bộ giá trị sẽ được coi là một tên đường dẫn duy nhất) hoặc, trong hầu hết các trường hợp, để sửa đổi$HOME
tất cả.