Если вы хотите перечислить пользователей, которые принадлежат к дополнительной группе foo
, используйте
getent group foo | cut -d ':' -f 4- | tr -s '\n,' '\n\n'
Команда getent
использует " переключатель службы имен "; это означает, что даже в системах, где информация о пользователе и пароли хранятся на удаленном сервере, getent
все еще может получить информацию о пользователе:
getent passwd
вместо анализа / etc / passwd
getent group
вместо синтаксического анализа / etc / group
Если третий параметр указан выше, отображается только соответствующая запись. (Существуют также shadow
и gshadow
, но getent
предоставляет информацию только пользователям с особыми привилегиями.)
Вывод getent group foo
выглядит примерно так
foo:x:1001:user1,user2,user3
, где первое поле - это имя группы, второе поле - пароль группы ( *
без пароля или x
, если он есть только в файле gshadow
), третье поле - это номер идентификатора группы, а четвертое поле - это разделенный запятыми список пользователей, имеющих эту группу в качестве дополнительной группы. .
Команда cut -d ':' -f 4-
удаляет первые три поля, разделенных двоеточиями, из каждой строки. (Или, другими словами, он выводит только четвертое и любые последующие поля, разделенные двоеточиями, из каждой строки ввода.) Это удаляет имя группы, ссылку на пароль и номер идентификатора группы.
tr -s '\ n,' '\ n \ n'
преобразует все запятые в символы новой строки и объединяет все следующие друг за другом символы новой строки (и запятые) в одну новую строку.
Таким образом, вывод - это просто имена пользователей с foo
в качестве дополнительной группы, по одному имени пользователя в строке.
В список не входят пользователи, основная группа которых ( id -gn
) - foo
; только те, у кого есть foo
в качестве дополнительной группы ( id -Gn
).
Если вы хотите перечислить пользователей, у которых foo
в качестве основной группы, используйте, например,
getent passwd | awk -F ':' '$4=='$(id -g foo)' { print $1 }'
На этот раз мы выгружаем всю базу данных passwd и фильтруем ее с помощью awk
.
Часть $ (id -g foo)
фактически находится вне одинарных кавычек и, таким образом, расширяется до идентификатора группы group foo
.Правило awk сравнивает четвертое поле, разделенное двоеточиями, в каждой строке с номером идентификатора группы (группы foo
), и, если оно совпадает, печатает первое поле (имя этого пользователя).
Команда lastlog
может использоваться для получения регистрационной записи пользователей. Параметр -t
позволяет указать количество дней, учитываемых для записи.
Локализован вывод (в частности, формат даты) команды lastlog
. Это означает, что языковой стандарт пользователя влияет на способ отображения дат в выводе lastlog
. Если вы хотите, чтобы выходные данные всегда были на английском языке и использовали английский формат даты, используйте
LANG=C LC_ALL=C lastlog
LANG = C LC_ALL = C
- две переменные среды, наиболее часто используемые для установки языкового стандарта. Оболочки позволяют временно переопределить среду для одной команды, просто поместив их перед самой командой.
Например, чтобы перечислить только пользователей, которые не входили в систему за последние 10 дней, вы можете использовать
LANG=C LC_ALL=C lastlog -t 10 | awk '/Never logged in/ { print $1 }'
Обратите внимание, что это не ограничивает выбор членами группы foo
, хотя .
Вы всегда можете проверить, членом каких дополнительных групп является пользователь, используя
id -gn username
В Bash вы можете использовать
groups=" $(id -gn "$user") "
if [ "${groups// foo / }" != "$groups" ]; then
# user $user is a member of group foo
else
# user $user is not a member of group foo
fi
, чтобы проверить, является ли пользователь $ user
членом группы foo
. (Опять же, это проверяет только дополнительные группы, а не основную группу. У каждого пользователя есть одна основная группа, и это можно получить с помощью id -Gn "$ user"
.)
Это работает, потому что $ groups
сначала устанавливается в разделенный пробелами список дополнительных групп для пользователя $ user
, с начальным и конечным пробелами. Обратите внимание на цитату! Выражение Bash $ {groups // foo /}
расширяется до значения $ groups
,но все экземпляры foo
(обратите внимание на начальный и конечный пробелы) удалены (заменены пробелом).
Предложение if
сравнивает значение $ groups
с удаленным foo
со значением $ groups
. Если они отличаются, то $ group
должно содержать foo
. Если вам это не нравится, вы можете использовать эквивалент
if id -Gn "$user" | tr -s ' \n' '\n\n' | grep -qxF foo ; then
# user "$user" is a member of group foo
fi
Здесь tr
объединяет все следующие друг за другом пробелы и символы новой строки в новые строки, разделяя имена групп для каждой на отдельной строке. grep -qxF foo
выполняет «тихую» команду grep ( -q
), то есть ничего не выводит, только возвращает успех или неудачу (и в конвейерной команде, подобной той в Bash , успех / неудача определяется последней командой в конвейере); параметры -x
означают, что сравниваются целые строки (поэтому мы не принимаем все группы , содержащие foo
в них, только группы , точно соответствующие foo
); и, наконец, опция -F
означает, что grep
интерпретирует foo
как фиксированную строку, а не как регулярное выражение. (Это имеет значение только в том случае, если foo
должен содержать символы со специальным значением в регулярных выражениях, например *
, [
, ]
и т. Д. on.)
Чтобы написать сценарий Bash, как описано в вопросе, вам понадобится что-то из вышеперечисленного - есть как минимум два разных способа использовать некоторые из вышеперечисленных для решения этой проблемы - плюс некоторый вид "чтения каждый ввод в цикл "переменная", т.е.
some command | while read line ; do
# Here, "$line" iterates through the lines
# output by some command
done
Когда служба NetworkManager-wait-online.service
включен, он гарантирует, что все настроенные сетевые устройства включены и им назначен IP-адрес перед продолжением загрузки. Эта служба будет отключена по истечении 90 секунд. Включение этой службы может значительно задержать загрузку, даже если время ожидания не истечет.