Skip to content

bash-labs/bash-tools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bash-tools

Небольшой набор bash скриптов, которые я "ношу с собой", для решения различных задач.
Часть скриптов не имеет описания, но имеет флаг --help, с помощью которого можно узнать для чего нужен скрипт и как его использовать.

Зависимости

Скрипты используют вспомогательную библиотеку bash-libs, подключённую как git-сабмодуль в vendor/bash-libs (модули доступны через симлинк libvendor/bash-libs/lib). При клонировании репозитория тяните его вместе с сабмодулями:

git clone --recurse-submodules <repo-url>
# или, если уже склонировали без сабмодулей:
git submodule update --init --recursive

install инициализирует сабмодуль автоматически (если он пуст) и копирует библиотеку рядом со скриптами, поэтому установленные команды находят её по относительному пути.

Установка / Удаление

Установка:

chmod +x install && ./install

Удаление:

chmod +x uninstall && ./uninstall

Использование

dusort

Скрипт для определения размеров файла(ов).
Например, чтобы определить размер директории /var/log и так же, самый большой файл в ней:

dusort /var/log/*

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


wiso

Обертка над dd для чуть более удобной записи .iso образов на диск.
Скрипт писался для записей linux дистрибутивов на usb флеш накопители, с чем отлично справляется.

Пример:

wiso --iso ~/iso/manjaro-kde.iso

ipblock

Блокирует ip-адреса домена через iptables. Пример:

ipblock --domains site-one.com site-two.com --interface eth0 --chains FORWARD OUTPUT INPUT

psmem

Определение виртуальной и резистивной памяти процесса по pid или его имени.

Пример:

psmem --name firefox

myip

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

Пример:

myip
myip --public

adbpush

Рекурсивная отправка файлов по adb.
Скрипт писался с учетом, что нужно поместить какую-то директорию со всем содержимым в корневую директорию устройства.

Пример:

adbpush --root my_local_lib/ /vendor/my_lib/

loc

Подсчет файлов заданного формата и кол-во в них строк.
Пример, посчитает сколько файлов .js и .json в директории, в которой находитесь:

loc --formats json js

Пример, с указанием директории:

loc --dir ~/js_dir --formats js json ts

noipv6

Отключает ipv6 и меняет TTL на заданный.


imgframe

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

Пример:

imgframe -i input.jpg -w 800 -h 600 -f 20 -o output.png

novpn

Запускает отдельное приложение (GUI или CLI) в обход VPN, не отключая сам туннель.
Работает через сетевой namespace: выбранное приложение получает прямой выход в интернет через физический интерфейс, а остальная система остаётся в WireGuard. Конфиг туннеля не трогается.

Физический интерфейс и шлюз определяются автоматически. Namespace поднимается лениво при первом запуске и живёт до --down, поэтому в нём можно гонять несколько приложений подряд.

Запускать без sudonovpn сам поднимет права (спросит пароль один раз) и пробросит переменные сессии (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 через VPN

dnsq

Резолвит домен в 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-ip

sslcert

Выпускает или удаляет сертификат 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.

Releases

No releases published

Packages

 
 
 

Contributors

Languages