Biến môi trường $ HOME được đặt ở đâu?


16

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:


2

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.


Bạn có thể nhầm lẫn $HOMEvớ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 $HOMEtất cả.
dùng1686

@grawity: xin lỗi, cảm ơn bạn. Đáng buồn là tôi không thể xóa câu trả lời của tôi.
user76871

21

Trên Linux, HOMEbiến môi trường được đặt bởi chương trình đăng nhập:

  • bởi logintrên các phiên giao diện điều khiển, telnetrlogin
  • bởi sshdcác kết nối SSH
  • bởi gdm, kdmhoặc xdmcho các phiên đồ họa.

8

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.


1
Điều thú vị này đã không nhận được nhiều phiếu bầu. Đó là câu trả lời duy nhất thực sự chỉ định nơi đặt biến môi trường, đó là câu hỏi thực tế của OP.
Mike Williamson

5

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

0

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 +xnó:

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

Chúng ta có thể chạy nó với ./test.shvà 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 $HOMEkhô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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.