Tìm hiểu xem tên người dùng có tồn tại không


68

Làm thế nào tôi có thể tìm ra, trong một tập lệnh shell, liệu một tên người dùng nhất định có tồn tại trên hệ thống hiện tại không?


/etc/passwd/etc/shadowkhông đầy đủ. Xem xét Dịch vụ thư mục của OS X hoặc Linux với tích hợp Tương tự Active Directory.

Câu trả lời:


103

Một trong những công cụ cơ bản nhất được sử dụng cho điều đó có lẽ là id.

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

Sản xuất

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
Bạn không cần các backquote ở đây - chỉ cần sử dụng if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson

1
@Gordon hoàn toàn đúng tất nhiên. Cảm ơn :)
barbaz

"-U" cũng có vẻ không cần thiết
palacsint

Nếu tôi chỉ cần ifvới trình kiểm tra kết quả âm tính thì sao?
Yura Shinkarev

id -u $1 1>/dev/null 2>&1; echo $?có thể được sử dụng cho đường ống
JasonWayne

20

nhận

Lệnh này được thiết kế để thu thập các mục nhập cho cơ sở dữ liệu có thể được hỗ trợ bởi các tệp / etc và các dịch vụ từ xa khác nhau như LDAP, AD, NIS / Trang vàng, DNS và các lượt thích.

Để tìm hiểu xem tên người dùng có được biết đến bởi một trong các dịch vụ đặt tên mật khẩu hay không, chỉ cần chạy:

getent passwd username

Điều này cũng hoạt động với nhóm, máy chủ lưu trữ và những người khác, tùy thuộc vào hệ điều hành và thực hiện.


1
Trong khi Solaris và Linux, và gần đây cũng có hầu hết các BSD có getent, không có getenttrên Mac OS X
barbaz

Thật vậy, tôi đã bỏ lỡ Mac OS / X bị thiếu getent.
jlliagre

Tuy nhiên, nó khá hữu ích trên các hệ thống mà nó hỗ trợ.
Daniel Beck

1
getent là tốt vì bạn có thể truy vấn nhiều tên người dùng trong đó id chỉ hỗ trợ một tên người dùng.
vào

6

finger

Phân tích đầu ra của finger -m <username>. Không có mã lỗi nếu không tìm thấy người dùng, thật không may, nhưng nếu không tìm thấy, đầu ra lỗi sẽ được ghi. Không có nhược điểm cho đến nay.

finger -ms <username> 2>&1 1>/dev/null | wc -l

Sẽ in 0nếu người dùng được tìm thấy (vì không có đầu ra lỗi), số khác lớn hơn.

chown

Chạy (như bất kỳ người dùng, đáng ngạc nhiên):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

Nếu thất bại root, tên tài khoản không hợp lệ.

Nếu nó không thành rootngười dùng, hãy phân tích đầu ra có thể cục bộ cho Hoạt động không được phép hoặc người dùng không hợp lệ (hoặc tương đương). Đặt LANGtrước để làm điều này đáng tin cậy.


0

Tôi sẽ nói rằng bạn muốn dựa vào /etc/passwdvà tương tự (ví dụ: /etc/shadowđối với các hệ thống dựa trên Shadow; trên một ghi chú phụ ngoài chủ đề, một số hệ thống tương tự có thể sử dụng /etc/master.passwdhoặc các tệp như vậy).

Các /etc/passwdthường coi là quyết định có thẩm quyền tuyệt đối vào việc một người dùng tồn tại hay không. Nếu bạn sử dụng bất kỳ phương thức nào khác được mô tả trên trang này và nếu các phương thức khác đó trỏ đến người dùng hiện tại nhưng /etc/passwdkhông, thì tôi sẽ nói rằng người dùng đó không tồn tại đúng trên hệ thống, theo định nghĩa của tiêu chuẩn phổ biến nhất mà phần mềm có thể sẽ dựa vào.

Điều đó nói rằng, tôi sẽ đưa ra một cách khác để thêm vào hỗn hợp của một số tùy chọn khác có thể được sử dụng.

ls -l /home | grep ^customUserName$<BR> echo $?

Rõ ràng, thay thế "customuserName" bằng tên của người dùng bạn muốn kiểm tra. Thay thế / nhà bằng / người dùng nếu đó là những gì hệ thống của bạn sử dụng. Điều này có thể không tìm thấy tất cả người dùng trong / etc / passwd nếu không có thư mục chính nào được tạo cho người dùng cụ thể, điều này có thể xảy ra nếu bạn chỉ nhập người dùng (nghĩa là, dòng văn bản vào / etc / passwd) và nếu thư mục chính không được thực hiện trừ khi / cho đến khi một người đăng nhập.


Tôi không hiểu lý do tại sao bạn tuyên bố người dùng không có mục nhập trong tập tin / etc / password nhưng được báo cáo là hợp lệ bởi idhoặc getentkhông "đúng" tồn tại trên hệ thống, đặc biệt là khi OP nêu rõ các dịch vụ đặt tên được cân nhắc.
jlliagre
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.