Как я могу загрузить все имена пользователей?

[117187] Вам нужно [117632]do[117633] после [117634]while[117635]: [12155]
1
07.05.2014, 21:45
5 ответов
[112480] На системах Linux существует программа [112808]getent[112809], которая использует стандартные [112810]get*ent(2)[112811] функции ([112812]getpwent()[112813], которые здесь используются). Что вы хотите получить, так это содержимое базы данных [112814]passwd[112815] (попробуйте [112816]man nsswitch.conf[112817] для лучшего понимания):

Это становится намного интереснее после прокрутки стандартных системных учётных записей.

Если вы не Linux-система, то вы можете получить это довольно просто, написав что-нибудь, что само по себе дампирует базу данных пользователей, используя функцию [112818]getpwent(2)[112819]. Примером на C может быть что-то вроде этого:

Поместите это в файл [112820]test.c[112821] и соберите его с помощью

Затем вы можете вызвать [112822]./test[112823] и посмотреть, что вы получите:

Как было сказано выше, это станет интереснее позже.

Подход с использованием [112824]getwent()[112825] имеет большое преимущество в том, что вам не нужно делать никаких предположений о том, как сконфигурирована система входа ([112826]/etc/passwd[112827], LDAP, NIS, ...? ), но просто дайте системе получить информацию с ее действительной конфигурацией.

Редактирование:[112829] Может случиться так, что бэкэнд базы данных [112830]passwd[112831], например. LDAP, не разрешает перечислять БД (и, таким образом, [112832]getpwent()[112833]), а только раздает наборы данных, явно запрашиваемые ключом (например, имя логина или UID, так что [112834]getpwuid()[112835] или [112836]getpwnam()[112837] может сработать). В этом случае (и так как ваши целевые имена пользователей настолько аккуратно названы) вы все еще можете "перечислить" вручную с помощью модификации скрипта @masegaloeh:

Как это сделать в отсутствие [112838]getpwuid()[112839] с системным API ([112840]getpwnam()[112841], [112842]getpwuid()[112843]) оставлено в качестве упражнения для читателя.[112497].
6
27.01.2020, 23:11
[112536]getent действительно является правильным способом доступа к любой базе данных через переключатель имен в системе Unix/Linux, так что не имеет значения, хранятся ли учетные записи локально в /etc/passwd, или они находятся в LDAP, AD, NIS, или любой другой службе, которую вы настроили в nsswitch. conf.

  • Так что я бы сделал:
  • Это распечатает полные имена пользователей для всех учетных записей, начиная с 'e', а затем только цифры.
  • Если бы мне нужно было сделать это на системе Windows, я бы установил cygwin, а затем сделал бы это так, как описано выше :). На самом деле, я только что протестировал getent на Windows/cygwin и он работает отлично (что несколько удивительно)[112543].
5
27.01.2020, 23:11
[

] Вы можете получить всю пользовательскую информацию из /etc/passwd[

].
-3
27.01.2020, 23:11

Этот бэш-скрипт сделает для вас петлю

#!/bin/bash
for i in {205846..205850}; do
    finger e${i}
    id e${i}
done

Вы просто модифицируете 205846 и 205850, чтобы получить другой диапазон

.
3
27.01.2020, 23:11

/etc/вывод пароля - это ваша самая безопасная ставка, так как палец будет печатать дубликаты, если какая-то часть имени совпадает.

Следующий бэш-скрипт должен сделать трюк, он выведет... user $output of id user

l=$(grep "^UID_MIN" /etc/login.defs)

# get max UID limit
#l1=$(grep "^UID_MAX" /etc/login.defs)

# if not set, set manually
l1=4999

# get all users and assign to users array
users=$(awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max ) print $0}' /etc/passwd | awk 'BEGIN { FS = ":" } ; { print $1 }')

# print the needed info
for user in $users ; do echo -n $user && echo -n " " && id $user ; done

Если вы измените последнюю строку на

for user in $users ; do echo "INSERT INTO users(name,groups) VALUES('$user', '`id $user`');" ; done

то получите операторы SQL-вставки, например

INSERT INTO users(name,groups) VALUES('priit', 'uid=1056(priit) gid=1056(priit) grupid=1056(priit)');
1
27.01.2020, 23:11

Теги

Похожие вопросы