2013-08-25 24 views
28

Tôi có một máy chủ đang chạy nơi tôi sử dụng php để chạy tập lệnh bash để xác minh thông tin nhất định của người dùng. Ví dụ, tôi có một máy chủ webhosting được thiết lập và để có thể thêm tên miền khác vào tài khoản của mình, tôi muốn xác minh xem người dùng có thực sự là thành viên của nhóm 'khách hàng' hay không. cách nào tốt nhất để làm việc này?Kiểm tra xem người dùng có ở trong nhóm

Tôi đã tìm kiếm trên google, nhưng tất cả điều đó đều có cách kiểm tra xem người dùng hoặc nhóm có tồn tại hay không, vì vậy, Google hiện không phải là một trợ giúp lớn.

Trả lời

21

Hãy thử làm điều này:

username=ANY_USERNAME 
if getent group customers | grep &>/dev/null "\b${username}\b"; then 
    echo true 
else 
    echo false 
fi 

hoặc

username=ANY_USERNAME 
if groups $username | grep &>/dev/null '\bcustomers\b'; then 
    echo true 
else 
    echo false 
fi 
+0

nên 'YOUR_OWN_USERNAME' thực sự là tên người dùng của riêng tôi, hoặc nó có thể chỉ cũng được bất kỳ tên người dùng hiện khác trên hệ thống? Ngoài ra, không phải là có một cách để xây dựng này như là một tuyên bố nếu trong bash script thay vì php? Tôi đang chạy một tập lệnh bash để kiểm tra xem người dùng có tồn tại hay không, và tôi muốn có cùng một tập lệnh để kiểm tra xem người dùng có nằm trong nhóm 'khách hàng' không. –

+0

Xin lỗi, viết lại trong bash;) Bạn có thể sử dụng bất kỳ user_name nào từ hệ thống –

+0

vì một số lý do này trả về false mỗi lần. Tôi cũng đã cố gắng loại bỏ '\ b' ở hai bên tên nhóm vì tôi không biết nó làm gì, nhưng điều đó đã cho tôi kết quả tương tự. –

0
username='myuser' 
if groups "$username" | grep -q -E ' customers(\s|$)'; then 
    echo 'yes' 
else 
    echo 'no' 
fi 

tôi phải rõ ràng một điều: groups lẽ sẽ trở lại một cái gì đó như thế này:

myuser : cdrom floppy sudo audio dip video plugdev fuse 

Nhưng có một cornercase khi người dùng của bạn được đặt tên customers:

Ví dụ, \bcustomers\b mô hình đang diễn ra để tìm tên người dùng, chứ không phải nhóm. Vì vậy, bạn phải chắc chắn rằng nó không phải là từ đầu tiên trong đầu ra.

Ngoài ra, một regexp tốt là:

grep -q ' customers\b' 
+0

Điều gì xảy ra nếu khách hàng cũng là tên người dùng? Lệnh của bạn sẽ bị lỗi. –

+0

@sputnick nó sẽ không, vì không có khoảng trắng trước tên người dùng –

+0

Được thử nghiệm với lỗi mà tôi đã thảo luận trước đây: 'groups sputnick | grep -q -E 'sputnick (\ s | $) ''Điều này trả về false và tôi đang ở trong nhóm của riêng tôi –

1

Âm thanh như một câu trả lời khác:

username='myuser' 
if grep -q -E "^customers:.*[:,]$username(,.*|\b)" /etc/group; then 
    echo 'true' 
else 
    echo 'false' 
fi 

Theo báo cáo của sputnick đầu ra của lệnh groups thể phụ thuộc vào hệ điều hành của bạn. Tôi không chắc chắn mã này sẽ hoạt động như thế nào, nhưng có lẽ nó sẽ hoạt động tốt hơn.

+2

Làm việc nếu nội dung của nhóm/etc/group hoàn tất. Hãy tìm các thiết lập nơi dữ liệu nhóm được phục vụ hoặc bổ sung từ một nguồn khác (ldap, yp). những hệ thống bạn có thể bị mắc kẹt với o utput của lệnh 'groups (1)'. – sjnarv

+0

@sjnarv: Trong một số trường hợp (tùy thuộc vào nguồn), 'nhóm getent' được đưa vào grep cũng có thể hoạt động ... Tùy thuộc vào nguồn dữ liệu auth ... –

+0

hoạt động trong Ubuntu 14.04 LTS, cảm ơn bạn – Erik

0

Phiên bản của tôi không dựa vào grep.

tham số đầu tiên (bắt buộc): nhóm
tham số thứ hai (không bắt buộc, mặc định là người dùng hiện hành)

isInGroup(){ 
    group="$1" 
    user="${2:-$(whoami)}" 
    ret=false 
    for x in $(groups "$user" |sed "s/.*://g") 
    do [[ "$x" == "$group" ]] && { ret=true ; break ; } 
    done 
    eval "$ret" 
} 
+0

Bạn có quên truyền '$ user' sang lệnh' groups' – Corin

+0

Cảm ơn! Tôi đã cập nhật tập lệnh để thêm biến bị thiếu. – MatthieuP

0

Đối với tất cả những golf fan trên mạng:

ingroup(){ [[ " "`groups $2`" " == *" $1 "* ]]; } 

Cách sử dụng: ingroup group [user]

Ví dụ:

if ingroup video; then 
    echo 'Enjoy the show!' 
fi 

Giải pháp này sử dụng groups do đó, tên người dùng được trả về như là một phần của kết quả đầu ra của nó, không nằm trong hệ thống của tôi, không có tính đến sở thích! (Lưu ý rằng người dùng thường là một phần của một nhóm có cùng tên với người dùng, vì vậy có thể không quan trọng.) Bạn có thể thử: [[ nhóm $ 2 " " == *" $1 "* ]] sẽ không xem từ đầu tiên trong đầu ra groups s . Bất cứ điều gì phức tạp hơn thế và chúng tôi sẽ ngang hàng.

TL; DR Điểm là tôi đã tận dụng lợi thế của được xây dựng trong globbing để tìm chuỗi con.

3

Bạn có thể sử dụng groups $username_here | grep -q '\busergroup\b'

exit code sẽ là 0 nếu một trận đấu đã được tìm thấy, 1 nếu không phù hợp đã được tìm thấy.

user_in_group() 
{ 
    groups $1 | grep -q "\b$2\b" 
} 

bạn có thể sử dụng chức năng này như user_in_group userfoo groupbar

+0

Tại sao '' 'echo $?' ''? Một hàm shell trả về mã thoát từ lệnh được thực thi cuối cùng một cách tự động. Ngoài ra, các &>/dev/null có thể tránh được bằng cách sử dụng '' '-q''' trong grep. – Antxon

+0

Bạn nói đúng, cảm ơn! Tôi đã chỉnh sửa mã trong bài đăng của mình. Tôi thực sự không biết về tùy chọn '-q'. – odrac1r

+0

Xem [câu trả lời của tôi cho cùng câu hỏi này] (http://stackoverflow.com/a/29557400/4161438) để xem cách tránh '' '\ b''' quá. – Antxon

17
if id -nG "$USER" | grep -qw "$GROUP"; then 
    echo $USER belongs to $GROUP 
else 
    echo $USER does not belong to $GROUP 
fi 

Giải thích:

  1. id -nG $USER cho thấy tên nhóm người dùng thuộc về.
  2. grep -qw $GROUP kiểm tra âm thầm nếu $ GROUP dưới dạng toàn bộ từ có trong đầu vào.
3

Tôi biết đây là chủ đề có thể cũ nhưng chỉ trong trường hợp này cũng hoạt động tốt:

id -Gn "username" | grep -c "groupname"

nếu có number> 0 được trả về thì người dùng là thành viên của nhóm đó.

0

Một phương pháp chống lừa đảo hơi khác để kiểm tra tư cách thành viên nhóm bằng cách sử dụng grep cố định bằng không giới hạn char.

if id -nGz "$USER" | grep -qzxF "$GROUP" 
then 
    echo User \`$USER\' belongs to group \`$GROUP\' 
else 
    echo User \`$USER\' does not belong to group \`$GROUP\' 
fi 

hoặc sử dụng opts dài

if id --name --groups --zero "$USER" | 
    grep --quiet --null-data --line-regexp --fixed-strings "$GROUP" 
then 
    echo User \`$USER\' belongs to group \`$GROUP\' 
else 
    echo User \`$USER\' does not belong to group \`$GROUP\' 
fi