📜 Решение случайных бизнес-задач с помощью инструментов командной строки |

📜 Решение случайных бизнес-задач с помощью инструментов командной строки

Скрипты

Скорее всего, вам не придется решать именно эту проблему, но, возможно, это поможет продемонстрировать, как можно объединить несколько общих инструментов для решения вашей конкретной задачи.

Давайте рассмотрим этот случай как реальный пример использования в бизнесе.

В данном случае проблема заключается в том, что вам предстоит пентест, и компания, проводящая тест, просит предоставить список URL-адресов ваших сайтов, поскольку у них нет инструмента для получения этого списка самостоятельно.

Они запросили список URL-адресов в новом текстовом файле с разделителем строк, например:

https://www.example.com/hello
https://www.example.com/world
https://www.example.com/login

Веб-фреймворк (CodeIgniter 3), на котором построено приложение, по умолчанию не создает карту сайта, и 95% URL-адресов находятся за логином.

Вы не являетесь основным разработчиком проекта, но знаете, что, скорее всего, будет более 100-150+ URL-адресов.

Вы не хотите пока беспокоить команду разработчиков, потому что они работают над другими функциями, но, возможно, вы захотите согласовать с ними это позже, когда у вас будет собран список, чтобы они могли вручную настроить его на основе опыта.

👥 Как создать быстрый кравлер веб-сайтов на PowerShell

Решение высокого уровня

Наша стратегия может быть примерно такой:

  1. Получить список имен файлов в директории контроллеров
  2. Удалить расширение .php из имени файла
  3. Преобразовать имя файла в нижний регистр
  4. Префикс имени файла с базовым URL
  5. Отфильтровать файлы, которые мы не хотим включать в список
  6. Сортировка результатов в алфавитном порядке
  7. Записать результаты в файл

Вышеописанное можно назвать пайплайном, и командная строка действительно хороша тем, что предоставляет инструменты для их создания.

Порядок шагов 2 и 6 не имеет большого значения.

Я имею в виду, что наиболее эффективным решением на бумаге было бы сначала отфильтровать вещи, но в зависимости от того, какие инструменты вы используете, вы можете выполнить шаги 1-4 в одной команде.

В любом случае, это те шаги, которые нам нужно выполнить, поэтому давайте преобразуем их в код.

🤖 Используем файл robots.txt для предотвращения индексации различных областей вашего сайта.

Создание скрипта

В нашем случае у нас есть (3) сайта, и мы хотим создать (3) текстовых файла.

Каждый сайт имеет свой собственный каталог проекта с одинаковой структурой каталогов, поэтому скрипт можно назвать ./urls myapp или ./urls anotherapp.

Он будет искать myapp или anotherapp на диске, где создан проект, а затем сбрасывать файл myapp-urls.txt в ту же директорию, что и скрипт.

Шаблон

Вот основы для реализации вышеописанного:

#!/usr/bin/env bash

set -o errexit
set -o pipefail
set -o nounset

app="${1}"
project_path="sites/${app}"

# Our pipeline of commands will go here soon.
urls="placeholder"

echo "${urls}" > "${app}-urls.txt"

Получение списка имен файлов

Окончательный вариант скрипта будет приведен в конце, но вместо того, чтобы дублировать все шаги, давайте просто сосредоточимся на коде, отвечающем за каждый шаг.

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

 find ... -execdir sh -c 'printf "https://'"${app}"'.example.com/%s\n" "${0%.*}"' {} ";"

Теперь вывод выглядит следующим образом:

https://myapp.example.com/./Another_thing
https://myapp.example.com/./Yep
https://myapp.example.com/./errors

Ваш результат может немного отличаться.

Например, GNU-версия find добавляет ./ к имени файла, так что если вы работаете на macOS, вы можете этого не увидеть, но мы уберем это в следующем шаге.

Мы используем -execdir, чтобы выполнить команду для каждого файла, который возвращает find.

В данном случае мы используем shell’овский printf, чтобы немного изменить имя файла и получить список URL, разделенный новой строкой.

”${app}” разделен двойными кавычками вместо окружающих одинарных, потому что мы хотим, чтобы $app был интерполирован.

Если бы мы этого не сделали, то вывели бы буквально ${app}.

Shell поддерживает смежные кавычки, чтобы сделать то, что мы только что сделали.

Внутри printf, %s – это строка, она же имя файла, а «${0%.*}» – это немного магии Shell, чтобы удалить расширение файла.

Фильтрация нежелательных файлов

Далее давайте удалим нежелательные результаты, прежде чем приступать к дополнительной обработке.

... | grep -E -v "\/?(test_|errors)"

Вот наш последний результат:

https://trade.example.com/./Another_thing
https://trade.example.com/./Yep

В этом случае файл с ошибками был удален.

Мы используем -v для обратного совпадения.

В основном возвращается все, кроме шаблона, который совпадает.

Мы используем базовый регекс OR для соответствия нескольким параметрам. \/? обрабатывает необязательный прямой слэш.

В нашем примере это не имеет значения, но это поможет, если вы сопоставляете строки, которые не встречаются непосредственно после /.

Нормализация точечного слеша

Поскольку только GNU-версия find добавляет ./, мы можем поступить с ним так, как удобно всем, используя sed для выполнения find / replace, чтобы удалить его.

... | sed "s|\./||"

Вот наш новый результат:

https://trade.example.com/Another_thing
https://trade.example.com/Yep

Мы используем | в качестве разделителя в sed, потому что это позволяет избежать необходимости экранирования /, если бы мы использовали обычный разделитель /.

Переводим все в нижний регистр

На данном этапе мы просто добавляем новые команды в наш пайплайн.

... | tr "[:upper:]" "[:lower:]"

Вот наш новый результат:

https://trade.example.com/another_thing
https://trade.example.com/yep

Это быстрый способ сделать все строчными буквами.

Сортировка всего по алфавиту

Наконец, это сделано для того, чтобы было легче читать, но это, конечно, не обязательно.

... | sort

И вот окончательный результат:

https://trade.example.com/another_thing
https://trade.example.com/yep

Мы не стали использовать -u для уникальной сортировки, поскольку имена файлов и так уникальны.

Собираем все вместе

Вот и скрипт, включающий запись результатов в файл:

#!/usr/bin/env bash

set -o errexit
set -o pipefail
set -o nounset

app="${1}"project_path="sites/${app}"controller_path="src/application/controllers"
urls="$(find "${project_path}/${controller_path}" -maxdepth 1 -type f \
  -execdir sh -c 'printf "https://'"${app}"'.example.com/%s\n" "${0%.*}"' {} ";" \
| grep -E -v "(test_|errors)" \
| sed "s|\./||" \
| tr "[:upper:]" "[:lower:]" \
| sort)"
echo "${urls}" > "${app}-urls.txt"

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий