检查用户是否在组中

Gab*_*tos 39 bash

我有一台运行的服务器,我使用php运行bash脚本来验证用户的某些信息.例如,我设置了一个虚拟主机服务器,为了能够将另一个域添加到他们的帐户,我想验证用户是否实际上是"客户"组的成员.最好的方法是什么?

我搜索过谷歌,但它提供的方法是检查用户或群组是否存在,所以谷歌现在不是一个很大的帮助.

Gil*_*not 31

试着这样做:

username=ANY_USERNAME
if getent group customers | grep &>/dev/null "\b${username}\b"; then
    echo true
else
    echo false
fi
Run Code Online (Sandbox Code Playgroud)

要么

username=ANY_USERNAME
if groups $username | grep &>/dev/null '\bcustomers\b'; then
    echo true
else
    echo false
fi
Run Code Online (Sandbox Code Playgroud)

  • 用户名出现在输出开头的groups命令输出中,在```:```之前.这可以通过使用```id -Gn```来避免.另外,在grep中使用-w标志可以避免使用单词边界```\ b```,并且可以使用```-q`删除输出重定向到```/ dev/null```. ``指定静默检查:grep只会以这种方式返回成功或失败退出代码到shell. (5认同)
  • 怎么没有内置的命令……这是一项很常见的任务!!!:~( (5认同)
  • 这个脚本有一个错误!如果用户名是``customers``但它不属于``customers``组,那么你的脚本仍会返回true! (3认同)
  • 这是有缺陷的。组/用户名可以包含“-”,并且该字符(就“-b”而言)用于分隔单词。`\bcustomers\b` 匹配 `non-customers` 或 `customers-data`。 (3认同)

Ant*_*xon 31

if id -nG "$USER" | grep -qw "$GROUP"; then
    echo $USER belongs to $GROUP
else
    echo $USER does not belong to $GROUP
fi
Run Code Online (Sandbox Code Playgroud)

说明:

  1. id -nG $USER 显示用户所属的组名.
  2. grep -qw $GROUP 如果输入中存在$ GROUP作为整个单词,则静默检查.

  • 对于带有`-`字符的组名,`grep -qw`不能正常工作。例如,“ systemd-journal”匹配“ journal”或“ systemd”。 (3认同)

Nic*_*kin 10

使用零字符分隔的固定字符串 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
Run Code Online (Sandbox Code Playgroud)

或使用长选项

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
Run Code Online (Sandbox Code Playgroud)

  • 即使组可能包含非单词字符(例如“-”),此方法也适用 (4认同)
  • @ralphbolton 不,你描述的问题不会发生。“-x”确保“sales”*仅*完全匹配“salessupport”,而不是“salessupport”。 (4认同)

Cor*_*rin 6

对于所有高尔夫球迷:

ingroup(){ [[ " `id -Gn $2` " == *" $1 "* ]]; }
Run Code Online (Sandbox Code Playgroud)

用法:ingroup group [user]

例子:

if ingroup video; then
  echo 'Enjoy the show!'
fi
Run Code Online (Sandbox Code Playgroud)

TL;DR 重点是我利用了内置的通配符来查找子字符串。

编辑:感谢@Anthony Geoghegan的提示id -Gn


小智 6

我知道这可能是旧线程,但以防万一这也很好用:

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

如果返回任何数字> 0,则user是该组的成员.

  • 如果您有两个具有相似名称的组(例如“sales”和“salessupport”),则会出现故障 (2认同)

odr*_*c1r 5

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

如果找到匹配项,退出代码将为 0,如果未找到匹配项,则退出代码将为 1。

user_in_group()
{
    groups $1 | grep -q "\b$2\b"
}
Run Code Online (Sandbox Code Playgroud)

您可以将此功能用作 user_in_group userfoo groupbar


inf*_*iac 5

使用零分隔符按行分割:

id -nGz user | tr '\0' '\n' | grep '^group$'
Run Code Online (Sandbox Code Playgroud)