Багато системи мають 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>аргументів), але це не виглядає так, що вони дозволяють отримати цей список імен користувачів програмно.