Сегодня я расскажу о распространенной проблеме, с которой сталкиваются многие системные администраторы и разработчики Linux или Unix.
Как правило, современные приложения и устройства безопасности сильно зависят от API и списков, которые предоставляют данные в формате JSON.
Например, список спамботов или VPN CIDR или хороший список проверенных IP CIDR ботов – в формате JSON.
Если устройство принимает формат JSON, вы можете взять этот список и загрузить его в свой маршрутизатор или WAF.
К сожалению, не все устройства принимают формат JSON.
Поэтому мы можем взять формат JSON и преобразовать его в формат CSV в соответствии с нашими потребностями.
Что такое форматы JSON и CSV?
JSON – это сокращение от JavaScript Object Notation.
Часто используется в веб-приложениях, но не ограничивается только JavaScript.
Можно использовать любой язык программирования, например Perl, Python или инструменты CLI, такие как jq.
☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux
CSV – это аббревиатура от Comma-separated values. Это текстовый файл, который можно использовать в электронных таблицах, языках программирования и многих других приложениях.
Пример формата JSON
Здесь показаны результаты команды df в формате JSON:
[ { "fs": "/dev/mapper/vgubuntu-root", "type": "ext4", "size": "915G", "used": "135G", "avail": "734G", "usedpercentage": "16%", "mounted": "/" }, { "fs": "/dev/nvme0n1p2", "type": "ext4", "size": "1.4G", "used": "378M", "avail": "939M", "usedpercentage": "29%", "mounted": "/boot" }, { "fs": "/dev/nvme0n1p1", "type": "vfat", "size": "511M", "used": "30M", "avail": "482M", "usedpercentage": "6%", "mounted": "/boot/efi" } ]
Пример формата CSV
JSON выводится в формате CSV (все значения разделяются запятой , значение):
/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,/ /dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot /dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi
Преобразование JSON в CSV с помощью оболочки Linux / Unix
Как же преобразовать такой ввод? Ответ заключается в использовании утилит командной строки jq или dasel.
Установка jq
Поскольку jq доступен в большинстве распространенных репозиториев, я буду использовать его.
Вот как установить jq на Debian или Ubuntu Linux с помощью команды apt command/apt-get:
sudo apt install jq
Пользователи RHEL/Fedora/CentOS/Alma/Rocky Linux попробуйте выполнить команду dnf:
sudo dnf install jq
Пользователь Alpine Linux попробуйте использовать команду apk:
sudo apk add jq
Пользователи SUSE или OpenSUSE Linux попробуйте воспользоваться командой zypper:
sudo zypper in jq
Пользователи macOS / OS X установите homebrew, а затем используйте команду brew:
brew install jq
Пример – преобразование JSON в CSV под Linux
Синтаксис такой же, как и для df.json:
cat df.json | jq
Теперь извлечем поле fs, выполним:
cat df.json | jq '.[] | .fs'
Как насчет полей fs и type?
cat df.json | jq '.[] | .fs, .type'
Чтобы создать CSV-файл с запятой в качестве разделителя, используйте следующий синтаксис:
cat df.json | jq '.[]| join(",")'
join(“,”) объединяет массив элементов, заданных в качестве входных данных, используя аргумент , в качестве разделителя:
Как преобразовать файл JSON в CSV?
Рассмотрим следующий файл, отображенный с помощью команды bat/cat
"/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,/" "/dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot" "/dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi"
Передайте параметр -r raw, чтобы избавиться от двойных кавычек:
cat df.json | jq -r '.[]| join(",")'
Как преобразовать файл JSON в CSV?
Рассмотрим следующий файл, отображенный с помощью команды bat/cat:
cat bingbot.json
$ batcat bingbot.json
Образец конфигурации:
{ "creationTime": "2021-11-10T10:00:00.121331", "prefixes": [ {"ipv4Prefix": "157.55.39.0/24"}, {"ipv4Prefix": "207.46.13.0/24"}, {"ipv4Prefix": "40.77.167.0/24"}, {"ipv4Prefix": "13.66.139.0/24"}, {"ipv4Prefix": "13.66.144.0/24"}, {"ipv4Prefix": "52.167.144.0/24"}, {"ipv4Prefix": "13.67.10.16/28"}, {"ipv4Prefix": "13.69.66.240/28"}, {"ipv4Prefix": "13.71.172.224/28"}, {"ipv4Prefix": "139.217.52.0/28"}, {"ipv4Prefix": "191.233.204.224/28"}, {"ipv4Prefix": "20.36.108.32/28"}, {"ipv4Prefix": "20.43.120.16/28"}, {"ipv4Prefix": "40.79.131.208/28"}, {"ipv4Prefix": "40.79.186.176/28"}, {"ipv4Prefix": "52.231.148.0/28"}, {"ipv4Prefix": "51.8.235.176/28"}, {"ipv4Prefix": "51.105.67.0/28"} ] }
Конечной целью является создание файла .CSV следующего вида: для WAF:
157.55.39.0/24,BingBot 207.46.13.0/24,BingBot 40.77.167.0/24,BingBot 13.66.139.0/24,BingBot 13.66.144.0/24,BingBot 52.167.144.0/24,BingBot 13.67.10.16/28,BingBot 13.69.66.240/28,BingBot 13.71.172.224/28,BingBot 139.217.52.0/28,BingBot 191.233.204.224/28,BingBot 20.36.108.32/28,BingBot 20.43.120.16/28,BingBot 40.79.131.208/28,BingBot 40.79.186.176/28,BingBot 52.231.148.0/28,BingBot 51.8.235.176/28,BingBot 51.105.67.0/28,BingBot
Команды
Для получения префиксов CIDR сначала введите следующее:
cat bingbot.json | jq '.prefixes[]'
Затем передайте выходные данные для создания нового JSON для добавления поля комментария:
cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"}'
Наконец, используйте функцию join() для создания файла .CSV:
cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"} | join(",")'
Сохраните его:
cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"} | join(",")' > bingbot.csv
Проверьте:
cat bingbot.csv
Заключение
Вот как я преобразовал файл CIDR в формат .CSV.
После преобразования я загружаю файл .CSV в WAF.
Этот процесс автоматизирован с помощью сценария оболочки и API для ежедневного обновления списка, чтобы WAF пропускал ботов MS bing, не блокируя их.
Я использовал jq вместо dasel, потому что знаком с синтаксисом jq, но можно использовать и dasel.
Также прочитайте страницу руководства по jq с помощью команды man или команды help:
man jq
см. также:
- 🐳 Как запустить “npm start” через Docker
- 🐳 Уменьшение размера логов Docker на диске
- 🐳 Как добавить том к существующему контейнеру Docker
- 🐧 10 лучших редакторов кода на Linux с открытым исходным кодом
- ☸️ Как запланировать мастер ноду выполняющую под/сервис, в качестве воркер ноды
- 🖴 Как составить список дисков в командной строке Linux