Проверьте, находится ли пользователь в группе
У меня есть сервер, на котором я использую php для запуска bash script для проверки определенной информации пользователя. Например, у меня установлен сервер веб-хостинга, и для того, чтобы добавить другой домен в свою учетную запись, я хочу проверить, действительно ли пользователь является членом группы клиентов. Какой был бы лучший способ сделать это?
Я искал google, но все, что вам нужно, это проверить, существует ли пользователь или группа, поэтому Google сейчас не очень помогает.
Ответы
Ответ 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, а также символов точки, подчеркивания и дефиса-минус.