Làm thế nào để có được TRANG CHỦ, cho NGƯỜI DÙNG?


41

Tôi có một USERbiế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 USERbiến đó. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


72

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/passwdhoặ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

getent là câu trả lời tốt hơn, đặc biệt với người dùng từ xa. trong các hệ thống đơn giản hơn ~ người dùng nên là đủ. Modded bạn lên.
Rui F Ribeiro

@RuiFRibeiro bạn không thể sử dụng ~foovới các biến trong bash. Không trực tiếp, dù sao.
muru

1
@muru - đó là sự thật - và là hành vi cụ thể. Tuy ~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.
mikeerv

1
Lưu ý rằng điều này chỉ mang lại cho bạn giá trị ban đầu là $ HOME; tập lệnh đăng nhập của người dùng hoàn toàn có quyền thay đổi nó thành một cái khác. Đây là một điều không bình thường để làm, nhưng tôi có thể nghĩ về các tình huống có thể hợp lý, ví dụ như lựa chọn giữa một homedir gắn trên địa phương và NFS.
zwol

1
@HagenvonEitzen Colons bị cấm chính xác vì chúng đã được sử dụng để tách các trường.
Jenny D

9

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.


1
Không cần eval ở đó. Hãy cẩn thận với tiếng Anh của bạn.
Rui F Ribeiro

4
@nwk an evallà cần thiết. Bash không xử lý ~foosau khi mở rộng biến.
muru

1
Thật thú vị, cảm ơn, tuy nhiên điều này chỉ nhận được thư mục của người dùng hiện tại , không phải của người dùng khác. Tôi nghĩ rằng người dùng LDAP không được xử lý, mặc dù tôi có thể sai.
Rui F Ribeiro

3
@RuiFRibeiro Nó sẽ hoạt động tốt với LDAP, chỉ cần sử dụng bất kỳ biến nào có chứa tên người dùng LDAP của bạn thay vì USER.
muru

3
Không sử dụng này mà không cần xác minh rằng $USERmở rộng để chỉ một chuỗi duy nhất của ký tự chữ.
chepner 6/12/2015

4

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ó).


2
bạn có ~ người dùng cho điều đó và giải pháp của bạn không dự tính người dùng trong các hệ thống phức tạp hơn, như người dùng đến từ LDAP nơi bạn phải sử dụng getent.
Rui F Ribeiro

2

Nếu người dùng không tồn tại, getentsẽ 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'"

1

Nếu bạn đã đăng nhập bằng root, nếu bạn biết USERmật khẩu hoặc nếu USERkhông có mật khẩu, thì đây là một tùy chọn khác:

    su -c 'echo ~' ${USER}

Theo suhành vi tiêu chuẩn , nếu USERkhông được xác định hoặc trống, thì susẽ cố chạy lệnh dưới dạng root.

Nếu giá trị của USERkhô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 đó.


Điều này không an toàn, tùy thuộc vào cấu hình hệ thống. Nó chạy một tiến trình (shell chạy echo) với tư cách là người dùng đó, vì vậy người dùng có thể (ví dụ) ptrace shell và cung cấp cho bạn đầu ra tùy ý. Nó cũng đang chạy trong thiết lập của người dùng, vì vậy có thể các tệp cấu hình shell của người dùng đang chạy (cũng có thể cung cấp đầu ra tùy ý). Hoặc tải môi trường qua pam. V.v. Hoặc chỉ cần làm một cái gì đó đơn giản như gửi SIGSTOP để khiến nó mất mãi mãi, DOS tấn công kịch bản của bạn một cách hiệu quả.
derobert
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.