TGViewer
Channel Public Channel
Bash Days | Linux | DevOps

Bash Days | Linux | DevOps

@bashdays

Авторский блог от действующего девопса

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

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

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Subscribers
23.6K
Photos
232
Videos
26
Links
781

Showing posts older than #1198 · Back to latest

Older Posts 19 shown
Post #1196 7.89K
Ща темку тебе интересную покажу…
ㅤ
Представим ситуацию — Писал ты код, который агрегирует файлы, рассчитывает их хеш по алгоритму MD5 и сохраняет в базу. Смысл - не сохранять повторно файл, который уже есть в базе.

То есть для каждого нового файла, оно считает MD5 и ищет его в базе, если такого хеша нет, значит файл новый.


Звучит пиздец банально. Ну дак вот.

В какой-то момент ты обнаруживаешь 2 файла, с разным содержимым, но с одним и тем же хешем. Да ёб твоб мать! А как такое возможно?

Возможно!

MD5 ― это криптографическая хеш-функция, придуманная в 1991 году Рональдом Ривестом. Её задача — брать произвольные данные и сжимать их в 128-битное число (32 hex-символа).


Как эта поебота работает описывать не буду, если интересно погугли, там это уже на 100500 разжевали и в рот положили.

Вернемся к баранам:

Создаём пару текстовых файлов:

printf 'TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak' > a.txt

printf 'TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak' > b.txt


Содержимое отличается одним символом (22 символ): В a.txt это A (ASCII 65, 0x41), в b.txt — E (ASCII 69, 0x45).

Проверим, что так оно и есть:

xxd -g 1 a.txt | sed -n '1,2p'
xxd -g 1 b.txt | sed -n '1,2p'


xxd создаёт представление указанного файла или данных, прочитанных из потока стандартного ввода, в виде шестнадцатеричных кодов.


Либо сразу выводим различия:

cmp -l a.txt b.txt

22 101 105


- 22 → позиция (22-й байт в файле)
- 101 (восьмеричное) → 0o101 = 65 (десятичное) = 0x41 = 'A'
- 105 (восьмеричное) → 0o105 = 69 (десятичное) = 0x45 = 'E'

cmp — утилита, которая сравнивает два файла побайтово и сообщает о первом отличии, если оно есть.


Ага, видим разницу.

Едем дальше, считаем MD5:

md5sum a.txt b.txt


И видим:

faad49866e9498fc1719f5289e7a0269  a.txt
faad49866e9498fc1719f5289e7a0269 b.txt


Вот это нихуясебе! Наверное md5sum гличнулся…

Проверяем по другому:

openssl dgst -md5 a.txt b.txt


MD5(a.txt)= faad49866e9498fc1719f5289e7a0269
MD5(b.txt)= faad49866e9498fc1719f5289e7a0269


Да нет, все правильно… Хеш одинаковый для разных файлов.

И что это всё значит?

Это наглядная коллизия и практическая атака на MD5 алгоритм.

На первый взгляд кажется, что «достаточно поменять один байт и можно случайно попасть в коллизию». Но на деле случайно это практически невозможно провернуть (вероятность ≈ 1 к 2^128).

То, что я показал в примере с A → E — это синтетическая пара, созданная криптографами специально с использованием дифференциального криптоанализа MD5.

То есть кто-то заранее просчитал, какой именно байт нужно поменять, чтобы скомпенсировать все внутренние изменения в состояниях MD5.

Практическая атака (2004–2008)

- В 2004 году Ван Сяоюнь с коллегами показали первую реальную коллизию для MD5 за считанные часы.
- В 2008 году был создан поддельный сертификат SSL с использованием MD5-коллизии (огромный скандал).

Вот с тех пор MD5 окончательно считается небезопасным.

Коллизии можно находить и создавать целенаправленно, поэтому не рекомендую использовать MD5 для проверки целостности, подписей, сертификатов и т.п.

Для этих задач лучше бери проверенный SHA-256 или что-то посильнее.

Вот такие пироги. Изучай!

🛠 #crypt #md5 #glitch
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1194 8.16K
Довольно часто нужно быстро загрузить файл построчно в массив.

Как делает мальчик:

lines=()
while IFS= read -r line; do
lines+=("$line")
done < file.txt

echo "Первая строка: ${lines[0]}"
echo "Всего строк: ${#lines[@]}"


Как делает мужчина:

mapfile -t lines < file.txt

echo "Первая строка: ${lines[0]}"
echo "Всего строк: ${#lines[@]}"


В первом варианте много кода, НО, работает везде. Во втором варианте, работает только в bash ≥4.0, но кода в разы меньше и не жрет CPU.

Совет: если пишешь скрипт под bash — всегда используй mapfile. Если нужен кросс-шелл (sh,dash,ash) — оставайся на цикле.


Либо расширь второй вариант и укажи:

#!/usr/bin/env bash


Это гарантирует, что твой скрипт выполнится именно через bash, а не через системный sh (который может быть dash, ash, ksh и т.п.).

env ищет bash в $PATH, так что это более переносимо, чем жёстко указывать #!/bin/bash

Ну и прицепом можешь добавить: set -euo pipefail

Это включение «строгого режима» в баше:

-e — выход из скрипта при любой ошибке (не игнорировать exit code ≠ 0).

-u — ошибка при обращении к неинициализированной переменной (не будет пустых значений «по-тихому»).

-o pipefail — пайплайны возвращают код ошибки первой упавшей команды, а не последней.

По итогу:

- Скрипт точно запустится под bash
- Ошибки не будут замалчиваться
- Сразу ловишь косяки

Удобно в CI/CD, где всё должно падать быстро и без хуйни.

grep foo file.txt | wc -l
echo $? # 0, даже если grep ничего не нашёл


set -o pipefail
grep foo file.txt | wc -l
echo $? # 1, потому что grep ушел по пизде


Такие дела, изучай.

🛠 #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1192 10.3K
Интровертизм в голове.
ㅤ
Сегодня подкормленный HR поделился формулой успеха.

Формула: На собесе хотят услышать, а на работе хотят увидеть.

Не стоит забивать на софт-скилы, хоть ты там ебать 100500 овердохуя умный лоб. Учись пиздеть (разговаривать). Даже если ты там прожженный интроверт — учись пиздеть, даже если тебе это не нравится.

Без пиздежа, ничего не получится. Ладно, получится, но ты сразу упрешься в потолок без перспектив.

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

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

А как её сделать? А ты придумай! Это твоя киллер-фича! Это твоё наследие (легаси). Если не можешь придумать — значит рановато пришел к этому боссу, откатись и качни свою жопку еще посильнее, откопай аммулет, высри бусину.

Короче как бы ты не хотел избегать людей, с ними придется общаться. Хотя бы для того, чтобы пройти HRа и задобрить его своим пиздежом.

Лично я терпеть не могу лично общаться, для меня целое испытание поехать поменять летнюю резину на зимнюю, либо кому-то позвонить и что-то узнать.

Со звонками ладно, делегировал, но есть вещи и дела где без тебя вопрос не решится. А если решится, то обязательно наебут.

Так что бери себя в руки, учись пиздеть (разговаривать), а если тебе это не нравится — терпи, улыбайся и разговаривай.

Интровертизм это в голове.

🛠 #рабочиебудни
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1190 10.4K
Ищем баги с помощью strace

Предположим, крутится у тебя в проде какое-то приложение, это приложение было разработано криворукими обезьянами — на отъебись.
ㅤ
По итогу продакшен начинает троить и выжирать процессорное время. Хуита!

Явно требуется профилирование, но мыж с тобой не обезьяны, поэтому изучать код не будем. А сразу вооружимся strace и посмотрим где-же узкое горлышко.

Запускаем:

strace -c python3 app.py


Через несколько секунд жмём Ctrl-C и получаем статистику:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ------
99.82 0.413251 8 49431 write
0.07 0.000291 32 9 mmap
0.05 0.000207 25 8 mprotect
0.03 0.000129 21 6 openat
0.02 0.000090 30 3 close
......


Хм… эта падла активно пользуется системным вызовом write().

time — процент процессорного времени, потраченного на вызов.
usecs/call — среднее время на один вызов (в микросекундах).
calls — сколько раз вызов был сделан.

Виновника определили. То есть приложение постоянно что-то куда-то пишет, тем самым забивая 99% процессорного времени.

Важно понимать: strace показывает только то время, которое ядро тратит на обработку системных вызовов. Поэтому значения могут отличаться от того, что покажет команда time:

$ time python3 app.py

real 0m7.412s
user 0m1.102s
sys 0m6.184s


Здесь sys совпадёт с тем, что мы видели через strace -c.

Ну и теперь даже без доступа к исходникам можно быстро понять, где «утекают» ресурсы.


Исходники у нас есть, давай посмотрим:

with open("tmp.txt", "w") as f:
while True:
f.write("Привет супчики! Привет от BashDays!")
f.flush()


Что тут не так:

Из-за flush() Python гонит строку сразу в файловую систему, без буферизации.

Как пофиксить:

# fixed.py
with open("tmp.txt", "w", buffering=1024*1024) as f:
while True:
f.write("Привет супчики! Привет от BashDays!\n")


Теперь данные будут сбрасывать пачками, так как мы указали буферизацию, которая равна 1MB.

Проверяем до фикса:

$ strace -c python3 app.py
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ------
99.8 0.413251 8 49431 write


Проверяем после фикса:

$ strace -c python3 app-fixed.py
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ------
98.9 0.072111 450 160 write


Количество вызовов write() резко сократилось, нагрузка на ядро упала.

Как костыль и быстрофикс — сойдёт! Повторюсь — мы с тобой не обезьяны, чтобы вникать в код разработчиков и что-то в нем «правильно» править.

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

Ну и на закуску фикс, который сделали разработчики:

import io

buffer = io.StringIO()

with open("tmp.txt", "w") as f:
while True:
buffer.write("Привет супчики! Привет от BashDays\n")
if buffer.tell() > 1024 * 1024:
f.write(buffer.getvalue())
f.flush()
buffer.seek(0)
buffer.truncate(0)


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

1. StringIO хранит текст в оперативной памяти.
2. Цикл гонит туда строки.
3. Когда накопится, например, 1 MB, содержимое сбрасывается в файл одной большой порцией (write + flush).
4. Буфер очищается и цикл продолжается.

Хуй знает на сколько это всё правильно, ну раз сделали через внутреннию буферизацию StringIO, значит так правильно.

Такие дела. Изучай.

🛠 #debug
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1188 11.5K
Всегда делай хорошо, плохо само получится!

Сегодня я припёр тебе Vim Master. Херабора для тех, кто хочет приручить Vim. Это не скучный тутор, а что-то вроде игрульки.

16 уровней, челледжи на скорость, бейджики, всё по красоте. Устанавливать ничего не нужно, работает прям в браузере. Но если очень хочется, то оно с открытым исходным кодом, можно и себе воткнуть при желании…
ㅤ
Есть два режима: Cheat Mode для новичков и Challenge Mode для тех, у кого писька уже подросла.

Потыкай на досуге, освежи мышечную память.

🛠 #games #vim
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1186 11.7K
Смотри какая лялька: ExplainShell
ㅤ
Сервис помогает понять, что делает shell команда и все её параметры и ключи. Вставляешь например команду из прошлого поста:

strace -s 200 -f -e trace=network,recvfrom task sync


И получаешь по ней полный разбор.

Работает достаточно просто, под капотом овер-дохуя ≈30к-man страниц. Штука оупенсорцная и лежит тут.

Логика работы:

1. Ман-страницы (разделы 1 и 8) загружаются и преобразуются в HTML.

2. Параграфы классифицируются – разделяются те, где описаны опции/флаги, и те, где нет.

3. Из отобранных параграфов извлекаются конкретные параметры и их описания.

4. Когда ты вводишь команду, она разбирается на синтаксическое дерево (AST) с помощью библиотеки bashlex.

5. Компоненты команды («узлы» AST) сопоставляются с параметрами, найденными в ман-страницах.

6. Отображаем на фронте.

Вообще штука довольно бесполезная, но в образовательных целях очень даже вменяемая. Как раз для персонажей которые нихуя не понимают как ориентироваться в man страницах.

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


Ладно, глядишь сгодиться в хозяйстве.

🛠 #services #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1185 11.1K
Вчера пишу сотруднику — Алёша, у нас прод какого-то хера 500ку каждые 3 минуты выплёвывает, чё у вас там происходит?

В ответ я получаю — даже не «нихуя», а реакцию (эмоджи) на мой вопрос, тупо ебать большой палец вверх. Типа — заебись!
ㅤ
А че заебись? Вы взяли это в работу, или заебись и вы очень рады, или что нахуй вообще происходит? Как это блядь интерпретировать?
ㅤ
Немного охуев от такого, я понимаю что я делаю так же, даже не задумываясь.

А делаю я по причине — нахуя ты мне 40 сообщений написал подряд? Ты думаешь я это читать буду? Нет! Я просто поставлю тебе сука лайк и дальше пойду делами своими заниматься.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Ну и еще ставлю «лайки», когда не хочу продолжать диалог, потому, что если напишешь текстом, то там ебанина начинается, про погоду, про проблемы в семье и т.п.


⚪ Выдели главное и напиши в 140 символов.

Про «приветы» уже много раз обсуждалось, для них отдельный котел.


Давай разберемся когда «лайк» уместен.

Короткий ответ без флуда. Если человек пишет: «Встреча завтра в 11», и ты ставишь 👍 — это знак, что ты прочитал и согласен.

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

Командная культура. В некоторых компаниях реакциями заменяют лишние «ок», «понял», «согласен», и это экономит время.

Когда не уместен:

Личное обращение. Если коллега задаёт вопрос «Можешь помочь с этим?» и получает только реакцию, это может восприниматься как уход от диалога (послали нахуй).

Неясный контекст. Если сообщение неоднозначное («Нужно срочно переделать отчёт»), то реакция в виде 👍 может вызвать вопросы: «Это согласие? Или сарказм?»

Разные ожидания. Для кого-то реакция = полноценный ответ, а для кого-то — «отписался, лишь бы ничего не сказать» (это мой случай).

Ну так вот:

Если реакция однозначно отвечает на запрос (например, подтверждение), то это вполне корректно.

Если у собеседника может остаться неопределённость, то реакция без слов выглядит как недоответ.

Важно учитывать корпоративные нормы: где-то реакциями активно пользуются и это часть культуры, а где-то люди ждут хотя бы короткого текста.

Можно сформулировать простое правило:

- Если сообщение требует только «понял/согласен/спасибо» — реакция окей;

- Если есть риск недопонимания или человек вложил усилие — лучше ответить словами.

Ну и повторюсь — не пиши 10-20-30 сообщений подряд, никто их читать не будет, сформулируй мысль одним коротким предложением и напиши.

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


Ладно, теперь твои мысли давай в комменты.

Как ты относишься к таким лайкам?

🛠 #рабочиебудни
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1184 10.2K
Всех с пятницей!

Меня частенько и «косвенно» связывали с компанией Selectel, я молча читал, слушал... И однажды подумал — а хули нет? Мало мне 3х работ, возьму еще одну.

И теперь я их официальный амбассадор.

Неспешно пишу статейки и интеграции. Предыдущий пост, как раз моих рук дело, пиздато же получилось!

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

Еще раз всех с пятницей, береги себя и своих близких. Ну и хороших тебе предстоящих выходных! Ура блядь, дождались!

🍻🍻🍻🍻🍻
Post #1182 10.9K
⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️

У девопса нет стейджа, только прод!


Продолжаем тему с taskwarrior, сегодня настраиваем единый сервер синхронизации на движке Taskchampion.
ㅤ
Будем компилировать бинарники, прикручивать nginx, хуячить напильником авторизацию, испытаем полный спектр эмоций и постараемся избежать сгоревших жоп.

Сюда не поместилось, поэтому по классике публикую в блоге 👇

➡️https://two.su/b9wmx


🛠 #рабочиебудни #gtd
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1180 11.1K
Я тут порой пишу для одного интернет журнала (не для хабра, в пизду его). Ну и встал вопрос, как передавать материалы заказчику, чтобы не в голом markdown, а уже сверстано, стили, картинки и т.п.
ㅤ
Вариантов было много, hugo, mkdocs и т.п. По итогу выбрал Writefreely, оно отлично подошло. Оупенсорц, написан на GO, ставится на свои сервера, работает шустро.

Аналог Телеграфа и Телетайпа, но на стероидах. Можно делать разные блоги под разные задачи. Есть черновики, доступ по паролю и т.п.

Короче доволен, базовые потребности закрыты, поднимается так:

services:
write-freely:
image: nephatrine/write-freely:latest
container_name: write-freely
environment:
TZ: America/New_York
PUID: 1000
PGID: 1000
ports:
- "127.0.0.1:8085:8080/tcp"
volumes:
- ./write-freely:/mnt/config


Способ не официальный. Потому что если делать, как в официальной документации, то как обычно — нихуя не работает из коробки. Классика!

Следующая проблема — картинки по ctrl+c/ctrl+v в writefreely не вставляются. Их нужно предварительно закончать и потом через ссылку вставлять. Дела…

По FTP я ебал это делать, поэтому был поднят Picsur.

Отличнейшее решение для любителей self-hosting. Аналог Imgur, но свой!

Запускается так:

services:
picsur:
image: ghcr.io/caramelfur/picsur:latest
container_name: picsur
ports:
- '127.0.0.1:8080:8080'
environment:
PICSUR_DB_HOST: picsur_postgres
volumes:
- ./storage:/picsur/storage
restart: unless-stopped
picsur_postgres:
image: postgres:17-alpine
container_name: picsur_postgres
environment:
POSTGRES_DB: picsur
POSTGRES_PASSWORD: picsur
POSTGRES_USER: picsur
restart: unless-stopped
volumes:
- picsur-data:/var/lib/postgresql/data
volumes:
picsur-data:


Тем более эта хератень отлично дружит со скриншотилкой ShareX которую я совсем недавно начал использовать.

Рекомендую, там ебать комбайн под все задачи, хранилища и хотелки.

В настройках Picsur генеришь json и двойным кликом интегрируешь с ShareX, ничего руками прописывать не нужно.


Как работает связка:


Делаешь скриншот, оно автоматически заливается в Picsur и в буфере обмена у тебя уже готовая ссылка для вставки в markdown. Удобно просто пиздец!

Такие дела. Вот и еще один полезный сервис в моей домашней лаборатории.

Потыкай, глядишь найдешь применение в своих задачках.

Кстати нашел ShareX под Linux, если кому надо.


🛠 #services #selfhosting #workflow
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1178 8.68K
Дегенеративные модели

Получил на выходные от одного провайдера отличнейшее предложение, от которого трудно отказаться.

ВЕЧНЫЕ СЕРВЕРА!
ㅤ
Как работает эта модель — ты один раз оплачиваешь условные 10-30-50-100к рублей и получаешь VPS навсегда, до конца мать его жизни.

Звучит достаточно вкусно, но в каждой бочке меда есть ложка дегтя.

Вечного ничего не бывает.

Ну так, вот:

Покупая такой сервер, сервер не становится твоей собственностью. Ты по-прежнему выполняешь условия оферты, которую ты конечно же НЕ прочитал и просто протыкал далее → далее.

Открываем оферту и читаем:

Исполнитель вправе изменять условия договора, в одностороннем порядке. Изменения вступают в силу с даты публикации на сайте. Если клиент не согласен, он может идти на хуй и сосать жопу.


Первый звоночек.

Я сталкивался с такой ситуацией в молодости и по глупости купил такой «вечный сервер» за 10к рублей. А через полгода с меня начали требовать абонентскую плату, а на мой ахуй мне было сказано — а вы оферту читали? Какие вопросы?

Пошел, почитал, а там черным по белому — извините, теперь ваш «вечный сервер» требует ежемесячной оплаты, потому что мы охуели и хотим больше денег.

Ладно, опыт получен. Прежде чем что-то бездумно покупать, вопрос нужно хотя бы немного заресерчить. И в 99% ты найдешь очень много подводных камней, о которых ты и не подозревал.

Второй звоночек.

Ладно, ты купил «вечный сервер» и потом хуяк! Скорость стала никакой. Идем в саппорт и требуем объяснений, в ответ получаем — ну дак в оферте же прописано.

При превышении 3ТБ трафика в месяц, для «вечных серверов», скорость пропускной полосы будет снижена до dialup’а. Вы превысили допустимы трафик, поэтому идете — нахуй и сосите жопу!

ВОТ ЭТО ПОВОРОТ!

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Третий звоночек.

Компания просто перестает существовать, либо ее банят за махинации и черные схемы. Всякое бывает. В этом случае ты просто теряешь доступ к своему «вечному серверу». Истории такие были, по крайней мере знаю две и оба раза я лишался доступа к серверам, благо были бэкапы.

Четвертый звоночек.

Для саппорта ты не приоритетный клиент, ты лох ебаный, которого уже облапошили, хуль на тебя время тратить, сам ебись со своими проблемами и «вечным сервером».

Выводы:

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

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

Всех под одну гребенку не ровняю, возможно на рынке и есть добросовестные поставщики услуг, респект им и уважуха! Но в любом случае «третий звоночек» никто не отменяет. Фактически «вечность» держится только на репутации и доброй воле провайдера.

Предложение о «вечных серверах» живёт только в маркетинговых материалах, но юридической фиксации в оферте нет. Получается, что «вечность» основана исключительно на доверии к провайдеру.

Если сервер нужен надолго, то «окупается» он через 12-36 месяцев. Ресурсы у сервера фиксированные, например 1Гб RAM сегодня ещё куда-нибудь сгодится, но через 3–5 лет такой сервер может быть слишком слабым. А апгрейд невозможен.


Гарантий нет, это инвестиция в надежность чужого бизнеса.

Так что если тебе кто-то предлагает «вечный сервер» — шли его нахуй!

🛠 #рабочиебудни #hosting #server
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1176 9.98K
Если ты выполняешь план, то тебе повысят план, а не зарплату!

Пытался вчера подружить taskwarrior и s3 для синхронизации, из коробки оно вроде как только с AWS работает.

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

sync.backend=s3
sync.aws.region=ru-7
sync.aws.bucket=taskwarrior
sync.aws.access_key_id=aed38518013b4ab
sync.aws.secret_access_key=992570bad57
sync.aws.endpoint=s3.ru-7.storage.selcloud.ru


Проверяю task sync init, хуй там плавал, ошибка:

unhandled error: dispatch failure: io error: error trying to connect: dns error: failed to lookup address information: Name or service not known: dns error: failed to lookup address information: Name or service not known: failed to lookup address information: Name or service not known


Мде… Всёж правильно, эндпоинт пингуется, курлится, телнетится. Описывать весь момент дебага не буду, но там конкретный такой - метод тыка был.

Ну раз обычный «метод тыка» не помогает, расчехляем strace!

strace -s 200 -f -e trace=network,connect,sendto,recvfrom task sync


Что делает команда:

-s 200 — печатать до 200 байт строковых аргументов (по умолчанию strace режет строки до 32 байт). Это важно, чтобы увидеть полный URL/hostname, который передаётся в syscalls.

-f — следить не только за основным процессом, но и за всеми дочерними (fork/clone)

-e trace=network, connect, sendto, recvfrom — ограничиваем вывод только сетевыми вызовами: socket, connect → создание сокетов и подключения (TCP/UDP). sendto / recvfrom → передача данных (обычно видно DNS-запросы, HTTP-заголовки и т.д.).

И в выхлопе находим строчку: taskwarrior.s3.ru-7.amazonaws.com.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
😞😔😟😕🙁☹️😣😖
😫😩🥺😢😭😤😠😡

Ну ёб твою мать! А нахуй я тогда все эти приседания с конфигом устраивал, если эта падла хуй положила и по task diagnostic никаких ошибок не вывело.

То есть настройка sync.aws.endpoint=… вообще не учитывается — клиент жёстко строит URL по схеме AWS.

Ну хоть проблему нашли. Strace все же достаточно пиздатый инструмент.

Отсюда вывод: с кастомным S3 напрямую taskwarrior работать не сможет. Даже если устроить подмену хостов или сделать хак через CNAME.

А как синхронизировать-то задачи? Ооо брат, я уже написал про это отдельный пост, чуть позже закину.

Хороших тебе выходных!

🛠 #strace #debug #taskwarrior
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1174 13.8K
Не уметь — не стыдно!

Вопрос из зала — есть ли какой-то тренажер или подобное, чтобы потыкать и понять как работает Kafka?

Конечно есть, у нас этого говна навалом!

Называется эта штука Kafka Visualisation.

Открываешь
и тыкаешь хоть до усрачки. С ходу нихуя не понятно, но если вникнуть, то легко поймешь принцип работы.

А еще есть подобная штука для RabbitMQ, потыкать тут.
ㅤ
Изучай! Всех с пятницей и береги себя!

🛠 #services
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1172 10.7K
Мне прилетела интересная задача.

🔤🔤🔥🔤🔤🔤🔤

ТЗ: Сервер без GUI, к нему подключают usb-диск с NTFS и начинается автоматическое архивирование. Логин не требуется, сообщения выдаются на tty1.

sudo apt install ntfs-3g # для монтирования ntfs


Использовать будем штатные средства udev + systemd .

1. Подключаем диск, и запоминаем UUID.

lsblk -f


sdc                                                                         
└─sdc1
ntfs FLASH
1234567890ABCDEF

здесь FLASH - метка диска 1234567890ABCDEF - UUID
ㅤ
создадим каталог для монтирования:

mkdir -p /media/usb_ntfs; chmod 777 /media/usb_ntfs


Дальше создаем 4 файла. Чтобы было проще, в каждом файле в начале коммент с названием файла.

После создания:

sudo systemctl daemon-reload


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

При подключении диска usb-диска срабатывает UDEV правило 99-usb-mount.rules и пытается запустить службу autousbbackup.service

autousbbackup.service пытается запустить media-usb_ntfs.mount, поскольку жестко он нее зависит.

Сама media-usb_ntfs.mount запустится только в том случае, если UUID диска будет 1234567890ABCDEF.

Если все условия совпадают, autousbbackup.service запустит скрипт autousbbackup.sh, внутри которого Вы напишите копирование или синхронизацию данных в каталог /media/usb_ntfs.

Если используется архивирование с чередованием дисков - просто сделайте у дисков одинаковые метки:

sudo umount /dev/sdXN # где /dev/sdXN  имя вашего NTFS-раздела.
sudo ntfslabel --new-serial=1234567890ABCDEF /dev/sdXN #задайте UUID


👆 Если в mount не указать опцию nofail система будет тормозить при загрузке.
👆 Запустить скрипт через UDEV даже в фоне не получится, поскольку система вырубит его через 5 сек.

#/etc/udev/rules.d/99-usb-mount.rules

SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="autousbbackup.service"


#/etc/systemd/system/media-usb_ntfs.mount

[Unit]
Description=Mount USB NTFS by UUID

[Mount]
What=/dev/disk/by-uuid/1234567890ABCDEF
Where=/media/usb_ntfs
Type=ntfs-3g
Options=defaults,big_writes,nofail,uid=1000,gid=1000

[Install]
WantedBy=multi-user.target


#/etc/systemd/system/autousbbackup.service

[Unit]
Description=Simple service autousbbackup
Requires=media-usb_ntfs.mount
After=media-usb_ntfs.mount

[Service]
Type=simple
ExecStart=/root/work/autousbbackup/autousbbackup.sh

[Install]
WantedBy=multi-user.target


#!/bin/bash
#/root/work/autousbbackup/autousbbackup.sh

declare -x PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
declare MOUNT_POINT=/media/usb_ntfs
declare TTY=/dev/tty1
declare DF='%(%Y%m%d-%H%M%S)T' #date format
declare LOG="$0.log"
exec &>"$LOG" # only one backup log
#exec &>>"$LOG" # all backups log
printf "$DF %s\n" -1 "START BACKUP"|tee "$TTY"
##############################################

sleep 3 # backup emulation

##############################################linux
printf "$DF %s\n" -1 "END BACKUP"|tee "$TTY"

#suicide, because service require mount point
systemd-mount --umount "$MOUNT_POINT"


🛠 #linux #bash
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1170 10.3K
Подводим итоги #балансбатл:
ㅤ
Все «лайки» пересчитаны, получилось так:

Первое место: Живое вмешательство. File descriptors и GDB (124 реакции) от @AlbDVPs. (Донат — баланс-борд)

Второе место: Хакаем inode и добываем свободное место (116 реакций), автор @clovus. (Донат — 5000р)

Третье место: Про логи и systemd-cat (110 реакция), автор @a_glumov (Донат — 3000р)

🍻 Принимайте наши поздравления! 🍻

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒

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


DevUps выбрал 2 поста, которые произвели на него впечатления.

Цитирую:

Кароче, я выбрал 2 статьи ... Закончилось место на диске? Или же закончились inode? и Живое вмешательство. File descriptors и GDB. Надо будет как-то решить как им бабок заслать, по 5к получается.


Как получить призы:

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

Всем кто принимал участие — огромнейшая благодарность, всем авторам постов лично жму руку, вы молодцы, что делитесь знаниями с другими. Это очень ценно! Спасибо вам ребята!

🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1169 12K
Здрасти. Так, у нас тут баланс-батл проходил, давай посмотрим еще раз на посты, которые ребята прислали.

😀😃😄😁😅😂🤣😊
😇🙂🙃😉😌😍🥰😘
😗😙😚😋😛😝😜🤪
🤨🧐🤓😎🤩🥳😏😒
ㅤ
Ну и кто пропустил или забыл поставить «лайк» — самое время.

- Про дампы и postgres (98)
- Астра линукс и неочевидные нюансы (89)
- Про бомжей и authentication key (53)
- Живое вмешательство. File descriptors и GDB (103)
- Сетевой квест и 22 дырка (92)
- Учим Docker в SNAT (69)
- Парсинг сетевого оборудования (16)
- Про логи и systemd-cat (94)
- Деградация батареи в Linux (37)
- Организация бекапов 1С (34)
- Рубрика «упоротые однострочники» (53)
- Хакаем inode и добываем свободное место (100)

В скобках общее количество лайков на текущий момент. Завтра подведем итоги и выдадим донаты.

Всем огромное спасибо за участие, вы все большие молодцы!

Если я проебался и что-то упустил, маякните, пожалуйста Максу, добавим в список.


🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1166 16.3K
Друзья и коллеги — С Днём Знаний!

Грех под это событие не напомнить про — Linux Factory.
ㅤ
За 1 месяц ты впитаешь необходимую базу, которая требуется, чтобы уйти с «завода» и вкатиться в айти на роль «девопс-инженера».

За год существования LF, через него прошло > 1000 человек. Больше половины учащихся успешно закончили курс и нашли свою первую хорошо оплачиваемую работу, которая им действительно нравится. LF это отличная инвестиция в своё будущее.


Короче. У меня появились свободные слоты и я готов взять на обучение еще 20-30 человек.

Цена временно снижена в 2 раза с 5000р до 3500р.

Ты можешь пропить эти деньги, а можешь вложиться с умом и уже через месяц получать вкусную ЗП. Всё зависит от тебя, готов ли ты сделать шаг и что-то изменить.


Что внутри

— Никакой воды, только нужная информация
— Исключительно бест-практики
— Более 40ка уроков и домашних заданий
— Познаешь силу «Инфраструктура как код»
— Разберешь с docker и git
— Научишься писать пайплайны
— Настроишь мониторинг и алерты
— И многое другое…

Киллер-фичи

— Я твой личный ментор 1x1 (никаких групповых чатов)
— Вдумчивое кодревью ДЗ (обоснованные замечания)
— Нет дедлайнов (учишься когда захочешь)
— Можешь не сдавать домашки (двойки не ставлю)
— Задачи со звездочкой (для любителей посложнее)
— Можно пропускать темы и брать только нужные
— Избавишься от синдрома самозванца

⚪ Содержание курса и всех сезонов описал тут.
⚪ Подробнее о курсе можешь почитать тут.
⚪ А для сомневающихся добавил страницу с отзывами.

Кстати можешь глянуть пару (1 и 2) открытых уроков и сделать выводы, подойдет тебе все это или нет.

Вписаться в курс: @tormozilla_bot

если бот не отвечает, отправь ему повторно /start

По всем вопросам можешь писать сюда: @linuxfactorybot
Post #1164 15.2K
Настройка и работа с Taskwarrior

Как бы я не шлялся словно «портовая шлюха» по разным таск-трекерам, так и вернулся к истокам Taskwarrior (далее TW).
ㅤ
Почему? Потому что в других таск-трекерах у меня спустя пару недель начинает образовываться какая-то лапша ебаная, прям как с ансиблом. Ну и по итогу на все это кладется болт.

Из коробки TW выглядит достаточно хуёва, как и все остальное в Linux. Но я его допилил с помощью конфигов, избавился от лишнего и оставил только, то что действительно нужно мне.

Пост получился длинным, поэтому идем дочитывать в блог 👇

🅰️🅰️🅰️🅰️🅰️🅰️🅰️
https://two.su/684om
🅰️🅰️🅰️🅰️🅰️🅰️🅰️

🛠 #рабочиебудни #gtd
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Post #1163 11K
Вчера в посте я упомянул конфиги iptables лишь для части дистрибутивов, Alex эту ситуацию в комментариях подметил верно.
ㅤ
Давай посмотрим что в других дистрибутивах происходит.

Debian / Ubuntu

Основной пакет → iptables-persistent / netfilter-persistent

/etc/iptables/rules.v4
/etc/iptables/rules.v6


RHEL / CentOS / Rocky / Alma (iptables-services)

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Fedora (новые версии)

По умолчанию использует firewalld (поверх nftables). Если ставишь iptables-services:

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Arch Linux / Manjaro

Из коробки iptables не сохраняет правила, обычно юзеры делают сами:

/etc/iptables/iptables.rules
/etc/iptables/ip6tables.rules


OpenSUSE / SLES

По умолчанию тоже firewalld, если ставить пакет iptables, правила обычно хранят в:

/etc/sysconfig/iptables


Astra Linux (Смоленск, Орёл и др. редакции)

Астра базируется на Debian, поэтому у неё схема как у Debian/Ubuntu:

/etc/iptables/rules.v4
/etc/iptables/rules.v6


РЕД ОС (RedOS)

RedOS базируется на RHEL/CentOS, поэтому там всё по «редхэту»:

/etc/sysconfig/iptables
/etc/sysconfig/ip6tables


Вроде основное осветил, если что-то проебал, забыл, затроил — пиши в комменты, поправим.

А вообще при возможности пользуйся облачным фаерволом, если страшно конфигурять iptables или руки растут из жопы.

🛠 #linux #security #iptables
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →