ฉันกำลังมองหาสถานที่ที่ตัวแปรสภาพแวดล้อม $ HOME ตั้งอยู่ มันคือหลังจากเข้าสู่ใจของฉัน
ฉันใช้ Linux debian 2.6.32-5-686
ฉันกำลังมองหาสถานที่ที่ตัวแปรสภาพแวดล้อม $ HOME ตั้งอยู่ มันคือหลังจากเข้าสู่ใจของฉัน
ฉันใช้ Linux debian 2.6.32-5-686
คำตอบ:
หากคุณพยายามที่จะแก้ไข HOME ของคุณคุณสามารถทำได้
export HOME=/home/...
ในเชลล์ของคุณหรือในไฟล์ ~ / .profile และ / หรือ ~ / .bashrc (หรือเชลล์การล็อกอินที่เหมาะสม)
(โค้ดด้านบนจะใช้งานได้สำหรับ bash และ shell ที่คล้ายกันซึ่งเป็นค่าเริ่มต้นใน Debian; คุณจะทำอย่างนั้น `setenv HOME $ HOME: / พิเศษ / พา ธ ฉันคิดว่า csh-like shells ใน distros อื่น)
แก้ไข - อย่างไรก็ตามนี่อาจไม่ใช่วิธีที่จะทำ ดูคำตอบอื่น ๆ อย่าใช้คำตอบนี้
บน Linux HOME
ตัวแปรสภาวะแวดล้อมถูกตั้งค่าโดยโปรแกรมล็อกอิน:
login
บนคอนโซลtelnetและเซสชันrloginsshd
สำหรับการเชื่อมต่อ SSHgdm
, kdm
หรือxdm
สำหรับการประชุมแบบกราฟิกโปรแกรมเข้าสู่ระบบจะจัดการมันก่อนที่จะเรียก exec บนเปลือกของคุณ (โดยรวมไว้ในอาร์กิวเมนต์เพื่อ exec) โดยขึ้นอยู่กับค่าใน / etc / passwd
แก้ไขสิ่งนี้โดยการเรียกใช้: usermod -d /home/whatever_dir whatever_user
.
โปรดทราบว่านี่จะเป็นไดเรกทอรีบ้านใหม่ ทุบตีจะ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_RDONLY | O_ROONC | = 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 ที่สะอาด:
env -i bash
echo $HOME #this will be blank since we cleared the env
ไม่มีอะไรตามที่คาดไว้ ลองเรียกใช้สคริปต์ใน 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_RDONLY | O_ROONC | = 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") แคช ", 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.soache ") , 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) 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
เลย