2013-08-25 58 views
28

我有一臺服務器運行,我使用php運行一個bash腳本來驗證用戶的某些信息。例如,我設置了一個虛擬主機服務器,爲了能夠將其他域添加到他們的帳戶中,我想驗證用戶是否真的是「客戶」組的成員。什麼是最好的方法來做到這一點?檢查一個用戶是否在一個組中

我搜索谷歌,但它提出的方法是檢查用戶或組是否存在,所以谷歌現在不是一個很大的幫助。

回答

21

試着這樣做:

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

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

應該'YOUR_OWN_USERNAME'實際上是我自己的用戶名,或者可能只是以及在系統上任何其他現有的用戶名?另外,是不是有一種方法來將其作爲bash腳本中的if語句而不是php?我正在運行一個bash腳本來檢查用戶是否存在,我想用同一個腳本來檢查用戶是否也在「客戶」組中。 –

+0

對不起,在bash中重寫;)由於某種原因,每次都會返回false,所以可以使用系統 –

+0

中的任何user_name。我也嘗試刪除組名兩邊的'\ b',因爲我不知道它的作用,但是這給了我相同的結果。 –

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

我要明確一點: groups可能會返回這樣的事情:

myuser : cdrom floppy sudo audio dip video plugdev fuse 

但是有一個cornercase當你的用戶名爲customers

例如,\bcustomers\b模式是要找到用戶名,不是組。所以你必須確保它不是輸出中的第一個單詞。

此外,另一個很好的正則表達式是:

grep -q ' customers\b' 
+0

)如果客戶也是用戶名呢?你的命令將失敗 –

+0

@sputnick它不會,因爲在用戶名之前沒有空格 –

+0

用我之前討論過的bug進行測試:'groups sputnick | grep -q -E'sputnick (\ s | $)''這個返回false,我在我自己的組中 –

1

聽起來像另一個答案:

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

據報道由sputnickgroups命令的輸出可能取決於你的操作系統上。 我不確定這個代碼是如何執行的,但很可能它會做得更好。

+2

如果/ etc/group內容已完成,查看設置,其中組數據由另一個源(ldap,yp)提供或補充,參見'nsswitch.conf(5)'。這些系統可能會與o卡在一起輸出'groups(1)'命令。 – sjnarv

+0

@sjnarv:在某些情況下(取決於源代碼),引入到grep的getent group也可能工作...取決於auth數據源,儘管... –

+0

在Ubuntu 14.04 LTS中有效,謝謝 – Erik

0

我的版本不依賴於grep。

第一參數(強制性的):組
第二個參數(可選,默認爲當前用戶)

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

您有忘記將'$ user'傳遞給'groups'命令 – Corin

+0

謝謝!我更新了腳本以添加缺少的變量。 – MatthieuP

0

對於所有那些golf扇出有:

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

用法:ingroup group [user]

例如:

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

此解決方案使用groups,因此如果用戶名作爲其輸出的一部分返回,它不在我的系統中,它就會被蜇傷,因此沒有口味! (請注意,用戶通常是與用戶名稱相同的組的一部分,所以它可能無關緊要。)您可以嘗試:[[ groups $ 2 " " == *" $1 "* ]]它不會看groups的輸出中的第一個單詞。任何比這更復雜的事情,我們會超過標準。

TL; DR關鍵是我利用內置的globbing來查找子串。

3

你可以使用 groups $username_here | grep -q '\busergroup\b'

的退出碼爲0,如果找到匹配,1,如果沒有找到匹配。

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

您可以使用此功能user_in_group userfoo groupbar

+0

爲什麼'''echo $?'''? shell函數自動返回最後執行的命令的退出代碼。而且,通過在grep中使用'-q''',可以避免&>/dev/null。 – Antxon

+0

你是對的,謝謝!我在我的帖子中編輯了代碼。我其實不知道'-q'選項。 – odrac1r

+0

查看[我對這個問題的回答](http://stackoverflow.com/a/29557400/4161438),看看如何避免'''\ b'''。 – Antxon

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

說明:

  1. id -nG $USER顯示用戶所屬的組名。
  2. grep -qw $GROUP默認情況下檢查$ GROUP作爲整個單詞是否存在於輸入中。
3

我知道這可能是舊的線程,但爲了以防萬一,這也非常:

ID-Gn中「用戶名」 |如果返回的grep -c「組名」

任意數量> 0那麼用戶是該組的成員。

0

使用零字符分隔的固定字符串grep來檢查組成員身份的稍微更傻的方法。

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 

或使用長OPTS

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 
相關問題