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

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

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

7 ответов

Пользователи имеют UID, начинающиеся с 1000, поэтому вы можете использовать этот факт для фильтрации нечеловеков:

cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1

Это сокращает первое (имя пользователя) и третье (UID) двоеточие с разделителями поля из /etc/passwd, затем фильтрует результирующие строки, которые заканчиваются двоеточием и четырьмя цифрами, затем вырезает первое (имя пользователя) поле из этого, оставляя вас с списком пользователей с UID между 1000 и 9999.

Если у вас в вашей системе более девяти тысяч пользователей, это не удастся - но необходимо ограничить результат 4-значными UID, чтобы не улавливать nobody (UID 65534).

13
ответ дан 25 May 2018 в 01:22

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

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

И благодаря Karel в комментариях пользователь nobody также отфильтровывается. [ ! d2]

14
ответ дан 25 May 2018 в 01:22
  • 1
    @karel Да, может быть. Вместо фильтрации по UID я отфильтровываю это имя пользователя явно. Может быть, причина для того, чтобы иметь законного пользователя с UID, который высок ... Кто знает;) – Oli♦ 7 August 2013 в 16:37

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

ls /home

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

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

sudo deluser nonexistent-user

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

7
ответ дан 25 May 2018 в 01:22
  • 1
    +1 Этот способ прост, это то, что на самом деле делают большинство опытных пользователей, и я думаю, что он не менее надежный, чем методы, которые проверяют диапазон UID. Кажется менее вероятным, что у пользователя-пользователя был бы домашний каталог вне /home (который не был бы привязан к /home), чем тот, у которого пользователь имел бы UID менее 1000 (в конце концов, это самый распространенный метод чтобы диспетчер отображения отображал пользователя на экране входа в систему, что иногда может быть сделано для человека). Один из относительно небольших недостатков заключается в том, что lost+found будет отображаться в системах с отдельными разделами /home. – Eliah Kagan 1 May 2015 в 03:01
  • 2
    Небольшая проблема: что произойдет, если пользователь был создан с помощью useradd --no-create-home username? – Sergiy Kolodyazhnyy 1 May 2015 в 05:03
  • 3
    @Serg Я думаю, что это сводится к присущей двусмысленности в описании проблемы. Действительно ли учетная запись без домашнего каталога представляет человека? На практике такие учетные записи обычно - хотя и не всегда - используются для узкоспециализированных задач (как правило, людьми со своими отдельными учетными записями) или для пользователей, предназначенных для доступа к системе только через определенные ограниченные службы. Конечно, для useradd --no-create-home есть другой вариант использования: домашний каталог может уже существовать или может быть создан вскоре после этого, но метод ls /home отлично работает для этих случаев. – Eliah Kagan 1 May 2015 в 05:46

хотя это может показаться четкая идея, на самом деле существует неоднозначность в понимании пользователя. Это учетная запись Пользователя, намеренно скрытых от экрана входа в систему, потому что он используется только для специальных целей (но человеком) человека-пользователя? Как насчет [ф11] пользователя (uid 999) на альбоме? И гостевая учетная запись в Ubuntu создаются на лету и уничтожены после выхода; они люди? Больше примеров может быть найдено.

, следовательно, это логично, что несколько неэквивалентных ответы уже даны. Решение сейдж Хэмблин бега [ф12] люди пользователя делать, и если вы пишете сценарий, вы должны, вероятно, просто использовать, что.

, что делает [от f13] более надежные

но, возможно, у вас есть пользователи, которые были удалены, но чьи домашние каталоги все еще существуют в [ф14], и вы должны избегать их перечисление. Или может по каким другим причинам необходимо обеспечить только записи в [ф15], которым соответствуют реальные счета перечислены.

в таком случае, я предлагаю передает имена все в [ф16] в решение Сейдж Хэмблин это!Д3] (для получения [ф18] записи пользователей с такими именами), а затем выделить и отобразить только поле "имя пользователя" (с [зг19], [20 фунтов] или [клавиши f21], в соответствии с вашими предпочтениями). Любой из этих:

[Ф1] [Ф2] [Ф3]

это должно работать так, как Вы не должны иметь учетные записи пользователей с пробелом или управляющие символы в их именах; [зг19]; и если вы это сделаете, у вас большие проблемы. Таким образом, обычные проблемы с парсингом [ф22] неприменимы. Но даже если это действительно так вот, если вы считаете команду замены с [ф23] неэстетичных или просто плохая привычка, возможно, Вы предпочтете:

[Ф4] [ф5] [ф6]

это не учесть пробелы и управляющие символы либо. Я обеспечиваю их только потому, что [ф24] выглядит не так, даже когда это правильно, и так натирает многие пользователи неправильно. обычные проблемы с парсингом [ф22] не, и в тех ситуациях, разборе [ф26] обычно только чуть меньше плохого. В этой ситуации, однако, в связи с ограничением на то, что символы могут возникать практически в имена, они оба в порядке.

объяснение, преимущества, и недостатки

я использую getent в основном потому, что она принимает имя пользователя в качестве аргумента, чтобы запретить его выход, но и потому, что это немного более универсальный, чем изучение [ф28] напрямую, в случае проверки подлинности объектов и пароль базы данных, предоставляются услуги сети.

этот метод имеет дополнительное преимущество над ls /home, что в системах с отдельным [ф30] раздела [ф31] обычно появляется при выходе [f32 из].

с тем более надежный способ представлен выше, lost+found появится только если есть пользователь (человек или нет) под названием lost+found, что маловероятно. Но если вы вводите команду, а не писать сценарий, [ф35] прекрасно-вы знаете, у вас нет пользователя под названием [f36 в].

нечасто, этот метод (в любой из указанных выше вариантов) будет производить неудовлетворительный выход:

с более надежный способ представлен выше, lost+found появится только если есть пользователь (человек или нет) под названием lost+found, что маловероятно. если вы создали дополнительные каталоги в [f39 расстройства], что на самом деле не кто-нибудь домашнем каталоге пользователя, и они имеют такое же имя, как существующей не-человека-потребителя ... или состоят из слов, разделенных пробелами, одно или более из которых имеет то же имя, что существующий нечеловеческих пользователей-тогда какая-то негуманоидная пользователи могут быть включены в выходные данные. (Этот метод может быть реализован с помощью цикла и отдельных [ф40] вызовы, так что разбиение не дает ложных вывода. Но сложность не является оправданным; принципиально, если вы используете [ф41] как нечто иное, чем место для домашних каталогов пользователей, этот метод не будет производить надежную продукцию.)

делает жидкости проверять проще

если вы решите пойти с методом, который проверяет идентификаторы пользователей, чтобы они в вероятном диапазоне для организаций, представляющих людей, как принято отвечать или [ф20], то я предлагаю это для краткости:

[ф7]

это использует принято отвечать (-P), чтобы показать:

[и D40] если вы создали дополнительные каталоги в [f39 расстройства], что на самом деле не кто-нибудь домашнем каталоге пользователя, и они имеют такое же имя, как существующей не-человека-потребителя ... или состоят из слов, разделенных пробелами, одно или более из которых имеет то же имя, что существующий нечеловеческих пользователей-тогда какая-то негуманоидная пользователи могут быть включены в выходные данные. (Этот метод может быть реализован с помощью цикла и отдельных [ф40] вызовы, так что разбиение не дает ложных вывода. Но сложность не является оправданным; принципиально, если вы используете [ф41] как нечто иное, чем место для домашних каталогов пользователей, этот метод не будет производить надежную продукцию.) но если вы вводите команду, а не писать сценарий, [ф35] нормально ... ты знаешь, у тебя нет пользователя под названием [f36 в]. и поля uid, состоящее из 4 цифр (:\d{4}:). [!и D40]

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

пересмотреть "человека" ЮИД диапазоне

если вы хотите разместить очень высокие жидкостями и проверить nobody ясно, вы можете использовать метод в принято отвечать. Вы, возможно, пожелает учесть, однако если пользователям с очень высокой жидкостями должны действительно быть приняты человеком, или если они более правоподобны для того чтобы быть какой-то другой специальной нечеловеческих пользователей (например, nobody). На практике такие пользователи, помимо nobody--не редкость, поэтому действительно это решение с вашей стороны.

возможный компромисс в списке пользователей в диапазоне от жидкости, которые на самом деле будучи назначен на вновь созданный, не"система" пользователей. Вы можете проверить это в [от f60]:

[ф8]

есть два способа, чтобы список пользователей, чьи идентификаторы в диапазоне от 1000 до 29999:

на [F9] [F10]для
4
ответ дан 25 May 2018 в 01:22
  • 1
    Если вы хотите быть стилистически приятным, basename является уродливым. Это не лучше, чем ls. Основная причина, по которой мы не разбираемся, заключается в том, что это работа, которую другие инструменты могут выполнять более безопасно и чисто, не . В этом случае оболочка: cd /home; getent passwd *. – muru 1 May 2015 в 08:20
  • 2
    Я согласен с вами в том, что / home ненадежен (это бесполезно для меня, см. Мой ответ). Я просто говорю, что если вы собираетесь проповедовать о стиле, ожидайте придирки. – muru 1 May 2015 в 08:38
  • 3
    @muru Я вижу, как моя оригинальная фраза может ввести в заблуждение людей, чтобы думать, что избегать разбора ls, как правило, о стиле. 2-й пункт о «неудовлетворительном выходе» рассмотрел этот вопрос, но он представлен в следующем разделе. Я переформулировал, чтобы выяснить, почему в этой ситуации подходит ls. Хотя cd /home; getent passwd * принимают форму , часто указывающую на подход, основанный на эхолоте, я избегал этого, чтобы не заставлять читателей поверить в содержимое каталогов /home, причем странные добавленные записи не соответствуют реальным пользователей, все равно можно как-то использовать в качестве руководства к тому, что существуют пользователи. – Eliah Kagan 1 May 2015 в 08:53

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

getent passwd | grep -wFf /etc/shells

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

getent passwd | grep -wFf <(grep '^/' /etc/shells)
1
ответ дан 25 May 2018 в 01:22
  • 1
    +1 Это может быть наиболее надежный подход, предложенный до сих пор. Хотя у него есть недостаток, показывающий root (который , вероятно, не следует рассматривать как человека, поскольку люди обычно становятся root временно и для определенных целей, а не используют его для своей обычной работы), похоже, что это наименее вероятно, чтобы провалиться каким-либо серьезным образом. Методы других ответов (включая мои) могут не работать в зависимости от метода, если домашние каталоги не находятся в /home, другой мусор является в /home, UID странны, или система не использует DM. Этот ответ хорошо работает во всех этих сценариях. – Eliah Kagan 1 May 2015 в 09:05

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

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

$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
1
ответ дан 25 May 2018 в 01:22
  • 1
    Спасибо, что объяснил ответ Оли с подробностями. Вам также необходимо отфильтровать nobody. знак равно – anatoly techtonik 21 March 2017 в 10:56
  • 2
    Вам не нужно, потому что никто не имеет UID 65534 и, следовательно, автоматически отфильтровывается как все другие учетные записи нечеловеческих пользователей. – misha 21 March 2017 в 10:58

TL; DR: только пользовательские пользователи имеют SystemAccount = false

. Другой способ - отобразить вывод, игнорируя root ls /var/lib/AccountsService/users/ | grep -v root. Теперь есть quirk-gdm, экран greeter / login (или более формальный менеджер рабочего стола) также отображается как пользователь. Итак, просто из списка мы не можем сказать, является ли gdm человеком или нет.

Более эффективный и правильный подход состоит в том, чтобы проходить через файлы в этой папке и выяснить, какие пользователи указаны как SystemAccount=false. С одной лайнером достигается

grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'

0
ответ дан 25 May 2018 в 01:22
  • 1
    Хотя иногда это удобно, это не удается в некоторых относительно общих сценариях. Например, в моей минимальной системе Ubuntu 15.04 (установленной с mini.iso и без диспетчера дисплеев или X11) у меня есть одна учетная запись пользователя, но /var/lib/AccountsService/users - пустой каталог. Я ожидаю, что аналогичным образом не будет работать на готовой установке Ubuntu Server. Кроме того, когда это работает, оно делает это при несколько ограничительном понимании того, что делает учетную запись пользователя «человеком»: создание пользователя с useradd, даже без --system, не создайте файл в AccountsService/users. – Eliah Kagan 1 May 2015 в 04:51

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

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