Небольшой набор bash скриптов, которые я "ношу с собой", для решения различных задач.
Часть скриптов не имеет описания, но имеет флаг --help, с помощью которого можно узнать для чего нужен скрипт и как его использовать.
Скрипты используют вспомогательную библиотеку bash-libs,
подключённую как git-сабмодуль в vendor/bash-libs (модули доступны через симлинк lib → vendor/bash-libs/lib).
При клонировании репозитория тяните его вместе с сабмодулями:
git clone --recurse-submodules <repo-url>
# или, если уже склонировали без сабмодулей:
git submodule update --init --recursiveinstall инициализирует сабмодуль автоматически (если он пуст) и копирует библиотеку
рядом со скриптами, поэтому установленные команды находят её по относительному пути.
Установка:
chmod +x install && ./installУдаление:
chmod +x uninstall && ./uninstalldusort
Скрипт для определения размеров файла(ов).
Например, чтобы определить размер директории /var/log и так же, самый большой файл в ней:
dusort /var/log/*Фактически это тоже самое, что делает du, за исключением того, что весь вывод сортируется по убыванию.
wiso
Обертка над dd для чуть более удобной записи .iso образов на диск.
Скрипт писался для записей linux дистрибутивов на usb флеш накопители, с чем отлично справляется.
Пример:
wiso --iso ~/iso/manjaro-kde.isoipblock
Блокирует ip-адреса домена через iptables. Пример:
ipblock --domains site-one.com site-two.com --interface eth0 --chains FORWARD OUTPUT INPUTpsmem
Определение виртуальной и резистивной памяти процесса по pid или его имени.
Пример:
psmem --name firefoxmyip
Выводит локальные и публичный ip адреса.
Пример:
myip
myip --publicadbpush
Рекурсивная отправка файлов по adb.
Скрипт писался с учетом, что нужно поместить какую-то директорию со всем содержимым в корневую директорию устройства.
Пример:
adbpush --root my_local_lib/ /vendor/my_lib/loc
Подсчет файлов заданного формата и кол-во в них строк.
Пример, посчитает сколько файлов .js и .json в директории, в которой находитесь:
loc --formats json jsПример, с указанием директории:
loc --dir ~/js_dir --formats js json tsnoipv6
Отключает ipv6 и меняет TTL на заданный.
imgframe
Вписывает изображение в белый квадрат, по сути создавая рамку.
Пример:
imgframe -i input.jpg -w 800 -h 600 -f 20 -o output.pngnovpn
Запускает отдельное приложение (GUI или CLI) в обход VPN, не отключая сам туннель.
Работает через сетевой namespace: выбранное приложение получает прямой выход в интернет через
физический интерфейс, а остальная система остаётся в WireGuard. Конфиг туннеля не трогается.
Физический интерфейс и шлюз определяются автоматически. Namespace поднимается лениво при первом
запуске и живёт до --down, поэтому в нём можно гонять несколько приложений подряд.
Запускать без
sudo—novpnсам поднимет права (спросит пароль один раз) и пробросит переменные сессии (DISPLAY/WAYLAND_DISPLAY/…), чтобы графика работала. Подsudoэти переменные теряются. Запускать из терминала, чтобы было куда вводить пароль.
Базовое использование:
novpn firefox # браузер мимо VPN (про изоляцию — ниже)
novpn curl ipinfo.io # проверка обхода: покажет реальный IP провайдераУправление жизненным циклом namespace:
novpn --up # поднять namespace заранее, без запуска приложения
novpn --status # состояние: интерфейс, шлюз, подсеть, наличие правил
novpn --down # снести namespace и все правилаОпции (все необязательны):
# --name: своё имя namespace (можно держать несколько независимых)
novpn --name work curl ipinfo.io
novpn --name work --down
# --dns: резолверы внутри namespace, через запятую (по умолчанию 1.1.1.1,8.8.8.8,9.9.9.9)
novpn --dns 9.9.9.9,8.8.4.4 firefox
# --subnet: /24 для veth-пары (по умолчанию 10.200.200; .1 — хост, .2 — namespace).
# Менять, если подсеть конфликтует с существующей сетью.
novpn --subnet 10.211.55 curl ipinfo.io
# --if / --gw: явно задать физический интерфейс и шлюз, если автоопределение промахнулось
novpn --if eth0 --gw 192.168.0.1 curl ipinfo.io
# --user: под каким пользователем запускать приложение (по умолчанию — текущий).
# В основном для CLI; GUI лучше запускать под своим пользователем.
novpn --user myuser curl ipinfo.io
# --no-isolate: не добавлять флаги изоляции браузера (см. ниже)
novpn --no-isolate firefox
# --dry-run / -n: показать все команды, ничего не выполняя — удобно проверить перед запуском
novpn --dry-run firefox
novpn -n --name work --subnet 10.211.55 curl ipinfo.ioИзоляция браузеров. Firefox/Chromium/Brave и т.п. — single-instance: при уже запущенной копии
(а она на VPN) обычный firefox просто передаёт ей запрос, и новое окно остаётся на VPN. Поэтому
для известных браузеров novpn автоматически добавляет флаги отдельного инстанса с персональным
профилем в ~/.local/share/novpn/<ns>/<app>:
novpn firefox # -> firefox --no-remote --profile ~/.local/share/novpn/novpn/firefox
novpn chromium # -> chromium --user-data-dir=~/.local/share/novpn/novpn/chromiumЕсли передать свой профиль — он уважается, добавится только --no-remote:
# свой профиль на обходе (предварительно закрыть обычный Firefox)
novpn firefox -P default-releaseПолностью отключить авто-изоляцию — флаг --no-isolate.
Проверка, что обход работает:
novpn curl -s ipinfo.io # IP провайдера
myip --public # для сравнения — IP через VPNdnsq
Резолвит домен в IP (forward A/AAAA) или IP в домен (reverse/PTR), опрашивая несколько
DNS-серверов сразу — удобно увидеть расхождения между резолверами.
По умолчанию опрашиваются 8.8.8.8 (Google), 1.1.1.1 (Cloudflare), 9.9.9.9 (Quad9),
77.88.8.8 (Yandex), 208.67.222.222 (OpenDNS). Режим (forward/reverse) определяется
автоматически по виду цели.
Базовое использование:
dnsq example.com # forward: домен -> A/AAAA с каждого сервера
dnsq 8.8.8.8 # reverse: IP -> PTRОпции:
# --dns / -d: явный список серверов вместо дефолтного (можно несколько)
dnsq example.com --dns 1.1.1.1 9.9.9.9
# --trace / -t: проверка «туда-обратно» с пометкой MATCH/MISMATCH.
# для домена: домен -> IP -> PTR (бьётся ли PTR обратно с доменом)
# для IP: IP -> PTR -> forward (возвращается ли исходный IP)
dnsq example.com --trace
dnsq 185.17.120.242 --trace
# --cert / -c: доменные имена из TLS-сертификата на <target>:443 (CN + SAN).
# Удобно узнать домен по IP.
dnsq 185.17.120.242 --cert
# --reverse-ip / -r: какие домены указывают на IP (через публичный passive-DNS).
# Внимание: отправляет IP стороннему сервису (hackertarget).
dnsq 185.17.120.242 --reverse-ipsslcert
Выпускает или удаляет сертификат Let's Encrypt для <ip>.sslip.io через certbot в docker.
sslip.io — автоматический DNS: <ip>.sslip.io всегда резолвится в сам <ip>, поэтому
сертификат можно получить на голый IP без собственного домена.
Нужно указать IP (позиционно или --ip) и одно действие — --check / --issue / --delete:
sslcert 185.17.120.242 --check # показать <ip>.sslip.io и проверить, что резолвится в <ip>
sslcert 185.17.120.242 --issue # выпустить сертификат (certbot certonly --webroot)
sslcert 185.17.120.242 --delete # удалить сертификат (certbot delete)Опции:
# --ip / -i: целевой IPv4 (альтернатива позиционному аргументу)
sslcert --ip 185.17.120.242 --issue
# --email / -e: email аккаунта для выпуска
sslcert 185.17.120.242 --issue --email me@example.com
# --certs: каталог сертификатов (монтируется в /etc/letsencrypt)
# --webroot / -w: ACME webroot (монтируется в /var/www/certbot)
sslcert 185.17.120.242 --issue --certs ./certs --webroot ./www
# --staging: тестовый сервер Let's Encrypt (без rate-limit; сертификат невалидный)
# --dry-run / -n: показать команды, ничего не выполняя
sslcert --ip 185.17.120.242 --issue --staging --dry-runУсловия для выпуска:
- webroot должен раздаваться веб-сервером (например, nginx) на порту 80 для
<ip>.sslip.io, чтобы прошёл ACME http-01 challenge; - IP должен быть публично доступен на порту 80;
- у Let's Encrypt есть rate-limit — пока тестируешь, используй
--staging.