Список всех пользователей-людей

Как я могу перечислить всех пользователей-пользователей, которых я создал? Я пробовал cat /etc/passwd, и он просто перечисляет много вещей.

19
задан 1 May 2015 в 08:17

8 ответов

У пользователей-пользователей 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).

0
ответ дан 1 May 2015 в 08:17

Это делает в значительной степени то, что делает принятый ответ , только одной командой вместо трех:

awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd

И благодаря Карелу в комментариях пользователь nobody также отфильтрованы.

0
ответ дан 1 May 2015 в 08:17

Лично мне нравится использовать просто:

ls /home

По общему признанию, это не список пользователей, а список их домашних каталогов. В настоящее время существующие пользователи в системе будут иметь домашние каталоги в /home, но вы также можете увидеть домашние каталоги прошлых пользователей, которые были удалены.

Это работает для моих целей и может работать для вас. Например, если вы хотите удалить учетную запись пользователя, которая больше не существует ( nonexistent-user ) и выполнить команду

sudo deluser nonexistent-user

, она просто скажет вам, что этот пользователь не существует.

0
ответ дан 1 May 2015 в 08:17

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}'

0
ответ дан 1 May 2015 в 08:17

Присоединяясь к группе, я наблюдаю за сетевыми системами, использующими LDAP, с домашними каталогами за пределами /home и UID (из-за сбоя скриптов) в миллионах. Поэтому ни один из текущих ответов не работает. Тест, который работает для меня, проверяет, есть ли у пользователя действительная оболочка для входа. Действительная оболочка - это оболочка, которая указана в /etc/shells . Простейшая форма:

getent passwd | grep -wFf /etc/shells

Файл может содержать комментарии (или пустые строки), поэтому может потребоваться отфильтровать их:

getent passwd | grep -wFf <(grep '^/' /etc/shells)
0
ответ дан 1 May 2015 в 08:17

В то время как это могло бы походить на ясную идею, на самом деле существует неоднозначность в значении пользователя - человека. Учетная запись пользователя сознательно скрыта от экрана входа в систему, потому что это использовало только в специализированных целях (но людьми) пользователя - человека? Как насчет 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 как что-то другое, чем место для корневых каталогов пользователей, этот метод не произведет надежный вывод.)

Создание UID, проверяющего более простой

Если Вы решаете пойти с методом, который проверяет идентификаторы пользователей, чтобы гарантировать, что они находятся в вероятном диапазоне для учетных записей, представляющих людей, как в принятом ответе или ответе Oli, то я предлагаю это для краткости:

getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'

Это использует регулярное выражение Perl (-P) показать:

  • текст в начале строки (^) содержа нет :s ([^:]+) — это - первое поле, как : разделитель полей в passwd
  • это предшествует, но не включает ((?= )) поле пароля x — это должно всегда быть x, с тех пор в хэшах пароля Ubuntu хранятся в shadow база данных, не читаемое миром passwd база данных
  • и поле UID, состоящее точно из 4 цифр (:\d{4}:).

Это - таким образом значительно более короткий и несколько более простой вариант техники в принятом ответе. (Техника, описанная там, хорошо работает также, и она действительно обладает преимуществом того, чтобы быть портативным к не  –   системы GNU/Linux чей grep не поддерживает -P.)

Пересмотр "человека" диапазон UID

Если Вы хотите разместить очень высокий 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}'
4
ответ дан 1 May 2015 в 08:17

В системах Buntu обычные пользователи (то есть пользователи) имеют идентификаторы UID, начинающиеся с 1000, которые назначаются им последовательно при создании их учетных записей. Все это сводится к тому, что первая учетная запись, созданная в системе Buntu, имеет UID 1000. Следующая созданная учетная запись имеет UID 1001. И так далее, и так далее.

Итак, самый простой способ составить список всех учетных записей пользователей-людей, присутствующих в системе, на мой взгляд, это проверить, является ли третий столбец в файле /etc/passwd, который содержит UID пользователя, больше или равен 1000 и меньше чем, скажем, 2000 (очень маловероятно, что на типичном настольном ПК будет более тысячи учетных записей, не так ли?):

$ awk -F:' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
0
ответ дан 1 May 2015 в 08:17
grep -E "x:[1-9]([0-9]){3}:" /etc/passwd

Он просматривает содержимое /etc/passwd в поисках записей пользователей-людей.

Для этого grep ищет строки с идентификационными номерами пользователей больше 1000.

Примеры соответствия regex:

x:1001:

x:1203:

0
ответ дан 12 December 2021 в 17:28

Другие вопросы по тегам:

Похожие вопросы: