Як я можу перерахувати всіх створених мною користувачів людей? Я спробував, 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. =)