Как разобрать CSV-файл с помощью bash

Apache из пакета Debian по умолчанию для обзора ниже:

https://catjcode.com/apache_conf.txt "Default apache conf"

https://catjcode.com/apache_site.txt "Default apache site"

Попробуйте более минимальную конфигурацию по умолчанию для получения доступа к http://192.168.15.1/index.html или подобной. Затем добавьте обратно каждую необходимую часть вашей конфигурации.

Другая возможная проблема в сообщении журнала:

access to / denied

Сервер может быть настроен таким образом, что попытка просмотра, http://192.168.15.1/ была воспринята как индекс: Apache индексирует каталоги или листинг файлов, которые часто отключены по умолчанию. Обработчик по умолчанию в виде index.html может быть недостаточно настроен. Предложите попробовать перейти непосредственно к http://192.168.15.1/index.html и посмотреть, отличается ли ошибка в журнале.

Также проверьте символические ссылки, если таковые имеются. Предположим, ваш сайт на самом деле не использует /etc/apache2/sites-available/default в качестве своей конфигурации, используется другой файл, сводя на нет все ваши изменения. Ниже приведена типичная установка; обратите внимание на символическую ссылку и схему именования:

ls /etc/apache2/sites-enabled/ -lah
drwxr-xr-x 2 root root 4.0K Aug 29 11:43 .
drwxr-xr-x 8 root root 4.0K Aug 29 11:40 ..
lrwxrwxrwx 1 root root   35 Aug 29 11:38 000-default.conf -> ../sites-available/000-default.conf

Чтобы помочь диагностировать проблемы с разрешениями: проверьте, используется ли www-data в Apache, запустите Apache и просмотрите владельца процесса. Обратите внимание на www-data ниже:

ps -ef|fgrep apache

root      1495     1  0 Feb16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  5239  1495  0 09:33 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  5240  1495  0 09:33 ?        00:00:00 /usr/sbin/apache2 -k start

Проверьте разрешения файловой системы; пример ниже:

ls -lah /var/www/html/
drwxr-xr-x 6 root     root 4.0K Sep  9 13:30 .
drwxr-xr-x 3 root     root 4.0K Aug 29 11:38 ..
drwxr-xr-x 2 www-data root 4.0K Aug 30 17:56 cgi-bin
drwxr-xr-x 2 www-data root 4.0K Sep  9 13:26 css
drwxr-xr-x 2 www-data root 4.0K Sep  8 12:36 images
drwxr-xr-x 2 www-data root 4.0K Sep  9 10:14 js
-rw-r--r-- 1 www-data root 3.4K Sep  9 13:14 index.html

-5
29.03.2019, 18:44
2 ответа

Решение этого полностью в чистом bashбыло бы, я думаю, нецелесообразным. См., например. вопрос «Почему использование цикла оболочки для обработки текста считается плохой практикой? ».

Вместо этого давайте немного упростим восприятие входных данных.

awk 'FNR == 1 { split($0, port, ","); FS=","; next }
              { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }' file.csv

Эта команда awkсначала считывает номера портов из первой строки CSV-файла в массив с именем port. Номер порта для столбца Nбудет сохранен в port[N].

Он делает это, разделяя первую строку ввода запятыми и просто сохраняя результат в массиве port. Это то, что делает команда split(). Условие FNR == 1означает "Если это первая строка файла, то сделайте так..."(FNR- номер строки в текущем входном файле ). Блок кода без условия будет выполняться для каждой строки ввода.

После вызова split(), FSв качестве разделителя полей устанавливается запятая. Это означает, что остальные строки в файле будут автоматически разделены запятыми на поля. Это используется в цикле во втором блоке для перебора полей CSV (от второго поля до последнего )в каждой строке.

Для каждой из других строк в данных он перебирает поля, разделенные запятыми -, и когда он находит поле, значение которого является строкой open, он распечатывает IP-адрес (первого поле )и соответствующий номер порта.

Вывод этой команды, учитывая данные в вопросе

1.1.1.2 21
1.1.1.3 21
1.1.1.4 4
1.1.1.4 21
1.1.1.5 21
1.2.3.4 21
1.4.5.6 7
1.4.5.6 21
1.4.5.6 21
1.1.3.4 21

Это можно легко прочитать с помощью цикла в оболочке:

while read -r ip port; do
    telnet "$ip" "$port"    # or whatever your command is
done

Это считывает IP-адрес и номер порта один за другим.

Чтобы объединить их в полный сценарий:

#!/bin/sh

awk 'FNR == 1 { split($0, port, ","); FS=","; next }
              { for (i=2; i<=NF; ++i) if ($i == "open") print $1, port[i] }' file.csv |
while read -r ip port; do
    telnet "$ip" "$port"    # or whatever your command is
done

Вывод команды awkнаправляется в цикл while, который считывает значения и вызывает команду (, обратите внимание на канал |после имени входного файла ).

Обратите внимание, что если для IP-адреса открыто более одного порта, команда будет выполняться несколько раз для этого адреса.

1
28.01.2020, 05:21

Выберите первое и следующее соответствующие поля с помощью awk.

awk -d "," -F '{print $1, $n...}
-1
28.01.2020, 05:21

Теги

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