Багато системи мають getent
команду списку або запросити зміст Ім'я служби баз даних , таких як passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Буде перелічено домашні каталоги ( розділене 6- ою товстою кишкою) всіх користувачів у базах даних, які можна перерахувати .
Саме ім’я користувача знаходиться в першому полі, тому для списку імен користувачів:
getent passwd | cut -d: -f1
(зауважте, що це не означає, що ті користувачі можуть увійти до системи або створити їх домашній каталог, але те, що вони відомі системі, вони можуть бути переведені на ідентифікатор користувача).
Для баз даних, які неможливо перерахувати, ви можете спробувати запитувати кожен можливий ідентифікатор користувача окремо:
getent passwd {0..65535} | cut -d: -f1,6
(тут припускаємо, що uids зупиняються на 65535 (деякі системи підтримують більше) та оболонці, яка підтримує zsh- {x..y}
форму розширення дужок). Але ви не хотіли б цього робити в системах, де користувальницька база даних є мережевою (і існує обмежене місцеве кешування), наприклад LDAP, NIS +, SQL ..., що може означати багато мережевого трафіку (і завантаження на сервер каталогів) ) зробити всі ці запити.
Це також означає, що якщо є кілька користувачів, які діляться одним ідентичним uid, ви отримаєте лише один запис на кожен uid, тому пропустіть інші.
Якщо у вас немає getent
, ви можете вдатися до perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
для getent passwd
( $e[0]
для імен користувачів) або:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
для getent passwd {0..65535}
з тими ж застереженнями.
У оболонках ви можете використовувати ~user
домашній каталог user
, але в більшості оболонок це працює лише для обмеженого набору імен користувачів (список дозволених символів в іменах користувачів, що підтримуються для цього ~
оператора розширення, варіюється від оболонки до оболонки) та з декілька оболонок (у тому числі bash
) ~$user
не працюватимуть (вам потрібно вдатися, eval
коли ім’я користувача зберігається у змінній). І вам все одно доведеться знайти спосіб отримати список імен користувачів.
Деякі оболонки мають вбудовану підтримку, щоб отримати цей список імен користувачів.
bash
: compgen -u
повертає список користувачів у базах даних, які можна перерахувати.
zsh
: $userdirs
асоціативний масив відображає імена користувачів у їх домашній каталог (також обмежений базами даних, які можна перерахувати, але якщо ви зробите ~user
розширення для користувача, який знаходиться в нечисленній базі даних, до нього буде додано запис $userdirs
). Отже, ви можете зробити:
printf '%s => %s\n' "${(kv@)userdirs}"
щоб перерахувати користувачів з їх домашнім каталогом.
Це працює лише тоді, коли zsh
є інтерактивним .
tcsh
, fish
і yash
це три інші оболонки, які можуть заповнювати імена користувачів (наприклад, при заповненні ~<Tab>
аргументів), але це не виглядає так, що вони дозволяють отримати цей список імен користувачів програмно.