Как я могу перечислить всех пользователей-пользователей, которых я создал? Я пробовал cat /etc/passwd
, и он просто перечисляет много вещей.
У пользователей-пользователей UID начинаются с 1000, поэтому вы можете использовать этот факт для фильтрации не-людей:
cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4} Это обрезает первое (имя пользователя) и третье (UID) поля, разделенные двоеточиями из /etc/passwd
, затем отфильтровывает результирующие строки, которые заканчиваются двоеточием и четырьмя цифрами, а затем вырезает из этого первое поле (имя пользователя), оставляя вам список пользователей с UID от 1000 до 9999.
Если в вашей системе более девяти тысяч пользователей, это не удастся, но необходимо ограничить результат 4-значными UID, чтобы не перехватывать nobody
(UID 65534).
| cut -d: -f1
Это обрезает первое (имя пользователя) и третье (UID) поля, разделенные двоеточиями из /etc/passwd
, затем отфильтровывает результирующие строки, которые заканчиваются двоеточием и четырьмя цифрами, а затем вырезает из этого первое поле (имя пользователя), оставляя вам список пользователей с UID от 1000 до 9999.
Если в вашей системе более девяти тысяч пользователей, это не удастся, но необходимо ограничить результат 4-значными UID, чтобы не перехватывать nobody
(UID 65534).
Это делает в значительной степени то, что делает принятый ответ , только одной командой вместо трех:
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
И благодаря Карелу в комментариях пользователь nobody
также отфильтрованы.
Лично мне нравится использовать просто:
ls /home
По общему признанию, это не список пользователей, а список их домашних каталогов. В настоящее время существующие пользователи в системе будут иметь домашние каталоги в /home
, но вы также можете увидеть домашние каталоги прошлых пользователей, которые были удалены.
Это работает для моих целей и может работать для вас. Например, если вы хотите удалить учетную запись пользователя, которая больше не существует ( nonexistent-user
) и выполнить команду
sudo deluser nonexistent-user
, она просто скажет вам, что этот пользователь не существует.
TL; DR : только системные пользователи имеют SystemAccount = false
Еще одним способом является вывод результатов при игнорировании root ls /var/lib/AccountsService/users/ | grep -v root
. Теперь есть причуды - gdm, экран приветствия / входа в систему (или, более формально, менеджер рабочего стола) также указан как пользователь. Так что по списку мы не можем сказать, является ли gdm человеком или нет.
Более эффективный и правильный подход заключается в том, чтобы просмотреть файлы в этой папке и выяснить, какие пользователи указаны как имеющие SystemAccount=false
. Однострочный сильфон достигает того, что
grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'
Присоединяясь к группе, я наблюдаю за сетевыми системами, использующими LDAP, с домашними каталогами за пределами /home
и UID (из-за сбоя скриптов) в миллионах. Поэтому ни один из текущих ответов не работает. Тест, который работает для меня, проверяет, есть ли у пользователя действительная оболочка для входа. Действительная оболочка - это оболочка, которая указана в /etc/shells
. Простейшая форма:
getent passwd | grep -wFf /etc/shells
Файл может содержать комментарии (или пустые строки), поэтому может потребоваться отфильтровать их:
getent passwd | grep -wFf <(grep '^/' /etc/shells)
В то время как это могло бы походить на ясную идею, на самом деле существует неоднозначность в значении пользователя - человека. Учетная запись пользователя сознательно скрыта от экрана входа в систему, потому что это использовало только в специализированных целях (но людьми) пользователя - человека? Как насчет ubuntu
пользователь (UID 999) на живом CD? И гостевые учетные записи в Ubuntu создаются на лету и уничтожаются после выхода из системы; они - пользователи - люди? Могло быть создано больше примеров.
Поэтому это соответствует этому несколько, неэквивалентные ответы были даны. Решение Saige Hamblin выполнения ls /home
то, что люди на самом деле делают, и если Вы не пишете сценарий, необходимо, вероятно, просто использовать это.
ls /home
Более устойчивыйНо возможно у Вас есть пользователи, которые были удалены, но чьи корневые каталоги все еще существуют в /home
, и необходимо постараться не перечислять их. Или возможно по некоторой другой причине необходимо гарантировать только записи в /home
это соответствует реальным учетным записям, перечислены.
В этом случае я предлагаю передать названия всего в /home
кому: getent
(для получения passwd
записи пользователей с теми именами), затем изолируйте и отобразите просто поле имени пользователя (с grep
, sed
, или awk
, согласно Вашему предпочтению). Любой из них сделает:
getent passwd $(ls /home) | grep -o '^[^:]*'
getent passwd $(ls /home) | sed 's/:.*//'
getent passwd $(ls /home) | awk -F: '{print $1}'
Это должно работать хорошо, поскольку у Вас не должно быть учетных записей пользователей с пробельными или управляющими символами на их имена; не может, не реконфигурировав Ubuntu для разрешения его; и если Вы делаете, у Вас есть большие проблемы. Таким образом обычные проблемы с парсингом ls
являются неподходящими. Но даже при том, что это действительно хорошо здесь, если Вы рассматриваете замены команды с ls
эстетически вызывая недовольство или просто дурная привычка, можно предпочесть:
getent passwd $(basename -a /home/*) | grep -o '^[^:]*'
getent passwd $(basename -a /home/*) | sed 's/:.*//'
getent passwd $(basename -a /home/*) | awk -F: '{print $1}'
Они не размещают пробельные или управляющие символы также. Я обеспечиваю их только потому, что $(ls /home)
взгляды неправильно, даже когда это правильно, и таким образом протирает многих пользователей неправильный путь. В большинстве ситуаций существуют реальные, серьезные основания постараться не анализировать ls
, и в тех ситуациях парсинг basename -a
обычно только очень немного менее плохо. В этой ситуации, однако, из-за ограничения на то, какие символы могут практически произойти в именах пользователей, они оба прекрасны.
Я использую getent
главным образом, потому что это принимает, что имена пользователей как аргументы ограничивают его вывод, но также и потому что это немного более универсально, чем исследование /etc/passwd
непосредственно, в случае, если средства аутентификации и база данных пароля обеспечиваются сетевыми службами.
Этот метод обладает дополнительным преимуществом ls /home
это, в системах с отдельным /home
раздел, lost+found
обычно появляется в выводе ls /home
.
lost+found
только появится, если, окажется, будет пользователь (человек или не) позвонивший lost+found
, который маловероятен.ls /home
прекрасен - Вы знаете, что Вам не позвонили пользователю - человеку lost+found
.Нечасто, этот метод (в любом из вышеупомянутых изменений) произведет неудовлетворительный вывод:
/home
, или нисколько, это предлагает, но не подразумевает, что учетная запись, как должны полагать, не представляет пользователя - человека. Этот метод только перечисляет пользователей, когда существует каталог того же имени в /home
./home
это не на самом деле ничей корневой каталог, и они, оказывается, имеют то же имя как существующий пользователь не-человек - или состоят из слов, разделенных пробелом, один или несколько из которых имеет то же имя как существующий пользователь не-человек - затем, некоторые пользователи не-люди могут быть включены в вывод.getent
вызовы, таким образом, разделение слова не производит побочный вывод. Но сложность не гарантирована; существенно, если Вы используете /home
как что-то другое, чем место для корневых каталогов пользователей, этот метод не произведет надежный вывод.)Если Вы решаете пойти с методом, который проверяет идентификаторы пользователей, чтобы гарантировать, что они находятся в вероятном диапазоне для учетных записей, представляющих людей, как в принятом ответе или ответе Oli, то я предлагаю это для краткости:
getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'
Это использует регулярное выражение Perl (-P
) показать:
^
) содержа нет :
s ([^:]+
) — это - первое поле, как :
разделитель полей в passwd
(?=
)
) поле пароля x
— это должно всегда быть x
, с тех пор в хэшах пароля Ubuntu хранятся в shadow
база данных, не читаемое миром passwd
база данных:\d{4}:
).Это - таким образом значительно более короткий и несколько более простой вариант техники в принятом ответе. (Техника, описанная там, хорошо работает также, и она действительно обладает преимуществом того, чтобы быть портативным к не – системы GNU/Linux чей grep
не поддерживает -P
.)
Если Вы хотите разместить очень высокий UIDs и проверку на nobody
явно, можно использовать метод в ответе Oli. Можно хотеть рассмотреть, однако, если пользователи с очень высоким UIDs должны действительно быть приняты человек, или если они, более вероятно, будут некоторым другим пользователем не-человеком специального назначения (как nobody
). На практике такие пользователи - кроме того, nobody
- являются редкими, поэтому действительно это - личный выбор с Вашей стороны.
Возможный компромисс состоит в том, чтобы перечислить пользователей в диапазоне UIDs, которым на самом деле присваивают недавно созданному, не - "системные" пользователи. Можно проверить на это в adduser.conf
:
$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999
Вот два способа перечислить пользователей, UIDs которых колеблются от 1 000 до 29 999:
getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'
В системах Buntu обычные пользователи (то есть пользователи) имеют идентификаторы UID, начинающиеся с 1000, которые назначаются им последовательно при создании их учетных записей. Все это сводится к тому, что первая учетная запись, созданная в системе Buntu, имеет UID 1000. Следующая созданная учетная запись имеет UID 1001. И так далее, и так далее.
Итак, самый простой способ составить список всех учетных записей пользователей-людей, присутствующих в системе, на мой взгляд, это проверить, является ли третий столбец в файле /etc/passwd
, который содержит UID пользователя, больше или равен 1000 и меньше чем, скажем, 2000 (очень маловероятно, что на типичном настольном ПК будет более тысячи учетных записей, не так ли?):
$ awk -F:' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
grep -E "x:[1-9]([0-9]){3}:" /etc/passwd
Он просматривает содержимое /etc/passwd в поисках записей пользователей-людей.
Для этого grep ищет строки с идентификационными номерами пользователей больше 1000.
Примеры соответствия regex:
x:1001:
x:1203: