Як я можу перерахувати всіх створених мною користувачів людей? Я спробував, cat /etc/passwd
і це просто перелічує багато речей.
Як я можу перерахувати всіх створених мною користувачів людей? Я спробував, cat /etc/passwd
і це просто перелічує багато речей.
Відповіді:
Користувачі людей мають 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).
Це робить майже все, що робить прийнята відповідь , лише в одній команді замість трьох:
awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd
І завдяки Карелу в коментарях nobody
користувач також відфільтрований.
Мені особисто подобається використовувати просто:
ls /home
Справді, це не список користувачів, а натомість список їхніх домашніх каталогів. Наразі існуючі користувачі системи в системі матимуть домашні каталоги /home
, але ви також можете бачити домашні каталоги минулих користувачів, які також були видалені.
Це працює для моїх цілей і може працювати і для ваших. Наприклад, якщо ви хочете видалити обліковий запис користувача, який, як виявляється, більше не існує ( nonexistent-user
), і запустіть команду
sudo deluser nonexistent-user
це просто скаже вам, що цього користувача не існує.
/home
(який не пов'язаний з цим /home
), ніж у того, що у користувача користувача буде UID менше 1000 (зрештою, це найпоширеніший метод утримання менеджера дисплейів від списку користувача на екрані входу, що іноді може бути зроблено для користувача). Єдиний, відносно незначний недолік тут - той, що lost+found
буде перераховано на системи з окремими /home
розділами.
useradd --no-create-home username
?
useradd --no-create-home
- домашній каталог вже може існувати або може бути створений незабаром після цього - але ls /home
метод працює в цих випадках добре.
Хоча це може здатися чітко вираженою ідеєю, насправді існує багатозначність у значенні людського користувача . Чи свідомо прихований обліковий запис користувача від екрана входу, оскільки він використовується лише для спеціалізованих цілей (але для людей)? Як щодо 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
як місце для домашніх каталогів користувачів, цей метод буде не дають надійного виходу.)Якщо ви вирішили скористатися методом, який перевіряє ідентифікатори користувачів, щоб переконатися, що вони знаходяться у вірогідному діапазоні для облікових записів, що представляють людину, як у прийнятій відповіді чи у відповіді Олі , тоді я пропоную це для стислості:
getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'
Для цього використовується регулярний вираз Perl ( -P
), щоб показати:
^
), що не містить :
s ( [^:]+
) - це перше поле, як :
і роздільник поля вpasswd
(?=
)
) поле пароля x
- воно має бути завжди x
, оскільки в Ubuntu хеші паролів зберігаються в shadow
базі даних, а не у читаній passwd
базі даних:\d{4}:
).Таким чином, це значно коротший і дещо простіший варіант техніки у прийнятій відповіді . (Описана там техніка також чудово працює, і вона має перевагу, щоб вона була портативною для систем, які grep
не є GNU / Linux, які не підтримують -P
.)
Якщо ви хочете розмістити дуже високі 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 *
.
ls
зазвичай стосується стилю. Пункт 2-го пункту про "незадовільний вихід" висвітлював цю проблему, але вона з’являється в наступному розділі. Я переформулював, щоб уточнити, чому розбір ls
доцільний у цій ситуації . Хоча cd /home; getent passwd *
приймати форму часто вказує ехолота підхід, я уникав його так, щоб не привести читачів вірити вміст /home
каталогів з дивні додані записи , які не відповідають реальним користувачам, може ще як - то можна покластися на в якості керівництва до того , що користувачі існують.
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}'
mini.iso
і без встановлених диспетчерів дисплеїв або X11) у мене є один обліковий запис людини - все /var/lib/AccountsService/users
ж це порожній каталог. Я очікую, що подібне не буде працювати при позаставній установці Ubuntu Server. Крім того, коли це працює, це робиться під дещо обмежувальним поняттям того, що робить обліковий запис користувача "людським": якщо користувач useradd
навіть без --system
нього не створює файл у AccountsService/users
.
Приєднуючись до партії, я наглядаю за мережевими системами, що використовують LDAP, маючи домашні каталоги назовні /home
та UID (через скрипт-скрипт) мільйонами. Жодна з нинішніх відповідей, отже, не працює. Тест, який працює для мене, перевіряє, чи має користувач дійсну оболонку входу. Дійсна оболонка - це та, яка вказана в /etc/shells
. Найпростіша форма:
getent passwd | grep -wFf /etc/shells
Файл може містити коментарі (або порожні рядки), тому, можливо, доведеться їх відфільтрувати:
getent passwd | grep -wFf <(grep '^/' /etc/shells)
root
(що, ймовірно, не слід вважати користувачем людини, оскільки люди зазвичай вкорінюються тимчасово і для конкретних цілей, а не використовують його для своєї регулярної роботи), здається, що це найменша ймовірність виходу з ладу в будь-який головний спосіб. Методи в інших відповідях ( в тому числі і мій) можуть не спрацювати, в залежності від методу, якщо домашні каталоги НЕ /home
, інше сміття знаходиться в /home
, UIDs дивних, або система не використовує DM. Ця відповідь працює досить добре у всіх тих сценаріях.
У системах 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
. =)