ОП сформулировал вопрос, чтобы исключить возможность использования команды groups . Так как это часть coreutils в Linux, либо (а) он был удален, либо (б) OP неправильно набирает имя.
OP мог бы использовать groups
так, например:
for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done
Один предложенный ответ просто grep для названия группы в /etc/group
. Иногда это работает как задумано.
Немного лучшее использование grep учитывает синтаксис /etc/group
:
group_name:password:GID:user_list
так что только часть перед первым двоеточием является допустимым именем группы. Простой grep без учета синтаксиса может (и будет) забирать вводящие в заблуждение совпадения из файла. Используйте регулярные выражения, чтобы grep соответствовал именно тому, что нужно:
grep -E '^users:' /etc/group |sed -e 's/^.*://'
или используя переменную оболочки:
grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'
Однако, это только список тех, кто не входит в группу по умолчанию . Чтобы добавить их , необходимо принять во внимание файл паролей, например, путем извлечения номера идентификатора группы из /etc/group
и печати пользователей, чья группа по умолчанию соответствует /etc/passwd
, например, из
grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd
Вы можете сделать то же самое, используя только grep и sed, но это больше, чем использование awk.
Другой предложенный ответ, предложенный с использованием getent
, который также, вероятно, будет на Linux-машине (с Debian он является частью GNU libc). Однако быстрая проверка показывает, что он предоставляет только /etc/group
контент.
У меня (как и у большинства) нет libusers
или не lid
установлено, поэтому я не могу комментировать, удовлетворяет ли он условиям ОП.
Также есть id
программа, которая дает групповую информацию. Кто-то может расширить это как возможный ответ.
groups
команда. Вряд ли у вас его нет в Linux, поскольку он является частью coreutils.