Tôi có một USER
biến trong kịch bản của mình và tôi muốn xem HOME
đường dẫn của anh ấy dựa trên USER
biến đó. Làm thế nào tôi có thể làm điều đó?
Tôi có một USER
biến trong kịch bản của mình và tôi muốn xem HOME
đường dẫn của anh ấy dựa trên USER
biến đó. Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Có một tiện ích sẽ tra cứu thông tin người dùng bất kể thông tin đó được lưu trữ trong các tệp cục bộ như /etc/passwd
hoặc trong LDAP hoặc một số phương pháp khác. Nó được gọi là getent
.
Để có được thông tin người dùng từ nó, bạn chạy getent passwd $USER
. Bạn sẽ nhận được một dòng trở lại trông giống như:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Bây giờ bạn có thể chỉ cần cắt bỏ thư mục nhà từ nó, ví dụ bằng cách sử dụng cắt, như vậy:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
với các biến trong bash
. Không trực tiếp, dù sao.
~
nhiên, dường như mở rộng tab và một hành vi cụ thể khác của tiền tố dấu ngã sẽ được thay thế bằng một tên đường dẫn của thư mục làm việc ban đầu được liên kết với tên đăng nhập có được bằng cách sử dụng getpwnam()
hàm và do đó có thể việc tra cứu là khá tốt. Tôi không thích mở rộng tab, mặc dù vậy - tôi thích gõ các tab.
Bạn có thể sử dụng eval
để có được thư mục nhà của ai đó.
eval echo "~$USER"
Ít nhất là cho người dùng địa phương điều này hoạt động chắc chắn. Tôi không biết nếu người dùng từ xa như LDAP được xử lý eval
.
eval
là cần thiết. Bash không xử lý ~foo
sau khi mở rộng biến.
USER
.
$USER
mở rộng để chỉ một chuỗi duy nhất của ký tự chữ.
Nơi thông thường là /home/$USER
, nhưng đó không phải là phổ quát. Nơi cuối cùng để tìm kiếm thông tin đó là trong tập tin /etc/passwd
.
Tập tin đó có thể đọc được trên thế giới (bất kỳ ai cũng có thể đọc nó), vì vậy bất kỳ người dùng nào cũng có quyền truy cập vào nội dung của nó.
Nếu $ USER tồn tại trong tệp, mục nhập trước đó cuối cùng là thư mục HOME của người dùng.
Điều này sẽ chọn mục nhập và in thư mục HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Đối với các hệ thống (từ xa) phức tạp hơn, getent là lệnh thông thường để lấy thông tin người dùng từ hệ thống NSS (thư viện dịch vụ chuyển đổi tên).
Một lệnh của
echo $(getent passwd $USER )| cut -d : -f 6
Sẽ cung cấp thông tin tương đương (nếu có).
Nếu người dùng không tồn tại, getent
sẽ trả về một lỗi.
Đây là một hàm shell nhỏ không bỏ qua mã thoát của getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Đây là một ví dụ sử dụng:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Nếu bạn đã đăng nhập bằng root, nếu bạn biết USER
mật khẩu hoặc nếu USER
không có mật khẩu, thì đây là một tùy chọn khác:
su -c 'echo ~' ${USER}
Theo su
hành vi tiêu chuẩn , nếu USER
không được xác định hoặc trống, thì su
sẽ cố chạy lệnh dưới dạng root.
Nếu giá trị của USER
không phải là tên người dùng hợp lệ, thì một lỗi thích hợp sẽ xuất hiện : su: user <user> does not exist
.
Đã có rất nhiều câu trả lời hay ở đây nhưng điều này vẫn có thể giúp được ai đó.