BashMaster
8.24K subscribers
683 photos
14 videos
1 file
706 links
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов.

Реклама: @Kone4noVasya

Канал на бирже: https://telega.in/c/bash_help
Download Telegram
Docker Backup and VirusTotal Scanner

Этот Bash-скрипт создает резервные копии образов или контейнеров Docker, а затем сканирует их с помощью VirusTotal.

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Справочная информация по любой команде в Linux

Рекомендуем взглянуть на сервис, который предоставляет удобный интерфейс для поиска справочной информации по любой команде в Linux.

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

🌐 Перейти на сайт

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Простое преобразование вывода в хэш для поиска IDOR

Иногда требуется конвертировать ввод в md5 / base64 / 32 и т.д непосредственно в консоле. Это бывает полезно, особенно когда вы ищите IDOR и конечная точка имеет значение в виде хэша, например:

https://targetdomain.com/user/3bf1114a986ba87ed28fc1b5884fc2f8

Для решения этой задачи, вы можете использовать простой bash-скрипт, совместно с ffuf.

Предположим, у вас есть конечная точка, которая принимает параметр id в виде md5. Мы можем проверить его на IDOR с помощью приведенной ниже команды, которая сгенерирует список чисел от 1 до 1000:

seq 1 1000 | hashit md5 | ffuf -w - -u https://targetdomain.com/user/FUZZ

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👉 Bash для тестировщика

Видеоуроки:
1 — Установка и настройка
2 — ls, mkdir, rm команды
3 — mv, cp, nano, less, vi, cat команды
4 — Поиск через grep и find
5 — Команды с выводом и процессами
6 — Команды ping и curl

📹 Плейлист на YouTube

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Bash-Scripts

Коллекция Bash-скриптов для автоматизации рутинных задач и оптимизации рабочего процесса. От простого переименования файлов до более сложных развертываний — эти Bash-скрипты помогут вам.

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Bash скрипт для удаления файлов старше заданного количества дней в Linux

Поговорим о том, как удалять файлы старше n-ого количества дней, используя для этого простой скрипт написанный на bash.

Создадим файл с названием "DelFileNDay.sh" используя для этого утилиту "cat".

cat > DelFileNDay.sh << EOF
#!/bin/bash
#DEL file > 30 DAY
DAY=30
DIR="/var/log/test/"
find $DIR -type f -mtime +$DAY -exec rm -f {} \;
EOF

DAY=30 - задаем количество дней старше, которых файлы будут удаляться.
DIR="/var/log/test/" - задаем полный путь к директории из которой будут удаляться файлы.

Даем файлу максимальные привелегии с помощью утилиты "chmod".

chmod 777 DelFileNDay.sh

Запускаем bash-скрипт.

./DelFileNDay.sh

Если нужно чтобы файлы удалялись автоматически, например раз в день или месяц, то поместите скрипт в директорию "/etc/cron.daily/" или "/etc/cron.monthly/".

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Скрипт, загружающий случайные обои, опубликованные на reddit-канале wallpaper

#!/bin/bash
wget -O - http://www.reddit.com/r/wallpaper |\
grep -Eo 'http://i.imgur.com[^&]+jpg' |\
shuf -n 1 |\
xargs wget -O background.jpg
feh --bg-fill background.jpg

С помощью wget скрипт загружает страницу www.reddit.com/r/wallpaper, передает ее grep, который ищет на ней ссылки на imgur, выбирает случайную ссылку с помощью shuf, загружает ее опять же с помощью wget и устанавливает в качестве обоев, используя команду feh (это такой миниатюрный просмотрщик изображений, его нужно предварительно установить). Скрипт можно добавить на рабочий стол, и тогда по клику у тебя будут меняться обои.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👉 Основы работы с терминалом и BASH

Видеоуроки:
1 — Основные команды терминала. Первый скрипт на BASH.
2 — Условия
3 — Циклы
4 — for, let, trap
5 — Функции, рекурсия, модули, массивы
6 — GNU awk
7 — expect, who, mesg, autoexpect

📹 Плейлист на YouTube

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой простой способ отрезать расширение у файла?

Стандартный и популярный способ — использовать утилиту basename, который отрезает весь путь слева, а если указать дополнительный параметр, то дополнительно отрежет справа и суффикс. Например пишем file.txt и суффикс .txt

$ basename file.txt .txt
file

Но можно не запускать целый отдельный процесс для такого простого действия, и обойтись внутренними преобразованиями в bash (bash variable expansions):

$ filename=file.txt; echo ${filename%.*}
file

Или наоборот, отрезать имя файла и оставить только расширение:

filename=file.txt; echo ${filename##*.}
txt

Как это работает?

% — отрезает все символы с конца до первого подходящего паттерна (поиск идет справа налево)
%% — отрезает все символы с конца до последнего подходящего паттерна (справа налево)
# — отрезает с начала до первого подходящего паттерна (поиск идет слева направо)
## — отрезает с начала до последнего подходящего паттерна (слева направо)

Таким образом, "${filename%.*}" означает — начиная справа налево проходим все символы (*) и доходим до первой точки. Отрезаем найденное.
Если бы мы использовали "${filename%%.*)", то в файлах, где точка встречается больше одного раза, у нас бы оно дошло до последней точки, отрезав лишнее.

$ filename="file.hello.txt"; echo "${filename%%.*}"
file

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Скрипт для запуска и остановки торрент-клиента во время простоя машины

#!/bin/bash

IDLE=600000
STOPCMD="transmission-remote -S"
STARTCMD="transmission-remote -s"

STOPPED="yes"
while true; do
if [ `xprintidle` -gt $IDLE ]; then
if [ $STOPPED = "yes" ]; then
$STARTCMD
STOPPED="no"
fi
else
if [ $STOPPED = "no" ]; then
$STOPCMD
STOPPED="yes"
fi
fi
sleep 60
done

Скрипт уходит в бесконечный цикл, каждую минуту проверяя, сколько миллисекунд прошло с момента, когда юзер что-либо делал (для этого используется команда xprintidle). Если прошло уже 600 000 мс (десять минут), скрипт выполняет команду, указанную в переменной STARTCMD. В противном случае он выполнит команду STOPCMD, но только тогда, когда до нее была выполнена команда STARTCMD. Если кратко: ничего не делаешь за компом десять минут — запускается STARTCMD, в данном случае это команда запуска всех закачек с помощью Transmission, если нет — приостановка всех закачек. Не любишь Transmission? Нет проблем, вот команды для Deluge:

STOPCMD="deluge-console pause \*"
STARTCMD="deluge-console resume \*"

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли создать hardlink на папку?

Конечно можно! Но не всем. POSIX файловые системы активно пользуются хардлинками и мы их все время видим! Пример:

# создаем директорию test
$ mkdir test
# выводим информацию о количестве ссылок и номер iNode для test
$ stat -c "LinkCount:%h iNode:%i" test
LinkCount:2 iNode:522366

Как? Только создали и уже два линка?

# заходим в созданную директорию test
$ cd test
# внутри выводим статистику для текущей директории "."
$ stat -c "LinkCount:%h iNode:%i" .
LinkCount:2 iNode:522366

В обоих случаях мы видим тот же номер iNode. То есть test и "." внутри него — это та же самая директория. И "." это не какой-то специальный алиас баша, и даже не операционной системы. Это просто жесткая ссылка на уровне файловой системы. Проверим еще один момент:

# создаем поддиректорию test2 внутри нашего test
$ mkdir test2
# заходим в поддиректорию test2
$ cd test2
# смотрим статистику о родительской директории ".."
$ stat -c "LinkCount:%h iNode:%i" ..
LinkCount:3 iNode:522366

".." имеет тот же iNode 522366, соответствующий директории test. И счетчик ссылок увеличился.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Совсем немного про перенаправления <, << и <<<

Первое перенаправление "<" из именованного потока или из файла. Давно известное и годами перетёртое мозолями суровых админов. Поэтому сразу перейдем к двум другим, которые встречаются реже.

<<, так называемая конструкция here document. Позволяет разместить многострочный текст прямо в скрипте и перенаправить его, словно из внешнего потока.

$ cat <<EOF
\ hello,
\ World
\ EOF
hello,
World

Cat
читает данные из файла. Мы перенаправляем ему в STDIN файл — конструкция here document генерит его прямо на месте, поэтому не нужно создавать отдельный файл.

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

Но можно пользоваться и <<<. Во-первых, <<< лучше читается, а во-вторых через <<< тоже можно передавать многострочные данные. Сравните два примера на читабельность:

#!/bin/bash
. load_credentials

sqlplus -s $connstring << EOF
set line 1000
select name, lastlogin from users;
exit;
EOF

#!/bin/bash
. load_credentials

SLQ_REQUEST="
set line 1000
select name, lastlogin from users;
exit;"

sqlplus -s ${connstring} <<<"${SQL_REQUEST}"

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

#!/bin/bash
. load_credentials
sqlplus -s ${connstring} <<<"select name, lastlogin from users;exit;"

Если оперировать скриптами побольше, и запросами подлиннее, то использование <<< с перенаправлениеим из переменных (а сами переменные мы можем объявить заранее, в специально отведенном и оборудованом комментариями месте), то код получается гораздо читабельнее.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как повысить эффективность Bash-скриптов

Bash-скрипты — эффективное решение для автоматизации рутинных задач, но не всегда самое простое. Объемные сценарии характеризуются низкой производительностью и сложны для чтения. В этой статье мы рассмотрим, как оптимизировать работу, упростить с помощью утилит sed и awk и не совершать очевидных ошибок в написании скриптов.

Инструменты обработки текста значительно расширяют возможности оболочки bash. Но с командами sed и awk можно не только редактировать вывод и файлы, включая сами скрипты. Утилиты служат наиболее эффективным решением некоторых задач автоматизации процессов.

Sed — потоковый редактор файлов, позволяющий сэкономить время на выполнении простых функций: удаление, замена, вставка текста.

Awk — язык программирования, синтаксис которого напоминает языки C и Perl. Хотя awk работает по тому же «построчному» принципу, но значительно превосходит sed по функциональным возможностям. При написании bash-скриптов инструмент удобно использовать для работы со структурированными данными, так как awk воспринимает поля (область текста, отделенную пробелами или табуляцией), переменные, арифметические функции и др.

🌐 Ссылка на статью

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как отлаживать bash-script-ы по шагам

Волшебная строчка, которую нужно добавить после #!/bin/bash, чтоб скрипт можно было отлаживать по шагам

#!/bin/bash

trap 'echo "# $BASH_COMMAND";read' DEBUG

echo line1
echo line2

echo line3

Процесс отладки
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.

Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.

Ингредиенты
- команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды

- команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо Ctrl+C

- переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Импорт фотографий из командной строки Linux

Представьте что у нас хранятся сотни тонн всевозможных снимков в совершенно разных местах, на разных носителях. Где-то они были разобраны по годам и месяцам, а где-то просто “свалены” в кучу и оставлены до лучших времен.

Мы запускаем программу указываем ей начальную точку, откуда начинать, и идем заниматься своими делами. Скрипт сканирует все директории какие встретит на своем пути, включая и вложенные, в поисках фотографий.

После завершения работы программы получаем фотоальбом с отсортированными снимками по годам и месяцам в каждом году, т.е. в виде: год / месяц / снимки. Да еще и без дубликатов фотографий. А сами снимки будут переименованы из непонятных типа IMG_654372984.jpg или AB54645456.jpg во вполне читабельные и понятные имена вида YYYYMMDD_hhmmss.jpg. При этом не пострадает ни один оригинал фотографии.

🌐 Ссылка на скрипт

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как отключить историю оболочки bash в Linux

Оболочка bash сохраняет введенные из терминала команды в файл истории. Вы можете вызвать список команд, введенных ранее. Команда history отображает команды bash, которые вы выполнили ранее. Эти команды составляют историю команд. По умолчанию в истории отображается нумерованный список из 500 последних команд, начиная с самых ранних и заканчивая самыми последними. Значение переменной HISTSIZE используется в качестве числа команд для сохранения в списке истории.

Как отобразить текущую историю?
Нужно просто ввести команду history:

history
history | less
history | more
history | grep 'find'

Как узнать количество сохраненных в истории команд?
Используйте команду echo или printf :

echo "$HISTSIZE"
или
printf "%d\n" $HISTSIZE

Где хранится история bash команд?
Инициализируется история из файла с именем переменной HISTFILE. По умолчанию используется файл ~/.bash_history. Для просмотра текущих настроек можно использовать:

echo "$HISTFILE"
или
printf "%s\n" "$HISTFILE"

Как отключить историю оболочки BASH на Linux или Unix?
Переменную HISTFILE можно удалить, набрав следующую команду сброса:

unset HISTFILE

Добавьте указанную выше строку в конец нового файла /etc/profile.d/disable.history.sh или ~/.bash_profile:

echo 'unset HISTFILE' >> /etc/profile.d/disable.history.sh
или
echo 'unset HISTFILE' >> ~/.bash_profile

Как навсегда отключить историю bash с помощью команды set?
Другой вариант — передать параметр +o history встроенной команде set:

set +o history

Аналогично добавьте set +o history в конец нового файла /etc/profile.d/disable.history.sh или ~/.bash_profile.


Как очистить историю bash?
Введите следующую команду в текущем сеансе:

history -c

Чтобы удалить одну команду под номером 42 из истории в Linux / Unix:

history -d 42

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как преобразовать строку в нижний регистр

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

Чтобы конвертировать строку в маленькие буквы независимо от её текущего регистра, используйте одну следующую команду:

a="Hi all"
echo "${a,,}"
hi all

Начиная с Bash 5.1 имеется параметр преобразования L, который предназначен для перевода строки в нижний регистр:

${var@L}

Пример:

v="heLLo"
echo "${v@L}"
hello

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как в Bash реализовать «Нажмите любую кнопку для продолжения»

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

В Bash это можно сделать с помощью утилиты read. Эта утилита читает строку из стандартного ввода.

Пример использования:

read -p "Нажмите ENTER для продолжения"

Эта команда позволит пользователю продвинуться далее (а скрипт продолжит выполнение) после того, как пользователь нажмёт кнопку ENTER.

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

read -n 1 -s -r -p "Нажмите любую кнопку для продолжения"

В этой команде следующее значение опций:

-n определяет количество символов, после которого будет остановлено чтение. По умолчанию чтение останавливается при вводе разделителя строк (например, кнопкой ENTER). В нашем случае команда read перестаёт считывать вводимые данные после первого символа

-s скрывает пользовательский ввод

-r приводит к тому, что строка будет интерпретирована как «сырая» (без учёта экранирования обратными слэшами). То есть обратным слэшам не будет позволено экранировать символы

-p как и в первом примере, содержит сообщение, показываемое пользователю.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
👉 Уроки по Bash скриптам

Видеоуроки:
1 — Привет Мир
2 — Переменные
3 — Команда read и Параметры
4 — Условный оператор if
5 — Условный оператор case
6 — Вложенные условия
7 — Массивы
8 — Циклы
9 — Функции
10 — Рекурсия
11 — Перенаправление ввода/вывода

📹 Плейлист на YouTube

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Bash скрипт для сканирования диапазона портов

Наш скрипт будет принимать два аргумента – IP-адрес для сканирования и диапазон портов для сканирования.

#!/bin/bash

ip=$1
startport=$2
endport=$3

function portscan {
for ((counter=$startport; counter<=$endport; counter++))
do
(echo > /dev/tcp/$ip/$counter) > /dev/null 2>&1 && echo "$counter open"
done
}

portscan

Для использования необходимо предоставить ему права на выполнение и запустить его с IP-адресом и диапазоном портов для сканирования.

- Сохраните скрипт в файл, например portscan.sh
- Сделайте скрипт исполняемым: chmod +x portscan.sh
- Запустите скрипт с IP-адресом и диапазоном портов: ./portscan.sh 192.168.1.1 20 80
- Будет произведено сканирование портов с 20 по 80 на IP-адресе 192.168.1.1.

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вывести список директорий используя ls в Bash

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

1. С помощью ls увидеть все папки кроме скрытых
*/ - это шаблон, который соответствует всем подкаталогам в текущем каталоге (* будет соответствовать всем файлам и подкаталогам; / ограничивает его каталогами). Точно так же, чтобы вывести список всех подкаталогов в /home/mial/bin/aur, используйте:

ls -d /home/mial/bin/aur/*/

Чтобы вывести только каталоги в текущей папке:

ls -d */

Чтобы вывести данные в столбик:

ls -1 -d */

2. С помощью ls увидеть все папки вместе со скрытыми
Обратите внимание, что */ не найдёт любые скрытые папки. Чтобы включить и их, укажите их явно:

ls -d .*/ */

3. С помощью ls и cut
Следующий способ показывает каталоги только в текущей папке, но делает это в виде столбика:

ls -d */ | cut -f1 -d'/'

Чтобы показать вместе со скрытыми каталогами:

ls -d .*/ */ | cut -f1 -d'/'

Чтобы показать только директории в папке /home/mial/bin/aur:

ls -d /home/mial/bin/aur/*/ | cut -f1 -d'/'

4. Используя ls и grep
В этом варианте применяется фильтрация вывода с помощью grep. Этот способ имеет ограничение — папки должны выводиться в виде подробного списка:

ls -l | grep "^d"

Чтобы показать вместе со скрытыми папками:

ls -al | grep "^d"

Для вывода только имён директорий (возможны проблемы с директориями, имеющими пробелы в названиях):

ls -l | grep "^d" | cut -f 10 -d ' '

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM