Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
نمایش بیشتر📈 تحلیل کانال تلگرام Bash Days | Linux | DevOps
کانال Bash Days | Linux | DevOps (@bashdays) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 23 806 مشترک است و جایگاه 5 710 را در دسته فناوری و برنامهها و رتبه 28 118 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 23 806 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 15 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -195 و در ۲۴ ساعت گذشته برابر -10 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 23.79% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 11.52% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 5 664 بازدید دریافت میکند. در اولین روز معمولاً 2 744 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 25 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند bashdays, linux, bash, docker, скрипт تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 16 ژوئن, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
Как говорится - пока гром не грянет мужик не перекрестится.Велосипед я изобретать не стал, а так же не стал брать сразу какие-то продвинутые инструменты для восстановления. Решил воспользоваться нативным
fsck, чем чёрт не шутит.
ㅤ
Пошел погуглил синтаксис, не каждый же день этой хернёй пользуешься. А там блядь:
fsck -y /dev/sdb
fsck.ext3 -y /dev/sdb
Хмм... помимо fsck.ext3 есть еще и fsck.ext4 и еще несколько штук. Ёбтвою мать. Отправляемся ресерчить, чем эта поебота отличается от обычного fsck.
TL:DR: НИЧЕМ!
Ща, расскажу. Короче в чистом виде fsck это обёртка, универсальная оболочка, которая автоматом определяет тип файловой системы и затем уже запускает условно fsck.ext3, ну или какая там у тебя на дисках.
Автоопределение это заебись, но порой fsck не хочет ничего проверять. Поэтому самостоятельно определяем тип своей файловой системы и в зависимости от результата запускаем fsck.ext3 и т.п.
Чтобы узнать, что запустит fsck делаем так:
fsck -N /dev/sda1
В результате получишь:
[/usr/sbin/fsck.ext4 (1) -- fsck.ext4 /dev/sda1
А еще у fsck нет ключа - [-E extended-options]. В нее можно передать:
-E discard - Включает TRIM (удаление неиспользуемых блоков на SSD) во время проверки. Аналог fstrim, но в процессе fsck.
-E journal_only - Проверяет только журнал ext3/ext4, не сканируя всю ФС. Быстро, но полезно только в определённых сценариях.
-E frag - Проводит анализ фрагментации. Полезно, если интересует дефрагментация ext4.
-E bmap2extent - Преобразует старые "indirect" блоки в extent-формат (для старых ext4).
-E test_fs - Включает особое поведение для тестирования (не используется в продакшене).
Пример:
fsck.ext4 -f -E discard /dev/sda1
Принудительная проверка + удаление "мусорных" блоков на SSD.
# Как fsck определяет тип файловой системы
Порядок определения:
1. Смотрит в /etc/fstab и выгребает третий столбец.
2. Если в fstab хуй, то оно запускает blkid /dev/sda1
3. Если определить не получилось, пиздует в /etc/filesystems, но в большинстве случаев такого файла в современных дистрибутивах нет. Этот файл опционален.
Вот и вся наука. В кишки лезть уже не будет, этой информации вполне достаточно.
Ну и чтобы на каждую ошибку не вводить y, пропиши автофикс:
fsck -y /dev/sda1
Оно там само пошуршит, все исправит и будет тебе счастье. Изучай.
🛠 #linux
—
✅ @bashdays ✅ @linuxfactory ✅ @blogТренажер содержит 77 вопросов. Вполне достаточно чтобы заебаться.Я даж успешно прошел первую задачку, правда по-олдскульному и затронул все бед-практики, которые только существуют. ㅤ Установка простая:
cd /tmp
python3 -m venv textual_apps
cd textual_apps
source bin/activate
pip install cliexercises
cliexercises
Здесь я использовал tmp папку и venv, чтобы систему всяким гавно не засорять, а чисто поиграться.
Что прикольно, если совсем тупой, то можно получить подсказку, будет показано несколько решений. Подсказка открывается по CTRL+S.
Сможешь выбить все 77 вопросов без подсказок?
Исходники этого тренажера лежат тут, а видосик с работой можешь посмотреть тут.
🛠 #linux #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blogСтянул-закомитил-запушил. Не пушится? Похуй — push force!Теорию по git опустим, ты и сам знаешь для чего оно всё нужно — для удобства.
Я к примеру в гите храню базу obsidian и совсем недавно это спасло все мои заметки. Я установил плагин для синка с seafile и оно мне нахуй всё стерло. У меня сука глаз выпал, овер 3к заметок проебало за секунду. Но в гите у меня все это осталось, склонировал, восстановил. Бекап который однажды пригодился. Удобно.К сути. Как я сказал выше, тебе достаточно базы:
git pull
git commit -m "ебал я вашу буравую, несите книжку трудовую"
git push
К этому можно еще добавить clone, checkout и init, но этим ты будешь пользоваться очень редко.
Как все работает в реальности
У тебя есть корпоративная учетка в гитлабе/гитхабе, там уже сто пудово созданы репы. Копируешь мышкой строку для клона, вставляешь себе в терминале.
git clone git@git.bashdays.ru:shubin/obsidian.git
ВСЁ! Репа у тебя на руках.
Создаешь новую ветку от мастера:
git checkout -b 010825
И уже в нее говнокодишь. Когда говна достаточно, комитишь, делаешь пулл-реквест (мердж-реквест). После того как тимлид заапрувит твой реквест, правки вольются в мастер. А ветку 010825 можно закрывать.
Пункт с реквестами опять-же маловероятен, если компания не большая и ты там царь и бог девопса. Сразу хуяришь в мастер и никого не слушаешь. Отпадает необходимость создавать ветки и т.п. Ведь ты же всегда все делаешь идеально.
Я порой прям в гитлабе правлю через внутренний редактор, ебал я локально себе что-то клонировать. Быстрее через морду зайти и пайп подправить.
На этом можно и заканчивать, все элементарно. Не бойся гита, это хуйня не страшная. Если что-то пошло по пизде, удали, склонируй мастер и начни с чистого листа.
А как настроить ключи и т.п. я писал много постов, поищи по тегу #linuxfactory
А тут разбирали почему порой главная ветка называется main а не master.
🛠 #git #devops
—
✅ @bashdays ✅ @linuxfactory ✅ @blogПрограммировать естественно я ничего не хотел, я уже стар для этого дерьма.И тут я вспомнил про «Вайб-кодинг», сука! ЧатГПТ аналогично приказал долго жить (лень оплачивать), поэтому выбор пал на «дикпик». Накидал промтов с хотелками и идеальной картиной мира. Прям прочувствовал себя заказчиком продукта. Ну а хули. Ну и через несколько минут получил готовый кусок говна. Но нет! Пробежавшись по коду, хм, вполне вменяемо, даж базу данных прикрутил, систему банов, антифлуд и т.п. Реализовало оно мне на python + aiogram. И это не спиздеть заняло 2-3 минуты с моими дополнительными промтами с правками. Работает? Охуенно работает! И даже с первого раза, «дикпик» прям удивил. Запросил у него еще Dockerfile и пайплайн для gitea, запушил, раздеплоил. Потыкал, да, всплыли некоторые баги, но они не критичные, они больше от моего кривого ТЗ. Потом пофикшу, хотя вряд ли, ебал я. Короче без лишнего гемора получил личного бота для приема обратной связи. Он так же раскидывает входящие по топикам + делает еще кучу всего. Быстро и бесплатно. Ни в коем образе не призываю так делать, но если пиздец лень и нужно срочно, почему бы и нет?
За такого бота с меня вчера запросили 150к и месяц на реализацию. Хуйня какая-то. Потом бы я еще месяц бегал чтобы баги поправили.Хочешь сделать хорошо, сделай это своими руками, ну и роботов припрягай по необходимости. Только перепроверяй за ними, а то не ровен час, выебут в жопы. Подтверждаю, «Вайб-кодинг» работает и весьма неплохо, но в рамках разумного! 🛠 #develop — ✅ @bashdays ✅ @linuxfactory ✅ @blog
➡️пять самых уязвимых компонентов Kubernetes; ➡️как на практике устроена защита контейнерных сред; ➡️принципы, которые помогут поддерживать безопасность контейнеров.Будет полезно всем, кто отвечает за стабильность и безопасность: DevOps-инженерам, техлидам, специалистам по кибербезопасности и тем, кто хочет больше знать о Kubernetes. Вебинар пройдет 7 августа в 11:00. Зарегистрироваться🖱 Информация о рекламодателе
# возвращает число писем в ящике
function POP3_STAT(){
declare -a AREC
declare REC
SEND_CMD "STAT"
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ ${AREC[0]} == "+OK" ]];then
echo ${AREC[1]} # число сообщений
return 0
else
echo 0
return 1
fi
}
#Помечает к удалению указанное письмо
function POP3_DELE(){
declare -i MSG_NUM=${1:-1} # по умолчанию первое
declare -a AREC
declare REC
SEND_CMD "DELE $MSG_NUM" #удаляем указанное сообщение
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ ${AREC[0]} == "+OK" ]];then
return 0
else
return 1
fi
}
# читает письмо с заголовками
function POP3_RETR(){
declare -i MSG_NUM=${1:-1} # по умолчанию первое
declare -a AREC
declare REC
SEND_CMD "RETR $MSG_NUM" #читаем указанное сообщение
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ ${AREC[0]} == "+OK" ]];then
while read -r -t 2 -u ${POP3_CONN[0]} REC ; do
REC=${REC//$'\r'/}
echo "$REC"
if [[ "$REC" == "." ]];then
return 0 # msg end
fi
done
else
return 1
fi
}
# читает указанное число строк письма
function POP3_TOP(){
declare -i MSG_NUM=${1:-1} # по умолчанию первое
declare -i STR_NUM=${2:-1} # по умолчанию одна строка
declare -a AREC
declare REC
#читаем указанное сообщение
SEND_CMD "TOP $MSG_NUM $STR_NUM"
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ ${AREC[0]} == "+OK" ]];then
while read -ert 2 -u ${POP3_CONN[0]} REC ; do
REC=${REC//$'\r'/}
echo "$REC"
if [[ "$REC" == "." ]];then
return 0
fi
done
else
return 1
fi
}
Финальный код
#!/bin/bash
SERVER="server"
PORT=995
USER="user@server"
PASS="StrongPass"
coproc POP3_CONN { openssl s_client -connect "${SERVER}:${PORT}" -quiet 2>/dev/null;}
POP3_LOGIN && echo POP3_LOGIN OK
MSG_NUM=$(POP3_STAT)
#цикл перебора сообщений
while ((MSG_NUM));do
POP3_TOP $MSG_NUM 1 # Заголовки + 1 строку сообщения
# POP3_RETR $MSG_NUM # сообщения целиком
# POP3_DELE $MSG_NUM # помечаем к удалению.
((--MSG_NUM))
done
POP3_QUIT
help coproc
help read
man openssl
🛠 #bash #linux
—
✅ @bashdays ✅ @linuxfactory ✅ @blog# Функция для отправки команд серверу
function SEND_CMD() {
sleep 0.3
echo "$@" >&${POP3_CONN[1]}
sleep 0.3
}
# аутентификация. Обычный логин
function POP3_LOGIN() {
declare REC
declare -a AREC
# проверка соединения
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ "${AREC[0]}" == "+OK" ]];then
# Отправляем логин
SEND_CMD "USER $USER"
read -ert 2 -u ${POP3_CONN[0]} REC
read -ra AREC <<<${REC//$'\r'/}
if [[ "${AREC[0]}" == "+OK" ]];then
# Отправляем пароль
SEND_CMD "PASS $PASS"
read -ert 2 -u "${POP3_CONN[0]}" REC
read -ra AREC <<<${REC//$'\r'/}
if [[ "${AREC[0]}" == "+OK" ]];then
return 0 # аутентификация успешна
else
return 3 # не правильный пароль
fi
else
return 2 #не правильный login
fi
else
return 1 # ошибка соединения с сервером
fi
}
#Выход и закрытие дескрипторов.
function POP3_QUIT(){
SEND_CMD "QUIT"
# Закрываем coproc
exec ${POP3_CONN[0]}<&-
exec ${POP3_CONN[1]}>&-
}
Задержки 0.3 секунды при отправке нужны для того, чтобы сервер успел сформировать ответ.
Ошибки -ERR не обрабатывал. В случае чего команда read завершится по таймауту в 2 сек. (-t 2)
${REC//$'\r'/} конструкция удаляет cr, потому что POP3 сервер отвечает c lfcr.
#!/bin/bash
SERVER="server"
PORT=995
USER="user@server"
PASS="StrongPass"
# создаем сопроцесс и соединяемся с сервером pop3
coproc POP3_CONN { openssl s_client -connect "${SERVER}:${PORT}" -quiet 2>/dev/null;}
POP3_LOGIN
POP3_QUIT
help coproc
help read
man openssl
вики POP3
🛠 #bash #linux
—
✅ @bashdays ✅ @linuxfactory ✅ @blogcoproc [NAME] command [redirections]NAME - имя индексного массива, в котором содержатся дескрипторы command. Если NAME не задано, по-умолчанию используется COPROC . COPROC[0] связан с stdout command , COPROC[1] - с stdin. И с помощью этих дескрипторов мы сможем взаимодействовать с command, не смотря на то, что программа работает в фоновом режиме. Сразу хочу обратить внимание. Если задано NAME - вместо command необходимо использовать группировку, даже из одной команды:
coproc [NAME] { command [redirections];}
Иначе coproc поймет NAME - как команду, а command как ее параметры. И да, при группировке пробелы и точка с запятой очень важны. Добро пожаловать в bash. :-)
Пока все не так просто, как хочется, но практика все расставит по местам, а заодно научимся принимать почту от POP3 сервера с ssl.
🛠 #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
