Помогите с выводом в файл)

Установка, обновление, настройка Linux

Модераторы: Olej, adminn

Zeus_Faber
Интересующийся
Сообщения: 2
Зарегистрирован: 10 ноя 2013, 22:10
Контактная информация:

Помогите с выводом в файл)

Непрочитанное сообщение Zeus_Faber » 10 ноя 2013, 22:11

Пропарсить файлы /etc/passwd, /etc/shadow, /etc/group так, чтоб в конечном файле можно было увидеть следующее (разделитель — Tab):
Name Password(хеш) Group HOMEDIR SHELL
User1 12 group1 /home/user1 /bin/bash
User2 334 group2 /home/uesr2 /bin/sh
Daemon * daemon /usr/sbin /bin/sh
Sshd * nougroup /var/run/sshd /usr/sbin/nologin

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите с выводом в файл)

Непрочитанное сообщение Olej » 10 ноя 2013, 22:49

Zeus_Faber писал(а):Пропарсить файлы /etc/passwd, /etc/shadow, /etc/group так, чтоб в конечном файле можно было увидеть следующее (разделитель — Tab):
Name Password(хеш) Group HOMEDIR SHELL
User1 12 group1 /home/user1 /bin/bash
User2 334 group2 /home/uesr2 /bin/sh
Daemon * daemon /usr/sbin /bin/sh
Sshd * nougroup /var/run/sshd /usr/sbin/nologin
1. Пропарсить - это пользуясь чем?: bash, Python, Perl, C, ... на чём собираетесь делать?

2. Во 2-й колонке для User1 и User2 - это у вас пароли (в открытом виде)? И откуда вы их собираетесь взять?

3. Пароли в /etc/shadow представлены как следы свёртки, что-то такое вида (это с реального компьютера):

Код: Выделить всё

olej:$6$/tZmrrcO$b1S4Bhu5Fn7fgAIVIGKfH23OY1nylz8AohMNoKDrgo6QF0rToEu1nhiOuh.ZXHdza.mqD6NgechUkPDJ22NBq1:15991:0:99999:7:::
И что оно вам даст?

Zeus_Faber
Интересующийся
Сообщения: 2
Зарегистрирован: 10 ноя 2013, 22:10
Контактная информация:

Re: Помогите с выводом в файл)

Непрочитанное сообщение Zeus_Faber » 10 ноя 2013, 23:02

пароли - хеш, делать - в линукс минт, в терминале
чем - bash
вывести в файл в виде таблицы

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Помогите с выводом в файл)

Непрочитанное сообщение Olej » 11 ноя 2013, 13:39

Zeus_Faber писал(а):Пропарсить файлы /etc/passwd, /etc/shadow, /etc/group так, чтоб в конечном файле можно было увидеть следующее (разделитель — Tab):
Name Password(хеш) Group HOMEDIR SHELL
User1 12 group1 /home/user1 /bin/bash
User2 334 group2 /home/uesr2 /bin/sh
Daemon * daemon /usr/sbin /bin/sh
Sshd * nougroup /var/run/sshd /usr/sbin/nologin
Собственно, задача то ваша очень простая, хоть и хлопотная и возни требует на доводку...

К большому упрощению вашей задачи, строки в /etc/passwd и /etc/shadow совпадают не только по числу, но и по порядку расположения (по пользователям):

Код: Выделить всё

olej@notebook:~$ cat /etc/passwd | wc -l
33
olej@notebook:~$ sudo cat /etc/shadow | wc -l
33
Вам остаётся пробежаться по всем строкам /etc/passwd ...

- для N-й строки /etc/passwd взять (просто сдвинуться) такую же строку N-ю /etc/shadow;
- разделить (регулярными выражениями) строки на поля ... к упрощению, во всех файлах разделитель один - ':';
- по 4-му полю (ключу) строки /etc/passwd найти M-ю строку в /etc/group с совпадающим 3-м полем (это и есть GID) - вот это самый противный шаг, если уж вам так надо вместо GID иметь именно имя группы ... и если уж это так сильно надо, я бы делал всё в 2 прохода по итоговому файлу (см. ниже).
- и компонуйте строку в свой результирующий файл ... с разделителем TAB или каким вздумается ;-) :
- N-я строка вашего файла:
<поле #1 из N-строки /etc/passwd> + <поле #2 из N-строки /etc/shadow> + <поле #1 из M-строки /etc/group> + <поле #6 из N-строки /etc/passwd> + <поле #7 из N-строки /etc/passwd>

Но эффективный алгоритм (без поиска) был бы в 2 прохода:

1. сформировать 1-й промежуточный файл - тупым циклом по строкам /etc/passwd + /etc/shadow записать строки:
<поле #1 из /etc/passwd> + <поле #2 из /etc/shadow> + <поле #4 из /etc/passwd> (это GID) + <поле #6 из /etc/passwd> + <поле #7 из /etc/passwd>

2. 2-м проходом в простом цикле по строкам /etc/group все строки вашего 1-го промежуточного файла, где поле #3 совпадает с полем #3 из /etc/group, заменить это поле (переписывая в 2-й выходной файл) на значение поля #1 из /etc/group

Всё это элементарно просто, но долбанины будет много ;-)

Я бы это писал на Python а не bash - это будет заметно проще ... но всё зависит, конечно, от владения инструментами.

P.S. Весь ваш такой скрипт может совершенно "рассыпаться" в зависимости от дистрибутива Linux и его версии - никто не регламентировал строго назначение и порядок полей - это сохраняется только как традиция, любой дистрибьютор может это поменять (особенно во всяких новомодных Ubuntu или Mint ;-) ).

Ответить

Вернуться в «Администрирование Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость