Bashmator - консольный менеджер скриптов, основанный на формате YAML.
Основная задача программы - предоставить простую и универсальную систему для хранения, поиска, запуска и логирования большого количества небольших скриптов и однострочников.
Каждый скрипт вносится в YAML файл. В этом файле с помощью ключей задаются аргументы командной строки, параметры подстановки их значений в код скрипта, используемая оболочка, а также информация, по которой этот скрипт можно будет найти.
YAML файлы хранятся в папке (библиотеке). Для каждой библиотеки bashmator собирает необходимую информацию о доступных скриптах и поддерживает её актуальность, чтобы обеспечить возможность быстрого поиска.
pip install --upgrade bashmator
В комадной строке станет доступен под короткими названиям bashmator
и bshm
.
Далее рекомендуется добавить оболочку и пересканить библиотеку:
bashmator shell add /usr/bin/bash
bashmator library scan -f
|
Не смотря на название, bashmator способен работать не только с bash. Ниже представлены примеры команд добавления некоторых других оболочек, интерпритаторов и программ:
Linux
bashmator shell add /usr/bin/zsh
bashmator shell add /usr/bin/python3
bashmator shell add /usr/bin/node --popen-args '["-e"]'
bashmator shell add /usr/bin/msfconsole --popen-args '["-q", "-x"]'
Windows
⚠️ Для powershell и cmd важно указать кодировку, что бы логирование с помощьюuse -o <file> ...
работало корректно
bashmator shell add C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe --popen-args "['-Command']" --encoding 'cp866' --name powershell
bashmator shell add C:\Windows\System32\cmd.exe --popen-args "['/C']" --encoding 'cp866' --name cmd
bashmator shell add C:\...path\to\python\...\python.exe --name python3
Потенциально bashmator может работать с любыми интерпритаторами, способными принимать последовательность команд из аргументов командной строки. Флаг, отвечающий за прием последовательности команд, должен всегда располагаться в конце списка, передаваемого в аргументе --popen-args
.
Рекомендуется создавать собственные библиотеки, а не добавлять свои скрипты в библиотеку по умолчанию.
Библиотекой будет считаться любой каталог, содержащий следующие подкаталоги:
-
files
- каталог для файлов, используемых в скриптами. Полезен для повышения совместимости. -
modules
- каталог для YAML файлов.
Данные подкаталоги могут иметь собственные подкаталоги - bashmator будет их учитывать в работе.
Добавить библиотеку в bashmator и выбрать её для использования:
bashmator library add <path to library>
bashmator library use <library name>
Минимальная структура, необходимая для работы:
shell: <SHELL NAME>
script: |-
<YOUR CODE>
Общая структура
author: <NAME>
description: <TEXT>
tags:
- <TAG1>
- <TAG2>
- ...
install: <INSTALLATION INFORMATION>
arguments:
<ARG NAME>:
default: <EMPTY, STRING OR LIST>
description: <TEXT>
metavar: <STRING>
multiple: <TRUE | FALSE>
replacer: <VALUE REPLACER>
regex: <REGEX STRING>
<OTHER ARG NAME>:
...
...
mode:
readfile:
- <ARG NAME>
...
replace:
<ARG NAME>:
<VALUE TO REPLACE>: <REPLACEMENT>
loop: <ARG NAME>
format:
<ARG NAME>: <.format() TEMPLATE>
<OTHER ARG>: ...
...
join:
<ARG NAME>: <DELIMITER>
<OTHER ARG>: ...
...
pformat:
<ARG NAME>: <.format() TEMPLATE>
<OTHER ARG>: ...
...
shell: <MAIN SHELL SHORT NAME OR PATH>
script: |-
<YOUR MAIN CODE>
file_<NUMBER>:
path: <SHORT PATH TO FILE AT LIBRARY/FILES DIRECTORY>
replacer: <FULL PATH REPLACER>
description: <TEXT>
file_<OTHER NUMBER>:
...
...
item_<NUMBER>:
shell: <OTHER SHELL SHORT NAME OR PATH>
description: <TEXT>
mode:
<SAME STRUCTURE AS AT MAIN>
script: |-
<YOUR OTHER CODE>
item_<OTHER NUMBER>:
...
...
author
Содержит имя автора модуля, используется для поиска и удовлетворения чувства собственной значимости😅. Пример:
author: vinzekatze
description
Содержит общую информацию о работе скрипта, которая будет выведена при вызове помощи use <script name> -h
или use <script name> --help
.
Для большего удобства рекомендуется использовать |-
. Пример:
description: |-
Набор однострочников для получение базовой DNS информации
tags
Содержит список тегов, по которым можно будет найти скрипт с помощью команды search
. Пример:
tags:
- 53
- dns
- recon
install
Содержит информацию о ПО, которое необходимо установить для правильной работы скрипта. Данная информация будет отображена при вызове скрипта с помощью команды use -i <script name>
.
Если есть возможность, рекомендуется писать сразу последовательность команд для установки, либо явно указывать, что установка чего-либо не требуется. Пример:
install: |-
sudo apt update -y && sudo apt install dnsrecon -y
arguments
Содержит имена аргументов и их параметры. На основе заданных тут данных bashmator создает CLI для скрипта.
Рекомендуется использовать полные названия для позиционных аргументов, и однобуквенные для опций.
replacer
по умолчанию: #[ARGUMENT NAME]#
Общий вид:
arguments:
n:
default: 42
metavar: NUM
regex: \d+
arg:
replacer: __B__
multiple: true
description: bla bla bla
Ключи аргументов:
defaultОпределяет значение аргумента по умолчанию, либо список возможных значений. Если Если a:
default: 53 Если a:
default:
- Если a:
default:
- https://
- http:// Если arg:
default:
-
- one
- two descriptionСодержит описание назначения аргумента, которое будет выведено при вызове помощи arg:
description: очень важный аргумент metavarКосметический ключ, позволяющий задать свое метазначение для опций. На позиционные аргументы не влияет. Пример: arg:
default: 42
metavar: MY_METAVAR Отображение:
multipleОпределяет, может ли аргумент принимать множественные значения, или нет. По умолчанию arg:
multiple: true replacerСодержит строку, котороя будет заменятья в коде скрипта (ключ Реплейсеры в коде скрипта заменяются в том порядке, в каком описаны ключи в Если ключ отсутвует либо пуст, то реплейсер принимает значение Пример реплейсеров и скрипта: arguments:
arg:
replacer: -+PLACEHOLDER+-
script: >-
cat -+PLACEHOLDER+- | ncat 127.0.0.1 9090 regexПозволяет задать регулярное выражение, с помощью которого будут проверяться значения аргумента. Не прошедие проверку значения будут вызывать ошибку и не позволять запустить скрипт. Для проверки используется функция Пример: arguments:
ip:
regex: >-
((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3,3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])
script: 'echo #ip# is ok' Реакция скрипта на ввод:
|
mode
Используется для модификации значений аргументов. Общий вид:
mode:
readfile:
- arg2
replace:
arg3:
v1: value1
v2: value2
loop: arg1
format:
arg2: '{0!r}'
join:
arg2: ','
arg3: ';'
pformat:
arg2: ' [ {} ] '
Ключи mode:
readfileСодержит список имен аргументов, которые будут интерпритированы как имена файлов. Данные файлы будут читаться построчно, а считанные строки будут подставляться в скрипт на место реплейсера. Пример: shell: bash
arguments:
arg1:
description: test
mode:
readfile:
- arg1
script: >-
echo #arg1# Содержимое файла
Если запустить скрипт с аргументом echo one two three replaceПодзволяет заменять значения аргументов. Содержит в себе имена аргументов в качестве ключей, которые в свою очередь содержат замены в виде Пример: shell: bash
arguments:
arg1:
default:
- A
- B
- C
mode:
replace:
arg1:
A: One
B: Two
script: >-
echo #arg1# В данном примере, когда на вход скрпта в аргумент loopЕсли содержит имя множественного аргумента ( Пример: shell: bash
arguments:
arg1:
multiple: true
mode:
loop: arg1
script: >-
echo -n #arg1#; echo ' end' Результат выполнения скрипта c аргументами
formatСодержит имена аргументов в качестве ключей и шаблоны python функции Для множественных аргументов форматирование производится для каждого из значений отдельно. Операция Обычно этот ключ применяется для правильной подстановки неоднозначных значений с использованием шаблона Пример: shell: bash
arguments:
arg1:
default:
-
arg2:
multiple: true
mode:
format:
arg1: >-
| tee {0!r}
arg2: >-
{0!r}
script: >-
echo #arg1# #arg2# Если запустить скрипт с аргументами echo 'a' 'd' 'c' 'r' 't' Если с аргументами echo 'a' 'd' 'c' 'r' 't' | tee './test.txt' joinСодержит имена множественных аргументов ( Пример: join:
arg1: ',' В этом случае значения множественного аргумента
pformatТоже что и |
shell
В данном ключе указывается короткое имя оболочки, используемой для запуска скрипта, либо путь до неё.
В целях улучшения совместимости рекомендуется добавлять оболочки в bashmator с помощью bashmator shell add
, а в ключе shell
указывать их короткие имена.
Данный ключ обязателен, если отсутствуют ключи item_[NUMBER]
, либо для каждого из них не заданы shell
отдельно.
Пример:
shell: bash
Это тоже сработает, но так делать не рекомендуется:
shell: /usr/bin/bash
script
Содержит непосредственно код скрипта, который будет исполняться. Не забудьте вставить реплейсеры аргументов!
Чтобы записывать многострочные скрипты используйте |-
. Чтобы записать однострочник, но в коде использовать перенос строки, используйте >-
Пример 1:
script: |-
ls -la
rm -r ./
Пример 2:
script: >-
ls -la;
rm -r ./
file_[NUMBER]
Используется для подстановки полных путей файлов из директории files
библиотеки.
replacer
по умолчанию: #file_[NUMBER]#
Общий вид:
file_1:
description: My Wordlist
path: dicts/my_wordlist.txt
file_2:
description: My Big Script
path: scripts/big_script.sh
replacer: __BIG_SCRIPT__
Ключи file_[NUMBER]:
path
Содержит путь до файла в библиотеке относительно директории file_1:
path: lorem/lorem.txt Так же можно обращаться к файлам по полному пути и использовать возвраты в родительскую директорию, но этого делать не рекомендуется. Скорее всего я закрою эту возможность спустя какое-то время, так как это больше баг, чем фитча 🥲. replacerРаботает аналогично ключу descriptionСодержит краткое описание файла, которое будет выведено при вызове помощи |
item_[NUMBER]
Используется для добавления дополнительных скриптов в один модуль. Это удобно, когда разные скрипты принимают на вход одни и те же аргументы и объеденены общим смыслом.
Если существуют item
, то в CLI добавляется опция --item
, которая позволяет вызывать подскрипты по номеру. Для массового запуска можно использовать последовательности: --item 1,2,4-6
.
Если вместе с item
существует основной script
, то ему будет присвоен номер 0
. Запускаться по умолчанию будет только он.
Общий вид:
item_1:
description: script 1
shell: python3
script: |-
print(1+2)
item_2:
description: script 2
mode:
loop: arg1
script: echo _ARG1_
Ключи item_[NUMBER]:
shellРаботает аналогично ключу modeРаботает аналогично ключу Чтобы отметить действие item_2:
script: echo _A_
mode:
loop: descriptionСодержит краткое описание назначения script
Работает аналогично главному |
Примеры YAML модулей представлены во встроенной библиотеке:
$ bashmator search examples
Search results:
script name | status | tags
------------------------------+----------+-----------------------------
examples/args/choice | OK | help, manual, arguments
examples/args/choice_default | OK | help, manual, arguments
examples/args/default | OK | help, manual, arguments
examples/args/default_empty | OK | help, manual, arguments
examples/args/flag | OK | help, manual, arguments
examples/args/metavar | OK | help, manual, arguments
examples/args/multiple | OK | help, manual, arguments
examples/args/regex | OK | help, manual, arguments
examples/args/replacer | OK | help, manual, arguments
examples/args/simple | OK | help, manual, arguments
examples/files/replacer | OK | help, manual, files
examples/files/simple | OK | help, manual, files
examples/items/default | OK | help, manual, items
examples/items/mode | OK | help, manual, items
examples/items/shell | OK | help, manual, items
examples/items/simple | OK | help, manual, items
examples/minimal | OK |
examples/mode/format | OK | help, manual, mode
examples/mode/format_empty | OK | help, manual, mode
examples/mode/join | OK | help, manual, mode
examples/mode/loop | OK | help, manual, mode
examples/mode/pformat | OK | help, manual, mode
examples/mode/readfile | OK | help, manual, mode
examples/mode/replace | OK | help, manual, mode
examples/simple | OK | help, manual, informational
Ниже представлен пример запуска скрипта examples/args/simple:
Аргументы командной строки, сгенерированные из YAML
$ bashmator use examples/args/simple -h
usage: examples/args/simple [-h] arg
Example of a simple required argument
.................................................................
positional arguments:
arg random string
options:
-h, --help show this help message and exit
Shell: bash
Author: demo
Tags: help, manual, arguments
Запуск скрипта с включенной опцией логирования
$ bashmator use -o example.log examples/args/simple blablabla
Input: blablabla
Содержимое записанного файла example.log
$ cat example.log
+-------------------------------------------------------------------------------
+ Generated by bashmator 1.1.1
+-------------------------------------------------------------------------------
+ Script name: examples/args/simple (0)
+ Start time: 2023-06-29 16:11:25 (UTC)
+ Shell: /usr/bin/bash -c
+-------------------------------------------------------------------------------
+ Running code
+-------------------------------------------------------------------------------
echo 'Input: blablabla'
+-------------------------------------------------------------------------------
+ Log
+-------------------------------------------------------------------------------
Input: blablabla
+-------------------------------------------------------------------------------
+ End time: 2023-06-29 16:11:25 (UTC)
+-------------------------------------------------------------------------------
Общего назначения для kali linux: