我有一臺服務器運行,我使用php運行一個bash腳本來驗證用戶的某些信息。例如,我設置了一個虛擬主機服務器,爲了能夠將其他域添加到他們的帳戶中,我想驗證用戶是否真的是「客戶」組的成員。什麼是最好的方法來做到這一點?檢查一個用戶是否在一個組中
我搜索谷歌,但它提出的方法是檢查用戶或組是否存在,所以谷歌現在不是一個很大的幫助。
我有一臺服務器運行,我使用php運行一個bash腳本來驗證用戶的某些信息。例如,我設置了一個虛擬主機服務器,爲了能夠將其他域添加到他們的帳戶中,我想驗證用戶是否真的是「客戶」組的成員。什麼是最好的方法來做到這一點?檢查一個用戶是否在一個組中
我搜索谷歌,但它提出的方法是檢查用戶或組是否存在,所以谷歌現在不是一個很大的幫助。
試着這樣做:
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
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'
)如果客戶也是用戶名呢?你的命令將失敗 –
@sputnick它不會,因爲在用戶名之前沒有空格 –
用我之前討論過的bug進行測試:'groups sputnick | grep -q -E'sputnick (\ s | $)''這個返回false,我在我自己的組中 –
聽起來像另一個答案:
username='myuser'
if grep -q -E "^customers:.*[:,]$username(,.*|\b)" /etc/group; then
echo 'true'
else
echo 'false'
fi
據報道由sputnick
的groups
命令的輸出可能取決於你的操作系統上。 我不確定這個代碼是如何執行的,但很可能它會做得更好。
對於所有那些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來查找子串。
你可以使用 groups $username_here | grep -q '\busergroup\b'
的退出碼爲0,如果找到匹配,1,如果沒有找到匹配。
user_in_group()
{
groups $1 | grep -q "\b$2\b"
}
您可以使用此功能user_in_group userfoo groupbar
if id -nG "$USER" | grep -qw "$GROUP"; then
echo $USER belongs to $GROUP
else
echo $USER does not belong to $GROUP
fi
說明:
id -nG $USER
顯示用戶所屬的組名。grep -qw $GROUP
默認情況下檢查$ GROUP作爲整個單詞是否存在於輸入中。我知道這可能是舊的線程,但爲了以防萬一,這也非常:
ID-Gn中「用戶名」 |如果返回的grep -c「組名」
任意數量> 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
應該'YOUR_OWN_USERNAME'實際上是我自己的用戶名,或者可能只是以及在系統上任何其他現有的用戶名?另外,是不是有一種方法來將其作爲bash腳本中的if語句而不是php?我正在運行一個bash腳本來檢查用戶是否存在,我想用同一個腳本來檢查用戶是否也在「客戶」組中。 –
對不起,在bash中重寫;)由於某種原因,每次都會返回false,所以可以使用系統 –
中的任何user_name。我也嘗試刪除組名兩邊的'\ b',因爲我不知道它的作用,但是這給了我相同的結果。 –