Многие системы имеют 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>аргументов), но это не похоже , что они позволяют получить этот список имен пользователей программно.