Подтвердить что ты не робот

Проверьте, находится ли пользователь в группе

У меня есть сервер, на котором я использую php для запуска bash script для проверки определенной информации пользователя. Например, у меня установлен сервер веб-хостинга, и для того, чтобы добавить другой домен в свою учетную запись, я хочу проверить, действительно ли пользователь является членом группы клиентов. Какой был бы лучший способ сделать это?

Я искал google, но все, что вам нужно, это проверить, существует ли пользователь или группа, поэтому Google сейчас не очень помогает.

4b9b3361

Ответ 1

Попробуйте сделать это:

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

Ответ 2

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 как целое слово.

Ответ 3

Я знаю, что это, вероятно, старая тема, но на всякий случай это тоже хорошо работает:

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

если возвращается любое число> 0, то пользователь является членом этой группы.

Ответ 4

Вы можете использовать groups $username_here | grep -q '\busergroup\b'

Выходной код будет 0, если совпадение найдено, 1, если совпадение не найдено.

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

эту функцию можно использовать как user_in_group userfoo groupbar

Ответ 5

Чуть более надежный метод проверки членства в группе с использованием фиксированной строки 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

или используя длинные опции

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

Ответ 6

Звучит как другой ответ:

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

Как указано sputnick, вывод команды groups может зависеть от вашей ОС. Я не уверен, как этот код будет работать, но, скорее всего, он будет лучше.

Ответ 7

Для всех этих любителей гольфа :

ingroup(){ [[ " "'id -Gn $2'" " == *" $1 "* ]] }

Использование: ingroup group [user]

Пример:

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

В этом решении используется groups, поэтому его ужаливают, если имя пользователя возвращается как часть его вывода, которого не было в моей системе, здесь нет никакого вкуса! (Обратите внимание, что пользователь часто является частью группы с тем же именем, что и пользователь, поэтому, вероятно, это не имеет значения.) Вы можете попробовать: [[ 'id -Gn $2'" " == *" $1 "* ]], который не будет смотреть на первое слово в выводе groups. Что-нибудь более сложное, чем это, и мы были бы по номиналу.

TL; DR Суть в том, что я воспользовался встроенным смещением, чтобы найти подстроку.

Редактировать: Спасибо @Anthony Geoghegan за совет id -Gn.

Ответ 8

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

Но есть один угол, когда ваш пользователь имеет имя customers:

customers : cdrom floppy sudo audio dip video plugdev fuse

Например, шаблон \bcustomers\b будет искать имя пользователя, а не группу. Поэтому вы должны убедиться, что это не первое слово на выходе.

Кроме того, другое хорошее регулярное выражение:

grep -q ' customers\b'

Ответ 9

Моя версия не полагается на 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"
}

Ответ 10

Использование разделителя нуля для разделения на строки:

id -nGz user | tr '\0' '\n' | grep '^group$'

Ответ 11

Некоторое время назад я написал функцию оболочки, чтобы проверить, является ли пользователь членом группы. Чтобы максимизировать переносимость, я хотел, чтобы он был POSIX-совместимым (хотя этот вопрос помечен как bash, эта функция все еще будет работать). Для повышения производительности я хотел использовать как можно больше встроенных функций оболочки: единственная внешняя команда, которую он использует, - это id, стандартизированная POSIX утилита для получения данных об идентификации пользователя.

is_in_group()
{
  groupname="$1"
  # The second argument is optional -- defaults to current user.
  current_user="$(id -un)"
  user="${2:-$current_user}"
  for group in $(id -Gn "$user") ; do
    if [ "$group" = "$groupname" ]; then
      return 0
    fi
  done
  # If it reaches this point, the user is not in the group.
  return 1
}

Пример использования для проверки как положительных, так и отрицательных случаев - и уверенности, что он корректно обрабатывает несуществующее имя пользователя:

g=mail
userlist="anthony postfix xxx"
for u in $userlist; do
  if is_in_group "$g" "$u"; then
    printf "%s is in ‘%s\n" "$u" "$g"
  else
    printf "%s is NOT in ‘%s\n" "$u" "$g"
  fi
done

Выполнение вышеуказанной команды выводит следующий вывод:

anthony is NOT in ‘mail
postfix is in ‘mail
id: ‘xxx: no such user
xxx is NOT in ‘mail

Он не был протестирован для случая, когда у группы или пользователя есть пробел или другие необычные символы в их имени, но некоторые исследования показывают, что такие имена недопустимы: базовое определение POSIX для имени группы гласит, что

Чтобы быть переносимым между соответствующими системами, значение состоит из символы из переносимого набора символов имени файла.

Переносимый набор символов имени файла указывается в виде буквенно-цифровых символов, A-Z, a-z, 0-9, а также символов точки, подчеркивания и дефиса-минус.