Многие системы имеют 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 (некоторые системы поддерживают больше) и оболочка, которая поддерживает {x..y}
расширение скобок в zsh ). Но вы не захотите делать это часто в системах, где пользовательская база данных объединена в сеть (и локальное кэширование ограничено), таких как 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>
аргументов), но это не похоже , что они позволяют получить этот список имен пользователей программно.