ชุดตัวแปรสภาพแวดล้อม $ HOME อยู่ที่ไหน


17

ฉันกำลังมองหาสถานที่ที่ตัวแปรสภาพแวดล้อม $ HOME ตั้งอยู่ มันคือหลังจากเข้าสู่ใจของฉัน

ฉันใช้ Linux debian 2.6.32-5-686

คำตอบ:


2

หากคุณพยายามที่จะแก้ไข HOME ของคุณคุณสามารถทำได้

export HOME=/home/... 

ในเชลล์ของคุณหรือในไฟล์ ~ / .profile และ / หรือ ~ / .bashrc (หรือเชลล์การล็อกอินที่เหมาะสม)

(โค้ดด้านบนจะใช้งานได้สำหรับ bash และ shell ที่คล้ายกันซึ่งเป็นค่าเริ่มต้นใน Debian; คุณจะทำอย่างนั้น `setenv HOME $ HOME: / พิเศษ / พา ธ ฉันคิดว่า csh-like shells ใน distros อื่น)

แก้ไข - อย่างไรก็ตามนี่อาจไม่ใช่วิธีที่จะทำ ดูคำตอบอื่น ๆ อย่าใช้คำตอบนี้


คุณมีแนวโน้มที่จะทำให้เกิดความสับสนกับ$HOME $PATHไม่เหมาะสมที่จะมีหลาย$HOMEพา ธใน(ค่าทั้งหมดจะถือว่าเป็นชื่อพา ธ เดียว) หรือในกรณีส่วนใหญ่การปรับเปลี่ยน$HOMEเลย
user1686

@grawity: โอ๊ะขอโทษขอบคุณ น่าเศร้าที่ฉันไม่สามารถลบคำตอบของฉัน
user76871

22

บน Linux HOMEตัวแปรสภาวะแวดล้อมถูกตั้งค่าโดยโปรแกรมล็อกอิน:

  • โดยloginบนคอนโซลtelnetและเซสชันrlogin
  • โดยsshdสำหรับการเชื่อมต่อ SSH
  • โดยgdm, kdmหรือxdmสำหรับการประชุมแบบกราฟิก

8

โปรแกรมเข้าสู่ระบบจะจัดการมันก่อนที่จะเรียก exec บนเปลือกของคุณ (โดยรวมไว้ในอาร์กิวเมนต์เพื่อ exec) โดยขึ้นอยู่กับค่าใน / etc / passwd


1
สิ่งที่น่าสนใจนี้ไม่ได้รับการโหวตมากขึ้น มันเป็นคำตอบเดียวที่ระบุว่าตัวแปรสภาพแวดล้อมถูกตั้งค่าไว้ที่ไหนซึ่งเป็นคำถามจริงของ OP
Mike Williamson

5

แก้ไขสิ่งนี้โดยการเรียกใช้: 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

0

ฉันขุดบ้างและคำตอบสำหรับเรื่องนี้ค่อนข้างน่าแปลกใจ ใช้สคริปต์ทดสอบต่อไปนี้และ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ไม่ได้กำหนดเชลล์จะพยายามเติมให้แม้ว่าจะไม่ได้อยู่ในโหมดล็อกอินหรือการโต้ตอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.