Bash Days | Linux | DevOps
23.7K subscribers
225 photos
26 videos
776 links
Авторский блог от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Я тут это, капчу накрутил. Создавал под один нищенский нишевый проект.

😲 Сможешь пройти?

Подсказываю — можно накидать bash скрипт, который будет эмулировать нажатие F24 и успешно пройти эту проверку через передачу кейкода в xdotool. Ну либо клавиатуру купить как на картинке.

Концепт на Bash:


for i in $(seq 1 50); do
xdotool key F24
sleep 1
done


Всем хорошей рабочей недели!

🛠 #security #feature #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
570
Контекстная конфигурация в git

При работе с git репозиториями, частенько попадаешь в просак с таким:

git config --global user.name
git config --global user.email


Один раз забил свои явки-пароли и затем git при любом коммите или пуше будет подставлять эти данные. То есть в историю коммитов будет забиваться user.name и user.email. Это логично и понятно.

Но если у тебя смешаны личные и рабочие репозитории, начинается цирк с конями. Я тысячу раз комитил в рабочую репу под личным user.name и user.email и получал за это по рукам. Получал конечно сам от себя.

Потому что смешивать личное и рабочее — фуфу!


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

Расчехляем хоумлабу!

У нас будет 2 папки:

mkdir -p ~/projects/personal
mkdir -p ~/projects/work


Настраиваем основной конфиг:

vim ~/.gitconfig


[user]
name = Roman Shubin
email = shuba@bashdayz.ru

[includeIf "gitdir:~/projects/work/"]
path = ~/.gitconfig_work


Нюанс: / в конце work обязателен. Git интерпретирует gitdir: как префикс пути к каталогу .git.

Создаем рабочий конфиг ~/.gitconfig_work

[user]  
name = Linux Factory
email = exe@linuxfactory.ru


На этом танцы с бубном закончились, проверяем:

mkdir -p ~/projects/personal/app  
cd ~/projects/personal/app
git init

git config user.email
git config --show-origin user.email


Ага, видим что для личных проектов будет применяться shuba@bashdayz.ru и берется он из ~/.gitconfig. Последние 2 команды, как раз выводят эту информацию в терминал. Хорошо, теперь:

mkdir -p ~/projects/work/app  
cd ~/projects/work/app
git init

git config user.email
git config --show-origin user.email


Да твоюж мать! Видим Linux Factory и exe@linuxfactory.ru. Что и требовалось доказать, данные берутся из файла ~/.gitconfig_work.

Всё, мы успешно разделили контекст между личными и рабочими проектами. Таких инклудов ты можешь насоздавать сколько угодно. Самое главное это работает без костылей и каких-то лишних обвесов вокруг git.

Git скрывает очень много интересного и не всегда это очевидно. Такие дела, изучай!

🛠 #devops #linuxfactory #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
199
Фарш обратно не провернёшь

Порой в Bash поделках требуется создать какой-нибудь секрет, для дальнейшей его передачи в CI/CD или куда-то еще. Ежу понятно, это можно сделать «в лоб», но мыж с тобой не волки позорные, поэтому давай сделаем это по всем правилам DevSecOps Best Practice. (* лучшие практики безопасной разработки).

Задача: Создать безопасно секрет, чтобы его не спиздили (например из свапа при форензике).

Форензика — это направление информационной безопасности, связанное с анализом и восстановлением данных для расследования инцидентов


Кто-то извращается со shred и т.п. утилитами, но это избыточно, да и на SSD, Btrfs, ZFS и journal FS оно будет работать хуева и не гарантирует физическое уничтожение данных. Лучше на диск вообще ничего не писать.

Наш вариант это — pipe через printf. Можно конечно усложнить и сделать через анонимный файловый дескриптор, но получаются те же грабли только сбоку, смысла усложнять нет.

#!/usr/bin/env bash

set -euo pipefail

SECRET="$(openssl rand -base64 32)"

printf '%s' "$SECRET" | \
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 200000 \
-in input.txt \
-out output.enc \
-pass stdin

unset SECRET


Что тут происходит?

Ничего необычного, генерим 32 случайных байта, кодируем в base64, получаем пароль высокой энтропии, затем через printf передаем пароль (без \n) через pipe в stdin.

Ну и в конце скармливаем какой-нибудь утилите или в CI/CD, куда нужно передать секрет, в моем случае я передал его в openssl.

По итогу секрет, не попадает в history, не лежит на диске и временно находится в памяти. Но важно понимать, что после unset SECRET переменная удаляется только из таблицы переменных, в памяти эта переменная может по-прежнему храниться и быть уязвима к форензике. Поэтому носи это в голове и по возможности перезатирай память например тем же stress.

А еще оно может попасть в swap и это еще хуже, swap это прям как неочищенная «корзина» с удаленными файлами.

На bash этот момент описать наверное не получится, поэтому покажу как сделать на Сиськах. Будем использовать mlock().

#include <sys/mman.h>
#include <string.h>
#include <stdio.h>

int main() {
char secret[32] = "super_secret_password";

if (mlock(secret, sizeof(secret)) != 0) {
perror("mlock failed");
return 1;
}

printf("Secret in locked memory\n");

// Используем секрет...

memset(secret, 0, sizeof(secret)); // затираем
munlock(secret, sizeof(secret));

return 0;
}


Когда этот код будет вызывать mlock(), указанный диапазон памяти закрепляется в RAM и ядро не имеет права выгружать его в swap.

Получается что сначала mlock() блокирует участок памяти, затирает memset() её перед освобождением и с помощью munlock() снимает блокировку.

Кстати mlock() используют GnuPG, OpenSSH, HashiVault, KeePassXX. Так что вариант надежный, можешь не сомневаться. А еще иногда используется mlockall():

mlockall(MCL_CURRENT | MCL_FUTURE);


Блокируется вся текущая и будущая память процесса, активно применяется демонами в HashiVault.

Такие дела.

Накидай еще своих вариантов в комменты, будет интересно ознакомиться.

🛠 #dev #security #bash

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
155
Здрасти, кого не видел. Потыкал я короче хвалёный Warp Terminal в рамках автоматизации с гитом, кодом и инфраструктурой. Сюда не влезло, да и скудно тут с форматированием.

Поэтому камон сюда читать → https://two.su/zvubi

🛠 #devops #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
33
Привет. А у тебя спина белая 🥳

Недавно упоминал в чатике про цикл статей которые я написал про Podman, лови следующую.

Рекомендую ознакомиться, столько интересного и неочевидного раскопал. Возможно это подтолкнет тебя к переезду с docker в podman.


Healthcheck инструментами Podman → https://two.su/3kcvf

🛠 #devops #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
26
This media is not supported in your browser
VIEW IN TELEGRAM
Чтива вам нового написал 👉 https://two.su/3vqdm

🛠 #devops #dev #podman

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
32
Hugo за 30 секунд. Мой пайплайн на Gitea Actions

Наконец-то дошли руки до оптимизации пайпа для сборки Hugo в Gitea, да, есть куда еще стремиться, но там уже с жирными файлами нужно поработать.

Пост больше для энтузиастов и для тех кто хочет посмотреть, как всё происходит под капотом. Можешь взять мою болванку и под свои проекты переделать.

Читать: https://two.su/942is

🛠 #devops #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
24
Я написал свой текстовый редактор

🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤

Всё началось банально.
Мне нужен был редактор для Markdown-заметок — простой, быстрый, работающий без интернета. Я перебрал штук пять вариантов и ни один не подошёл до конца.

Typora — мой любимый по ощущениям, но он платный. Не дорого, но принципиально: хотел что-то, что можно поставить на любую машину без лицензий и аккаунтов. Notion — мощный, но завязан на облако. Отключи интернет — привет. Obsidian тащит за собой экосистему плагинов, и в итоге тратишь время на настройку, а не на написание. VS Code с расширениями — уже смешно, это как ехать на танке за хлебом.

Я хотел редактор, который просто открывается и работает. Без аккаунта, без подписки, без интернета.


Почему Tauri, а не Electron

Первый вопрос при выборе стека — чем рендерить. Electron — очевидный ответ, но я знал, чем это кончится: 200 мегабайт бинарника и 300 мегабайт RAM на старте. Для текстового редактора это абсурд.

Tauri использует системный WebView — на Linux это WebKitGTK, на Windows WebView2, на macOS WKWebView. Бэкенд на Rust. Итог: финальный бинарник весит меньше 10 мегабайт, а потребление памяти как у нативного приложения. Фронтенд — React, потому что мне с ним удобно.

Как это начиналось

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

Это классическая ловушка pet project: ты делаешь инструмент под себя, и он начинает расти ровно в сторону твоих личных болей.

Главная фича: история версий

Честно — это то, чего мне всегда не хватало в других редакторах. Не git, не ручные копии с суффиксом _v2_final_FINAL. Просто автоматические снимки, которые делаются сами — при открытии файла и периодически во время работы.

При каждом открытии qnote делает снимок текущего состояния. Дальше снимки появляются автоматически раз в несколько минут. В любой момент можно открыть список версий, посмотреть превью, сравнить и восстановить нужную. Всё хранится локально, никакого облака.

Это мелочь, которая спасает несколько раз в год в самый неподходящий момент. Ты что-то случайно удалил, закрыл файл, открыл снова — и понял это через час. Без истории версий текст просто потерян.


Остальные фичи, которыми горжусь

PDF-экспорт через typst — не через браузерный print, а через настоящий типографский движок. PDF генерируется в цветах текущей темы: тёмная тема — тёмный PDF, светлая — светлый.

OCR прямо в заметку: перетаскиваешь картинку, запускаешь распознавание через tesseract — и текст вставляется прямо в документ. Никакого копипаста между окнами.

Горячие клавиши на любой раскладке. Звучит как мелочь, пока не столкнёшься. В большинстве приложений шорткаты работают только на английской раскладке. Здесь — на любой.

Синхронный скролл в split-view: левая панель с источником и правая с превью прокручиваются вместе. Кажется очевидным, но удивительно, сколько редакторов этого не умеют нормально.

Что получилось в итоге

qnote — это не попытка убить Obsidian или конкурировать с Notion. Это редактор для тех, кто хочет просто писать: без плагинов, без аккаунтов, без подписок. Markdown с превью, история файлов, автосохранение, история версий, PDF-экспорт и OCR — всё что нужно, ничего лишнего.

Работает на Linux, Windows и macOS. Бинарник весит меньше 10 мегабайт. Открывается мгновенно.

автор проекта: @omibranch


Исходники открыты: https://github.com/Omibranch/qnote

🛠 #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
397
Настройка ZED. Отключаем лишнее.

В прошлом году мы с тобой активно обсуждали редактор ZED в этом посте. Тогда всплыло много нюансов и неоднозначных проблем связанных с его работой. Но вернувшись к этому IDE спустя несколько месяцев, я был приятно удивлён. 99% багов, которые были, теперь пофикшены.

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

Поэтому я полностью перепрыгнул с neovim на zed и уже несколько месяцев его активно использую в своих непотребствах. Но конечно-же предварительно, превратив в его в дружелюбный инструмент и избавив от лампочек и рюшечек.

Сегодня будем настраивать конфиг и прятать элементы интерфейса, чтобы получить минималистичный молоток. Избавимся от лампочек и кнопочек, но не в ущерб функциональности.

Читать продолжение: https://two.su/2zglw

🛠 #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
26
Сколько стоит фреймворк автоматизации

Я тут принёс тебе гостевой лонгрид, причём сразу в двух частях, потому что в одну всё уже физически не помещается.

Максим Братковский вещает, как с нуля собирал платформу автоматизации для десятилетнего Java-легаси: SOAP, REST, лицензии, конфиги, SNMP, SFTP, JMX и прочие радости, после которых ручной регресс длиной в пять недель начинает казаться котлом в аду.

В первой части будет много жабьего кунг-фу: CXF, JAX-WS, JAXB, Allure, генерация XML, параметризованные тесты и разбор граблей, которые пришлось собрать по дороге. По итогу из коллекции на 130 запросов выросла платформа с 2700 тестами, а пять недель ручного регресса превратились примерно в 30 минут автоматического прогона. Кайфушка!


Но это только половина истории. Вторую часть выкладываю сразу следом — там уже Docker, базы данных и дальнейшее развитие всей этой шайтан-машины.

Короче, материала получилось дофига, кода тоже дофига, практического опыта — ещё больше. Наливайте чай и погнали:

👉 Первая часть: https://two.su/yq61v

👉 Вторая часть: https://two.su/pjeqd

🛠 #qa #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
25
Напьются своих рафов лавандовых, а потом в жопы ебутся…

На фоне переезда на линукс, я знатно упоролся и ушел в сторону разработки. На этот раз я решил закрыть свои гештальты, которые преследовали меня последние несколько лет.

Короче сначала я запили плагин для Obsidian и даже удалось захуячить его в официальный стор плагинов самого обсидиана.

Штуку я назвал Cursor Layout Indicator. Суть такая, что рядом с курсором у тебя отображается маленький индикатор текущей раскладки. Выёбываться я не стал и сделал чисто для RU/EN.

Будь моя воля EN бы я с удовольствием выпилил, но увы, из песни слов не выкинешь.

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

Эта фича пока работает через жопу, но работает, править баги я пока не собираюсь, так что если хочешь, можешь пулреквестить, смержу.

Исходники, картинки тут 👉 https://two.su/ml9pj

На этом я не остановился!

Товарищи из mastodon, закинули импрувмент — а что если для всей ОС сделать подобное?

Хе! Чем бы дитя не тешилось. Яж на Niri подсел, ну вот и поперла разработка. Следом был выпущен плагин или хуй пойми че — niri-layout-cursor.

niri-layout-cursor показывает текущую раскладку прямо возле указателя мыши во всей сессии niri. Иконка в системном трее открывает локальные настройки цветов, размера и интеграции с Obsidian.

Интеграция с Обсидиан — если ты ранее ставил самый первый мой плагин, то оно не конфликтует, ну а если не ставил, то из коробки будет все работать.


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

Как ставить и т.п. смотрим тут 👉 https://two.su/fdomd

Не навяливаю, мож у кого-то такие же боли как у меня, потыкайте, всегда готов к диалогу, пулреквестам и т.п. Звездочки мне в хуй не упёрлись, НО не откажусь, так что заранее — спасибо! На халяву и уксус сладкий.

Такие дела!

🛠 #dev

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
35