Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
Mostrar más📈 Análisis del canal de Telegram Bash Days | Linux | DevOps
El canal Bash Days | Linux | DevOps (@bashdays) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 23 788 suscriptores, ocupando la posición 5 702 en la categoría Tecnologías y Aplicaciones y el puesto 28 099 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 23 788 suscriptores.
Según los últimos datos del 19 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -226, y en las últimas 24 horas de 1, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 23.40%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 13.11% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 5 567 visualizaciones. En el primer día suele acumular 3 119 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 22.
- Intereses temáticos: El contenido se centra en temas clave como bashdays, linux, bash, docker, скрипт.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 20 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
#!/bin/bash
FILE="bashdays.gzip"
FIRST="${FILE%.*}"
SECOND="${FILE##*.}"
echo $FIRST
echo $SECOND
В переменной FILE заносим имя файла bashdays с расширением gzip. Далее в переменной FIRST отсекаем расширение gzip, в переменной SECOND отсекаем имя bashdays. По итогу на экран выведется такая шляпа:
bashdays gzipПонял? Легкотня, без гигантских регулярок и гавнокода. Сейчас объясню подробнее, что происходит. Символ
%.* означает отсекание всего после точки.
Символ ##*. ну а тут наоборот, отсекание всего до точки.
Если бы файл назывался bashdays,gzip (через запятую), то наш скрипт, нужно было бы немного адаптировать под эту запятую.
FIRST="${FILE%,*}"
SECOND="${FILE##*,}"
Проще уже не объяснишь. Если не дошло, сам потыкай на примерах и уже точно въедешь в тему, на практике само собой всё проще и понятнее.
Это один из способов реализовать желаемое. Но есть и другой. Давай воспользуется командой basename.
Команда basename в Linux печатает последний компонент в пути к файлу. Это особенно полезно в скриптах bash, где вы хотите извлечь имя файла из длинного пути к файлу.
Если тебе заранее известно расширение файла, в нашем случае оно известно как gzip. То мы сможем отсечь расширение такими способами (они идентичны):
basename /tmp/bashdays.gzip .gzip basename -s .gzip /tmp/bashdays.gzipВ обоих случаях на экран выведется:
bashdays
Ключ -s удаляет завершающее расширение файла, но можно и из коробки запускать, не указывая его.
Еще есть ключ -a, в который можно передать несколько путей и извлечь сразу пачку. Но я ни разу не видел, что бы такое использовали где-то, так что можно забить.
С basename вроде всё, дальше у нас по списку dirname.
Команда dirname в Linux печатает путь к файлу с удаленным последним компонентом. Это в основном дает вам путь к каталогу из пути к файлу.
dirname /usr/local/sbin dirname /tmp/bashdays.gzip dirname /usr/bin/dateРезультат будет таким:
/usr/local/ /tmp/ /usr/bin/Ну а чо, вообще шикарно! Ну и вишня для гиков, магия с переменной $IFS. Переменная IFS (внутренний разделитель полей) используется для указания определенного разделителя для разделения строк.
_file="/tmp/bashdays.gzip" OLDIFS="$IFS" IFS='.' set -- $_file IFS="$OLDIFS" printf "File: %s\nExt: %s\n" "$1" "$2"Кратенько: Определяем имя файла, задаем переменную IFS для извлечения имени файла и расширения, указываем разделитель «.» (точка), выполняем set для разделения на позиционные параметры, ну и выводим все на экран с помощью printf (но можно и через echo). Выхлоп скрипта будет таким:
File: /tmp/bashdays Ext: gzipКоманда set — это встроенная команда оболочки, которая позволяет отображать или устанавливать переменные оболочки и среды. Уффф.. Как-то много букв получилось, пардон. Основные моменты рассмотрели, надеюсь твой интерес я удовлетворил. Спасибо за внимание, ставь лайк. А вечером закину еще что-нибудь занимательное. Давай, на связи! tags: #bash #linux — 🟢 Подпишись: @bashdays
hello+service@bashdayz.ru (подставлять символ «+»), но мне гораздо удобнее получить временный почтовый ящик консольной командой и принять на него письмо. Сейчас расскажу как такое реализовать.
Будем использовать готовый bash скрипт
wget -O /usr/local/sbin/tmpmail https://raw.githubusercontent.com/sdushantha/tmpmail/master/tmpmail chmod +x /usr/local/sbin/tmpmailВыкачиваем, помещаем в папку /usr/local/sbin и даем файлу атрибут на исполнение. Обязательно пробегаемся глазами по скаченному файлу, чтобы в нем не было приколов типа «Патча Бармина» Ок, Запускаем
# tmpmail Could not find the following dependencies: jq w3m xclip curlХм, устанавливаем зависимости:
apt/yum/brew install jq w3m xclip curlНу и запускаем повторно:
# tmpmail [ Inbox for qxsgxmmeuas@1secmail.com ] No new mailНу вот и всё! Временный адрес электронной почты готов и все это без лишних манипуляций в браузере. Теперь можешь на него получать коды и ссылки. ВАЖНО! Отправлять письма с таких ящиков ты не можешь, они работают только на приём. У скрипта есть несколько ключей, давай посмотрим: Сгенерировать НОВЫЙ временный адрес
# tmpmail -g # tmpmail -g [ADDRESS]Если указать [ADDRESS], то временная почта будет с твоим индивидуальным префиксом. Ну а если не указывать, то будет рандом. Выводит список доступных доменов, на которые можно создать временную почту
# tmpmail -d # tmpmail -g bashdayz@kzccv.comВ первой строке выводится список доступных доменов, во второй строке я собираю себе индивидуальную почту из префикса+домен. Из основного это всё. Ну а чтобы посмотреть список входящих писем. Просто запускаешь заново:
# tmpmail [ Inbox for bashdayz@kzccv.com ] - 347359684 kzccv.com@email.workflowy.com Signup code for WorkflowyДля того чтобы прочитать:
# tmpmail 347359684То есть передаешь идентификатор письма, которое нужно открыть. Либо можешь воспользоваться ключом tmpmail -r, тогда сразу откроется самое последнее письмо. Я использую такую конструкцию, открываю последнее письмо в текстовом режиме.
tmpmail -t -rКлюч -t открывает письмо в raw (сыром) виде. Если этот ключ не указывать, то письмо будет рендериться как HTML. Мне проще сразу открыть последнее и получить текст. Эту утилиту вполне реально интегрировать со своими bash скриптами и полностью автоматизировать какую-то рутину. Например, если ты QA, то можешь в автотесты легко это закинуть и проверять кейсы про авторизацию и регистрацию новых пользователей. Тут полёт фантазии безграничный. Ну и алиасы никто не отменял, создай парочку с нужными тебя ключами и вообще всё будет в шоколаде. 🐱 Проект на github Также можешь воспользоваться онлайн версией если не хочешь ничего устанавливать. Забирай в коллекцию, рекомендую! 🐾 tags: #services #bash — 🟢 Подпишись: @bashdays
echo '--------------' printf '%s\n' '--------------'Так-то нормальная практика, но смотрится как-то уж очень не профессионально. У python и прочих языков такое можно реализовать примерно так:
python3 -c 'print("-" * 80)'
perl -E 'say "-" x 80'
А что-же с bash? Из коробки такой функции увы нет. Включаем «режим изобретателя». Поехали.
repeat(){
for i in {1..90}; do echo -n "$1"; done
}
repeat '-'
Создаём функцию с циклом repeat, в которую передадим символ «-» для повторения 90 раз. Вот оно! Уже намного лучше.
Теперь если мне нужно вывести какие-то заголовки в «рамке», я делаю так:
repeat '-';. echo -e '\nHeader 1\t\tHeader 2\t\tHeader 3\t\t\t\tHeader 4'; repeat '-';Уже не плохо. Символ \t означает = Табуляция. Ну а \n я думаю ты и так знаешь = Новая строка. Гуд. Но функция все равно не универсальная, хочется большего. Давай теперь передадим в функцию repeat количество повторов. В предыдущем скрипте у меня зашит харкод на 90 символов. Вуаля:
repeat() {
range=$(seq $2)
for i in $range; do echo -n "$1"; done
}
repeat '-' 20
Передаем в функцию 2 параметра, первый = какой символ loop’ить, второй = сколько будет повторов. В примере выше, символ «-» выведется 20 раз.
Команда seq в этом скрипте выводит последовательность целых чисел с шагом, заданным пользователем. По-умолчанию, выводимые числа отделяются друг от друга символом перевода строки, однако, с помощью ключа -s может быть задан другой разделитель.
# seq 5 1 2 3 4 5 # seq -s : 5 1:2:3:4:5С этим ок, разобрались. А что если воспользоваться printf? Давай попробуем. С printf это реализуется намного проще, вот варианты:
printf -- '-%.0s' 1 2 3 4 5
printf -- '-%.0s' {1..20}
Разборка этой магии
Двойное тире означает «флаги командной строки». Поскольку мне нужно вывести «-», двойное тире указывает команде printf не пытаться анализировать то, что идет после параметров командной строки. 😶 ЧО?
Короче простым языком: если выводишь символ «-» через printf, то нужно двойное тире. Если выводишь к примеру символ «~» можно обойтись такой конструкцией:
printf '~%.0s' {1..20}; printf '\n'
Просто при выводе «-» printf думает что ты ему какой-то ключ хотел подсунуть и заорет: printf: -%: invalid option. В общем такая вот особенность. Ну либо всех обмануть и сделать так:
printf '%.0s-' {1..80}
Подобное можно реализовать с помощью внешних утилит таких как: awk/sed и т.п. Но чем больше ты усложняешь, тем тяжелее это дебажить. Это утверждение справедливо вообще для всего.
на закуску:
seq -s_ 20|tr -d '[:digit:]'Надеюсь ты узнал что-то новое. Спасибо за внимание, ставь лайк, репости и приводи к нам своих коллег и друзей. Забашим! tags: #bash — 🟢 Подпишись: @bashdays
ssh -p 2220 root@bandit.labs.overthewire.orgСделано всё достаточно реалистично, можно представить себя хакером или пентестером. Хотя если ты уже хакер или пентестер 🤒 то представлять ничего не нужно. Плюсы игры: У тебя есть задачи, которые нужно решить с помощью консоли. Помимо этого отлично прокачивается логика и навыки дебага. В общем рекомендую поиграть. Ну а если уперся, можешь глянуть полное прохождение на хабре. Да и на ютубе этого добра навалом. Помимо «Bandit» на сайте имеется еще с десяток игр, покопайся, обязательно что-то зацепит. Я в прошлой жизни обожал игру uplink, просто жил в ней. Помню даже отреверсил и патч сделал, чтобы накинуть на баланс денег и купить крутое виртуальное железо. Artmoney почему-то ее никак не хотела ломать, пришлось на ассемблере инжектор писать. Uplink — компьютерная игра, симулирующая деятельность хакера. Дебютный проект, выпущенный британской независимой компанией Introversion Software в 2001 году Сейчас игра доступна для покупки в стиме, стоит копейки, но можно и пиратку легко найти на трекерах да на олдскульных форумах. У Introversion еще есть несколько крутых игрух, например крутецкая стратегия darwinia. Тоже рекомендую погонять. Ну и defcon. Короче все их игры это шедевры. Как-то так. Сегодня еще один пост закину, после очередной интеграции, там побашим уже и новое разберем, так что на связи. Не прощаюсь. tags: #linux #games — 🟢 Подпишись: @bashdays
apt/yum/brew install spellcheckА использование этого линтера, вообще максимально простое:
shellcheck script.shВот и все. Если твой скрипт написан чисто и без косяков, то после запуска этой команды, ничего не произойдет. А вот если запустить его на скрипте из этого поста, то в ответ получим много нецензурной брани и полезные советы. С одной стороны использовать эмоджи нам дают, но линтер как бы намекает на наш IQ.
^-- SC1036 (error): '(' is invalid here. Did you forget to escape it?
^-- SC1088 (error): Parsing stopped here. Invalid use of parentheses?
For more information:
https://www.shellcheck.net/wiki/SC1036 -- '(' is invalid here. Did you forg...
https://www.shellcheck.net/wiki/SC1088 -- Parsing stopped here. Invalid use...
Что еще сказать, этот линтер можно прикрутить в vim. Достаточно установить из репозитория плагин Plug 'neomake/neomake’.
А если лень ставить и тыкать, можешь воспользоваться онлайн версией. Я пользуюсь консольной версией, из коробки, без всяких дополнительных ключей. Но ключи все же имеются, можешь запустить --help и поглядеть сам, но там особо ничего такого нет.
🐱 Проект shellcheck на github
Ну и котиков лови: 🤭. 👀 😊 кудаж без них.
tags: #bash #utils
—
🟢 Подпишись: @bashdaysgnu.org как-то пролетал improvement тикет, который звучит так: Эмоджи/Смайлики не поддерживаются в оболочке bash в качестве имен переменных.
А правда, почему? Что бы отвечать на подобные вопросы, сначала нужно задать другой вопрос — что бы что?
А ответ на этот вопрос простой: Ни одна из оболочек не поддерживает такое. Потому что POSIX не требует от оболочки поддержки символов, отличных от «цифр, букв, символа подчеркивания из набора кодировки (ASCII)». И добавлять поддержку эмоджи/смайлов вообще не имеет никакого смысла.
POSIX — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой, библиотеку языка C и набор приложений и их интерфейсов.
Данные правила действуют для именования переменных. А вот имена функций не имеют подобных ограничений. Так что в функциях ты вправе использовать эмоджи и это даже будет работать.
Вот пример рабочей функции, которая выводит Hello World.
#!/bin/bash
😀😀😀 () {
echo "hello world"
}
😀😀😀
Можно прям веселые bash скрипты писать (добавлять какашки и баклажаны) и радовать своих коллег. 💕 Пусть орут.
Пока на этом все, после интеграции от партнера, чего-нибудь еще интересное закину почитать, увидимся!
Ну а если скучно и хочется прокрастинации, камон в мои мемные айти каналы: @devopsina и @devopsgarden
tags: #bash #linux
—
🟢 Подпишись: @bashdayssudo rm -rf /* и твоя проблема решится.
Но мало кто знает, что эта команда называется «Патч Бармина».
Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.
Данная команда действительно устраняет любые неполадки вместе с самой Unix-системой. Поэтому будь аккуратен в своих экспериментах, запускать такое можно только на подопытных стендах ради науки. Надеюсь ты успел дочитать до этого абзаца 🤒 и не побежал проверять на продакшене.
Давай разберем как работает «Патч Бармина»
По умолчанию утилита rm проверяет аргументы командной строки на соответствие корневой директории. Если в rm передан аргумент /, то выведется предупреждение. Но с помощью опции --no-preserve-root это предупреждение можно отключить.
В случае команды rm -rf /* аргументами будет содержимое корневой директории. Оболочка bash передаст команде rm список. Чтобы посмотреть, что будет в списке, выполни:
printf '%s\n' /*Выведется список папок и файлов. Но корневой директории в этом списке не будет. Ну а дальше команда rm начет удалять всё до чего сможет дотянуться. Даже если её запустить под обычным пользователем, многие файлы будут удалены. Достаточно чтобы процессу были доступны чтение/запись/исполнение (rwx) для директории в которой будут удаляться файлы. Ну и чтение/исполнение (r-x) на компоненты пути до этой директории. Права на чтение не обязательны если известен полный путь и он задан в качестве аргумента. К примеру этой командой
rm -ri /* давай удалим содержимое домашней директории пользователя. Но перед каждым удалением будет задаваться вопрос (ключ -i).
rm: спуститься в защищённый от записи каталог '/boot'? rm: спуститься в защищённый от записи каталог '/dev'? rm: спуститься в защищённый от записи каталог '/etc'? rm: спуститься в защищённый от записи каталог '/home'? y rm: спуститься в каталог '/home/user'? y rm: удалить обычный файл '/home/user/.bashrc?Если мне что-то не нужно удалять, я просто нажимаю Enter, а для положительного ответа набираю «y» и жму Enter. Также имеется еще одна опция
--preserve-root, без аргументов эта опция как раз и включает проверку которую отключает --no-preserve-root. При задании этой опции с аргументом all директории чьи родители находятся на другой файловой системе (то что было смонтировано) — пропускуются. Например домашняя папка пользователя находится на отдельном разделе.
rm -ri --preserve-root=all /*вывод будет таким:
rm: пропускается '/dev', поскольку он находится на другом устройстве rm: и действует --preserve-root=all rm: пропускается '/run', поскольку он находится на другом устройстве rm: и действует --preserve-root=all rm: пропускается '/tmp', поскольку он находится на другом устройстве rm: и действует --preserve-root=allКакие выводы. Даже если не указывать
--no-preserve-root, команда rm может знатно начудить. Всегда гугли/читай, прежде чем бездумно копировать и запускать. Ну и всегда пробегайся глазами по чужим bash скриптам, особенно если эти скрипты дернуты у какого нибудь Васи Нонейма.
На этой прекрасной ноте, жму тебе руку и желаю хорошего дня!
tags: #bash #linux
—
🟢 Подпишись: @bashdaysgit clone git@gitlab.com:slackermedia/bashcrawl.git cd bashcrawl/entrance cat scrollИщем сокровища, собираем артефакты, проходим квесты, сражаемся с пиэмами и техдирами. Игра само собой представляет текстовый linux тренажёр. Чем-то напоминает рогалик dungeon crawl, кстати можешь в онлайне в неё побегать если совсем уж скучно. Вторая игра называется Terminus Тут устанавливать ничего не нужно, все работает в браузере. Открывается консоль, а дальше следуешь подсказкам. Из приятных мелочей: есть визуальная составляющая. По мере прохождения квестов, картинки меняются. Намного круче чем предыдущая BashCrawl, по крайней мере мне было в ней уютнее. Третья игра CL Mystery / Crimescence Mystery with Answers На мой взгляд самая крутая и сбалансированная из всех вышеперечисленных. Если коротко, то: В Терминал-Сити произошло убийство, и полиции TCPD нужна ваша помощь. Чтобы поиграть, нужно скопировать репу и запустить:
git clone https://github.com/gannonk08/clmystery.git cat instructionsНу а далее следовать инструкциям на экране. Очень интересный сюжет с детективной составляющей. Рекомендую. Довольно качественная реализация, а самое главное — залипательно. Автор игры при создании воодушевлялся такими фильмами:
Достать ножи: Стеклянная луковица (2022) Убийство в Восточном экспрессе (2017) Поиск (2018) Достать ножи (2017) Улика (1985) Исчезнувшая (2014)И не нужна нам никакая плойка и дорогущая видеокарта. Сарказм. Нужна! Но можно и в консоли прекрасно поиграть, получив массу удовольствия. А самое главное в процессе игры — ты прокачиваешь не только паттерны, алгоритмы и логику, но и в игровом режиме знакомишься с командной строкой. Если знаешь еще какие-то подобные тренажеры, скидывай в бота, выпустим отдельным постом. Всех благ и хорошего воскресения! На связи! tags: #bash #linux #games — 🟢 Подпишись: @bashdays
#!/usr/bin/bash
ips=("1.1.1.1" "2.2.2.2" "3.3.3.3")
IT=`which iptables`
$IT -C DOCKER-USER -j RETURN 2>> /dev/null
if [[ $? -eq 0 ]]
then $IT -D DOCKER-USER -j RETURN
fi
$IT -C DOCKER-USER -i eth0 -j DROP 2>> /dev/null
if [[ $? -eq 1 ]]
then $IT -A DOCKER-USER -i eth0 -j DROP
fi
for ip in ${ips[@]}; do
$IT -C DOCKER-USER -s $ip/32 -i eth0 -j RETURN 2>> /dev/null
if [[ $? -eq 1 ]]
then $IT -I DOCKER-USER 1 -s $ip -i eth0 -j RETURN
fi
done
exit 0
Тут всё максимально просто. Есть массив айпишников в переменной ips. А далее просто проверяются iptables правила на их наличие. Ключ -C как раз то самое, необходимое чтобы определить не перетерлось ли что-то. Ну а если перетерлось, то оно само восстановится.
--check -C chain = Check for the existence of a rule
Последний блок прокручивает массив айпишников в цикле. Это весьма гибко, если тебе захочется добавить новых allow ip в свой массив. Ну а дальше кидаешь на всё это дело */1 * * * * /usr/local/sbin/check_iptables.shКогда ты запускаешь команду crontab -e, открывается файл /var/spool/cron/crontabs/root. Все таски хранятся в нем. Естественно если у тебя другой пользователь, то замени root на него. Можно и руками отредактировать типа: vim /usr/local/sbin/check_iptables.sh но тогда если ты допустишь ошибку в синтаксисе cron, то оно тебе про это не сообщит. А вот если через crontab -e накосячишь, то сообщит мол — ты чо ваще? дурной? Ну это так математика, чтобы ты понимал откуда что берется и почему. Ну а если у тебя сложности с пониманием cron синтаксиса, есть прекрасный сервис, там всё наглядно и для человеков, отвечаю! 😮💨 Полезного много я сегодня тебе принес. Переваривай потихоньку и забирай себе в копилочку. А я пойду дальше думать, чем же тебя еще удивить. Завтра кстати снова пятница, пора готовиться к выходным. Давай, увидимся! tags: #bash #linux #networks — 🟢 Подпишись: @bashdays
-A INPUT -s xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 80,443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibitedТо порты 80 и 443 так же будут доступны всем желающим. Вот на эти грабли почти каждый и наступает. А решение простое, правим немного свой docker-compose.yml и добавляем networks. В моем примере я добавил сеть bashdays.
version: '3.2' services: nginx: image: nginx:1.20.1 container_name: nginx ports: - '80:80' - '443:443' networks: - bashdays networks: bashdays: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" com.docker.network.bridge.name: "docker_bashdays"Ну и теперь на хостовой машине можно уже что-то запрещать или разрешать с помощью iptables.
/sbin/iptables -F DOCKER-USER /sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -j DROP /sbin/iptables -I DOCKER-USER -i eth0 -s <EXTERNAL IP> -j RETURN /sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s <CLIENT IP> -j RETURN /sbin/iptables -I DOCKER-USER -i eth0 -p tcp --dport 443 -s <CLIENT IP> -j RETURN /sbin/iptables -I DOCKER-USER -i eth0 -o docker_bashdays -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTГде <EXTERNAL IP> это айпишник сервера который доступен из мира. А <CLIENT_IP> собственно айпишник клиента, которому мы разрешим конектится к порту 80 и 443. Все! Теперь у нас и docker в шоколаде и хостовые правила iptables работают «наверное» правильно. Не забывай правильно подставить свой интерфейс ethX/enoX, а то всякое бывает. Важное замечание. После перезапуска контейнеров, docker снова перетрет правила на хостовой машине. Поэтому весь этот процесс хорошо бы автоматизировать. Я сильно не заморачивался, просто закинул правила в bash скрипт, повесил на крон (каждую минуту), да и все. Закостылил так закостылил 🧠 Сегодня чуть позже покажу более правильный скрипт, который будет следить за ребутом docker, но по сути те же яйца, только сбоку. Раз был всех вас видеть! tags: #networks — 🟢 Подпишись: @bashdays
- балансировщик (белый айпишник) - фронтэнд (192.168.0.3) - бекэнд (192.168.0.4) - база (192.168.0.5)У [балансировщика] есть белый айпишник, у остальных (фронтэнд, бекэнд, база) только серые. Хм… ну и как prometheus будет ходить на серые инстансы и забирать метрики? Да никак! 🤒 Уффф. Пошел смотреть в сторону pushgateway, чтобы инстансы сами метрики пушили в prometheus или сразу в VictoriaMetrics. VictoriaMetrics — быстрая и масштабируемая СУБД для хранения и обработки данных в форме временного ряда (запись образует время и набор соответствующих этому времени значений, например, полученных через периодический опрос состояния датчиков или сбор метрик). Но тут снова грабли. У prometheus тоже нет белого айпи. Это провал! Какой-то замкнутый круг получается. Забрать метрики не можем, отдать тоже не можем. Выдавать белые айпишники ой как не хочется, по причине — лень настраивать фаерволы и прочую шляпу. Но что же делать? Правильно — достаём костыли! Так как у тестовых серверов на [балансировщике] есть белый ip адрес, будем привлекать iptables и жёстко роутить. На балансировщике с белым ip, выполняем:
-A PREROUTING -p tcp -m tcp --dport 1001 -j DNAT --to-destination 192.168.0.3:9100 -A PREROUTING -p tcp -m tcp --dport 1002 -j DNAT --to-destination 192.168.0.4:9100 -A PREROUTING -p tcp -m tcp --dport 1003 -j DNAT --to-destination 192.168.0.5:9100 -A POSTROUTING -j MASQUERADEИдея заключается в том, что с портов 1001-1003 (на балансировщике) мы попадаем на внутренние инстансы с серыми айпишниками и забираем свои метрики с портов 9100. А в prometheus говорим, иди на внешний айпишник балансировщика с портами 1001-1003 и выгребай данные с серых инстансов. prometheus.yml
---
- targets:
- balancer:1001
labels:
env: test
role: frontend
- targets:
- balancer:1002
labels:
env: test
role: backend
Красота! Кейс рабочий, костыли присутствуют, графики красивые, тестировщики довольные. Ну а что еще надо? Think different! 🧠
tags: #рабочиебудни #monitoring #networks
—
🟢 Подпишись: @bashdayswhois <domain> и получаем желаемое. Но это не работает с доменной зоной .to. Если не веришь, можешь самостоятельно убедиться. Получишь массу информации, но никак не значение Expires on.
Отправляемся на раскопки.
Существует корневой whois сервер не для доменов, а для зон. Называется он whois.iana.org. С помощью него можно получить данные по конкретной зоне, контакты, телефоны и т.п.
Проверяю нужную мне зону .to
whois to -h whois.iana.org whois: whois.tonic.to status: ACTIVE remarks: Registration information: http://www.tonic.to/ created: 1995-12-18 changed: 2022-06-01 source: IANAОтдается куча информации. И что мне с этим делать? 😐 Ладно, я парень настырный. Пробую так:
whois best.to -h whois.tonic.toПолучаю тот же ответ что и раньше, ну нет нигде Expires on, шляпа какая-то. В ответе вижу строчку:
remarks: Registration information: http://www.tonic.to/
Ок. Раз ничего не получается, самое время идти читать документацию, может в ней будет что-то полезное.
Натыкаюсь на такой пункт: Предоставляет ли Tonic услугу whois? Компания Tonic не поддерживает базу данных whois, содержащую информацию о владельцах регистраций, поскольку многие наши клиенты считают, что публичное размещение такой информации нарушает их частную жизнь. Более того, мы никогда не будем продавать списки рассылки наших клиентов.
Приехали. Но чуть ниже вижу: всю доступную информацию по домену, ты можешь попробовать получить по ссылке: https://www.tonic.to/whois?best.to
А давай попробуем, вариантов у нас не много:
curl https://www.tonic.to/whois?best.to <pre> Domain: best.to Created on: Fri Apr 23 02:27:04 2021 Last edited on: Sat May 27 06:48:58 2023 Expires on: Sun Apr 28 07:33:28 2024 Primary host add: None Primary host name: ns-494.awsdns-61.com Secondary host add: None Secondary host name: ns-1424.awsdns-50.org ENDОПА! Есть контакт, Expires on как на ладони. Можно двигать таску в Done и писать экспортер для prometheus. И возможно однажды alertmanager вовремя сообщит, что стоило бы продлить домен, но это не точно 😎 После плановой интеграции про тимлидов, закину тебе еще какое-нибудь интересное чтиво. На связи! tags: #networks — 🟢 Подпишись: @bashdays
scp -r user@bashdayz:/tmp/nginx.log /home/user/tmp/
- скинуть файл человеку в слак/маттермост
- если файл большой, выложить его на корпоративный google drive
- скинуть человеку ссылку на файл на корпоративном диске
scp (Secure CoPy) — утилита для безопасного копирования данных между Linux-системами по протоколу SSH
Тут подходит фраза из мема: вот это chmod +x /usr/local/sbin/trans.
Запускается всё это безобразие так: trans <файл>
#!/bin/bash
SIZE=1000000
if [ -n "$(find "$1" -prune -size +"$SIZE"c)" ]; then
tar -czvf /tmp/$1.tar.gz $1
curl --upload-file /tmp/$1.tar.gz https://transfer.sh/$1.tar.gz
rm /tmp/$1.tar.gz
else
curl --upload-file $1 https://transfer.sh/$1
fi
Логика такая:
1. Если размер файла > 1 мб, то сжимаем
2. После сжатия загружаем файл в сервис transfer.sh
3. Подчищаем за собой
4. Если файл < 1 мб, то просто загружаем как есть в тот же сервис transfer.sh
5. После загрузки в консоль выводится ссылка для скачивания
6. Копируем полученную ссылку и передаем разработчику
7. Профит. Минимум действий, максимум удобства
Сервис transfer.sh это очень удобная и простая штука, которая позволяет обмениваться файлами с помощью curl/wget. Без регистрации и смс. Лимиты приличные 10гигов на файл, 14 дней хранятся на сервере. Есть возможность зашифровать перед отправкой и проверить на вирусы. И все это бесплатно.
А еще в curl можно передать заголовки -H "Max-Downloads: 1" -H "Max-Days: 5" и тогда файл разрешат скачать только один раз, а через пять дней он сам удалится. Пожалуй очень удобно.
Тут конечно возникает вопрос — эммм, но это же не безопасно? Конечно не безопасно, поэтому годится лишь для передачи какой-то некритичной информации. А я передаю чисто логи, в них ничего критичного нет.
Ну а если хочется передать сканы документов или реквизиты банковских карт, то в мой скрипт ты можешь встроить gpg шифрование. Либо переделать сжатие на 7z и зашифровать по максимуму. Но опять же не рекомендую, лучше передавай важные документы другим, более безопасным способом.
Мысли в слух: Вот есть корпоративный google диск, хранишь ты там абсолютно всё, включая секреты компании. Безопасно? НЕТ! Гугол давно уже у тебя всё спёр и всё про всех знает. Так что можно булки расслабить и перестать параноить. Ладно, опять в лирику ударились.
Короче бери на заметку, дорабатывай, переделывай. Можешь добавить xclip/pbcopy чтобы ссылка автоматом в буфер обмена копировалась. Ну и зайди на сайт transfer.sh и посмотри все возможности, которые они предоставляют. Там все с примерами, разберется любой.
Удобно? Удобно! А главное максимально просто. Хорошо тебе провести остаток выходных, ну и увидимся!
tags: #bash #services
—
🟢 Подпишись: @bashdaysapt/yum install ccze
Ну а после установки, применяем на практике:
cat /var/log/syslog | ccze -AКлюч
-A = Generate raw ANSI output
Вместо cat можно иcпользовать и tail, чтобы логи бежали в реальном времени. Я к примеру при дебаге использую исключительно tail.
tail -f /var/log/syslog | cczetail позволяет выводить новые строки в интерактивном режиме, либо выводить заданное количество строк с конца файла. Ура, теперь у нас настоящая новогодняя ёлка! От серых будней ничего не осталось, все чётенько, по цветам, ошибки промаркированы. Пушка! А самая приятная киллер-фича этой утилиты, это то, что я могу записать логи в html файл. А затем передать этот файл разработчикам, которые частенько приходят с просьбой — Олег, выгрузи нам пожалуйста последние 500 строк.
tail -n 500 /var/log/auth.log | ccze -h > ~/log.htmlРаз и готов html файл, который можно открыть в браузере и посмотреть как иностранные бедолаги с дикого запада пытались подобрать пароль на 22 порт. И всё это будет в цвете! У утилиты ccze есть много других ключей, а также присутствует поддержка плагинов. Но я пользуюсь функционалом из коробки. Список доступных плагинов можно глянуть командой:
ccze -lНу а если есть желание что-то там перепилить по цветам и т.п. всё это можно сделать в конфигурационном файле:
/etc/cczerc
Короче бери на вооружение, утилита мастхев. Картинка к посту опять не влезла, заливаю на телеграф, чтобы ты смог посмотреть на эту новогоднюю гирлянду и решить, что она тебе тоже ой как необходима.
✅ Картинка с ccze
В следующем посте расскажу как быстро передавать разработчикам подобные файлы, не мучаясь со скачиванием их на локальную машину, а затем приседать с пересылкой через слак/маттермост.
Давай краба, подписывайся, тыкай палец вверх, увидимся!
tags: #linux #utils
—
🟢 Подпишись: @bashdays
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
