Все группы находятся в базе данных group
. Чтобы подсчитать количество членов группы, извлеките членов и посчитайте запятые между ними в -. Количество участников группы равно 1 плюс это число.
#!/bin/sh
n=$( getent group "$1" | cut -d : -f 4 | grep -o, | wc -l )
printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"
Недостатком этого подхода является то, что вы всегда будете получать как минимум 1 участника в качестве выходных данных, даже если группа недействительна.Однако мы можем сначала проверить допустимую группу:
#!/bin/sh
if ! getent group "$1" >/dev/null; then
printf 'No such group: %s\n' "$1" >&2
exit 1
fi
n=$( getent group "$1" | cut -d : -f 4 | grep -o, | wc -l )
printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"
Сценарий принимает как числовые GID, так и имена групп в качестве первого аргумента командной строки.
С awk
вы бы вместо этого сделали
n=$( getent group "$1" | awk -F : '{ print split($4,dummy,",") }' )
, а затем не добавлять 1 к $n
позже или просто
getent group "$1" | awk -F : '
{
printf("There are %d members of group %s (%d)\n",
split($4,dummy,","), $1, $3)
}'
без оболочки ()printf
или переменной n
.
Это подсчитывает членство в группах, записанное в базе данных group
. Чтобы подсчитать только первичных членов группы, используйте что-то вроде
n=$( getent passwd | cut -d : -f 4 | grep -cxF "$1" )
Но опять же, вы можете сначала проверить, что $1
действительно является допустимым идентификатором группы.
Чтобы подсчитать как первичные, так и дополнительные групповые принадлежности, может быть лучше зациклиться на всех пользователях и использовать id
для каждого:
getent passwd | cut -d : -f 1 |
while read user; do
if id -G "$user" | tr ' ' '\n' | grep -q -xF "$1"; then
n=$(( n + 1 ))
fi
done
Это позволит извлечь все имена пользователей, затем вызвать id -G
для каждого и преобразовать полученный список GID в список с разделителями -новой строки. Затем grep
определяет, является ли данный GID частью этого списка, и если да, n
увеличивается на единицу.
Или быстрее, но уродливее,
n=$( getent passwd | cut -d : -f 1 |
while read user; do
id -G "$user"
done | tr ' ' '\n' | grep -c -xF "$1" )
или даже,
n=$( getent passwd | cut -d : -f 1 |
xargs -n 1 id -G | tr ' ' '\n' |
grep -c -xF "$1" )
Причина, по которой это может быть хорошим подходом, заключается в том, что могут быть пользователи, основная группа которых не содержит себя в базе данных group
.
Судя по журналу изменений, этот патч применяется через обычное обновление:
2021-01-20 - Radovan Sroka <rsroka@redhat.com> - 1.8.23-10.1
- RHEL 7.9.Z ERRATUM
- CVE-2021-3156
Resolves: rhbz#1917729
Двоичный пакет sudo -1.8.23 -10.el7 _9.1.x86 _64.rpm список изменений.
Проверка sudo
уязвимости с помощью следующей команды:
sudoedit -s /
Исправленные версииsudo
должны печататьusage
:
usage: sudoedit [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
prompt] [-T timeout] [-u user] file...
Уязвимаяsudo
версия должна печатать:
sudoedit: /: not a regular file
Во-первых, имейте в виду, что использование звездочек без экранирования может привести к расширению оболочки, что может привести к той же проблеме, с которой вы столкнулись.
Во-вторых, нет необходимости использовать звездочку вообще, yum update sudo
будет вполне достаточно.
В-третьих, если у вас есть другие пакеты, связанные с sudo
, например. sudo-logsrvd
, тогда вы можете запустить yum update 'sudo*'
.
Наконец, сообщите версию sudo черезrpm -q sudo