Список усіх користувачів


Відповіді:


18

Користувачі людей мають 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).


15

Це робить майже все, що робить прийнята відповідь , лише в одній команді замість трьох:

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

І завдяки Карелу в коментарях nobodyкористувач також відфільтрований.


@karel Так, можливо. Замість фільтрування за допомогою UID я чітко фільтрую це ім’я користувача. Можливо, є причина, що законний користувач має такий високий UID ... Хто знає;)
Oli

9

Мені особисто подобається використовувати просто:

ls /home

Справді, це не список користувачів, а натомість список їхніх домашніх каталогів. Наразі існуючі користувачі системи в системі матимуть домашні каталоги /home, але ви також можете бачити домашні каталоги минулих користувачів, які також були видалені.

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

sudo deluser nonexistent-user

це просто скаже вам, що цього користувача не існує.


+1 Цей спосіб простий - це саме те, що насправді робили б найбільш досвідчені користувачі, і я думаю, що це не менш надійно, ніж методи, що перевіряють діапазон UID. Здається, менш вірогідним, що у користувача користувача буде домашній каталог зовні /home(який не пов'язаний з цим /home), ніж у того, що у користувача користувача буде UID менше 1000 (зрештою, це найпоширеніший метод утримання менеджера дисплейів від списку користувача на екрані входу, що іноді може бути зроблено для користувача). Єдиний, відносно незначний недолік тут - той, що lost+foundбуде перераховано на системи з окремими /homeрозділами.
Елія Каган

Однак невелика проблема: що станеться, якщо створено користувача useradd --no-create-home username?
Сергій Колодяжний

@Serg Я думаю, що це зводиться до властивої неоднозначності в описі проблеми. Чи справді обліковий запис без домашнього каталогу представляє користувача? На практиці такі акаунти зазвичай - хоча це, мабуть, не завжди - використовуються для вузькоспеціалізованих завдань (як правило, людей із власними окремими обліковими записами) або для користувачів, які мають намір отримати доступ до системи лише через конкретні послуги з обмеженим доступом. Звичайно, є ще один випадок використання useradd --no-create-home- домашній каталог вже може існувати або може бути створений незабаром після цього - але ls /homeметод працює в цих випадках добре.
Елія Каган

4

Хоча це може здатися чітко вираженою ідеєю, насправді існує багатозначність у значенні людського користувача . Чи свідомо прихований обліковий запис користувача від екрана входу, оскільки він використовується лише для спеціалізованих цілей (але для людей)? Як щодо ubuntuкористувача (UID 999) на прямому компакт-диску? А облікові записи гостей в Ubuntu створюються на ходу та знищуються після виходу з системи; вони ж користувачі людини? Можна придумати більше прикладів.

Отже, годиться, що було дано кілька нееквівалентних відповідей. Рішення Саїг Хамблін для запуску 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

Якщо ви вирішили скористатися методом, який перевіряє ідентифікатори користувачів, щоб переконатися, що вони знаходяться у вірогідному діапазоні для облікових записів, що представляють людину, як у прийнятій відповіді чи у відповіді Олі , тоді я пропоную це для стислості:

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

Для цього використовується регулярний вираз Perl ( -P), щоб показати:

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

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

Перегляд діапазону UID "Людський"

Якщо ви хочете розмістити дуже високі UID та перевірити їх на nobodyявність, ви можете використовувати метод у відповіді Олі . Ви можете, однак, врахувати, чи дійсно користувачів з дуже високим UID слід вважати людьми, або якщо вони, швидше за все, є іншим нецільовим користувачем (наприклад nobody). На практиці такі користувачі - окрім цього - nobodyрідкісні, тому насправді це рішення з вашого боку.

Можливий компроміс - перерахувати користувачів у діапазоні UID , які фактично призначаються новоствореним користувачам, які не є "системними". Ви можете перевірити це вadduser.conf :

$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999

Ось два способи перерахувати користувачів, чиї UID - від 1000 до 29999:

getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'

Якщо ви хотіли бути стилістично приємними, basenameце некрасиво. Це не краще, ніж ls. Принципова причина, по якій ми не розбираємо ls, полягає в тому, що це робота, яку можна виконати іншими інструментами набагато безпечніше і чисто, а не стиль. В цьому випадку оболонка: cd /home; getent passwd *.
муру

Я погоджуюсь з вами щодо того, що додому є ненадійним (мені це марно, дивіться мою відповідь). Я просто кажу, що якщо ви збираєтеся проповідувати про стиль, сподівайтеся, що ви будете випивати.
муру

@muru Я бачу, як моє оригінальне фразування може ввести людей в оману, думаючи, що уникнення розбору lsзазвичай стосується стилю. Пункт 2-го пункту про "незадовільний вихід" висвітлював цю проблему, але вона з’являється в наступному розділі. Я переформулював, щоб уточнити, чому розбір lsдоцільний у цій ситуації . Хоча cd /home; getent passwd *приймати форму часто вказує ехолота підхід, я уникав його так, щоб не привести читачів вірити вміст /homeкаталогів з дивні додані записи , які не відповідають реальним користувачам, може ще як - то можна покластися на в якості керівництва до того , що користувачі існують.
Елія Каган

1

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


1
Хоча іноді зручно, це не вдається в деяких відносно поширених сценаріях. Наприклад, у моїй мінімальній системі Ubuntu 15.04 (встановлена ​​з mini.isoі без встановлених диспетчерів дисплеїв або X11) у мене є один обліковий запис людини - все /var/lib/AccountsService/usersж це порожній каталог. Я очікую, що подібне не буде працювати при позаставній установці Ubuntu Server. Крім того, коли це працює, це робиться під дещо обмежувальним поняттям того, що робить обліковий запис користувача "людським": якщо користувач useraddнавіть без --system нього не створює файл у AccountsService/users.
Елія Каган

1

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

getent passwd | grep -wFf /etc/shells

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

getent passwd | grep -wFf <(grep '^/' /etc/shells)

+1 Це може бути найбільш надійний підхід, запропонований поки що. Хоча це має недолік відображення root(що, ймовірно, не слід вважати користувачем людини, оскільки люди зазвичай вкорінюються тимчасово і для конкретних цілей, а не використовують його для своєї регулярної роботи), здається, що це найменша ймовірність виходу з ладу в будь-який головний спосіб. Методи в інших відповідях ( в тому числі і мій) можуть не спрацювати, в залежності від методу, якщо домашні каталоги НЕ /home, інше сміття знаходиться в /home, UIDs дивних, або система не використовує DM. Ця відповідь працює досить добре у всіх тих сценаріях.
Елія Каган

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

Дякуємо за пояснення відповіді Олі з деталями. Вам також потрібно відфільтрувати nobody. =)
anatoly techtonik

1
Вам цього не потрібно, оскільки ніхто не має UID 65534, і таким чином автоматично відфільтровується як і всі інші нелюдські облікові записи користувачів.
misha
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.