Вскрываем редкие SmartQ-часы 2014 года на MIPS: три ОС, экономичный чипсет, крошечный аккумулятор и Android, который живёт на 280 мАч. Почему старые часы умнее и круче многих современных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤🔥2
В данном ролике расскажу о всех преимуществах и фишках NixOS, которые удалось найти после перехода с Arch Linux.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22
🧭 Диагностика DNS и кэша резолвера в Linux
Когда «ничего не открывается», часто виноват DNS. Эти команды помогут понять, какой резолвер используется, почему домен не резолвится, и как очистить кэш.
📌 Полезные команды
🟢
🟢
🟢
🟢
🟢 Сброс кэша часто решает странные, «застывшие» проблемы резолвинга
🗣 Набор особенно полезен при миграциях, смене провайдера, проблемах с VPN/DoH и непредсказуемом поведении /etc/resolv.conf.
😎 PyLinux | #linux
Когда «ничего не открывается», часто виноват DNS. Эти команды помогут понять, какой резолвер используется, почему домен не резолвится, и как очистить кэш.
# Показать активную DNS-конфигурацию systemd-resolved (сервера, домены, кэш)
resolvectl status
# Узнать, какой сервер реально отвечает за конкретный домен
resolvectl query example.com
# Проверить, на что указывает /etc/resolv.conf (stub 127.0.0.53 или прямые NS)
readlink -f /etc/resolv.conf
cat /etc/resolv.conf
# Базовая диагностика через dig (A/AAAA/CNAME/NS)
dig example.com +noshort
dig A example.com +short
dig AAAA example.com +short
dig NS example.com +short
# Сравнить ответы от разных публичных резолверов
dig @8.8.8.8 example.com +short
dig @1.1.1.1 example.com +short
# Трассировка делегации (где ломается резолв)
dig +trace example.com
# Обратная зона (PTR)
dig -x 8.8.8.8 +short
# Проверка DNSSEC
dig example.com +dnssec +multi
# Проверить порядок источников имени в NSS (files/dns/systemd и т.д.)
grep '^hosts:' /etc/nsswitch.conf
getent hosts example.com
# Проверка доступности порта 53 (UDP/TCP) до внешнего резолвера
nc -zu 8.8.8.8 53
nc -vz 8.8.8.8 53
# Посмотреть реальные DNS-запросы (полезно при «тихих» сбоях)
sudo tcpdump -i any port 53 -n -vv -c 10
# Сброс кэша systemd-resolved и статистика
sudo resolvectl flush-caches
resolvectl statistics
# Если используется nscd/Unbound — перезапуск/сброс кэша (по ситуации)
sudo systemctl restart nscd 2>/dev/null || true
sudo unbound-control flush_zone example.com 2>/dev/null || true
resolvectl
показывает, какой DNS реально используется и как кэшируетсяdig +trace
помогает найти точку, где ломается делегацияgetent
учитывает порядок в nsswitch.conf
— ближе к «поведению приложений»tcpdump
подтверждает, уходят ли запросы и приходят ли ответыPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3
Часто ли вы опечатываетесь во время работы в терминале? Уверен, что каждый хоть раз забывал
sudo
или вместо cd
писал cs
. Как-то раз увидел алиас fuck
для добавления sudo
к предыдущей команде. Я заинтересовался и начал копать.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤🔥4
bidict — это двунаправленный словарь для Python: быстрый поиск как по ключам, так и по значениям, с гарантией уникальности пар и удобным обратным отображением через
.inv
.Идеальна для задач «A ↔️ B»: коды и имена, ID и алиасы, HTTP-статусы и описания.
from bidict import bidict, frozenbidict
# Двунаправленное отображение
colors = bidict({'red': '#f00', 'green': '#0f0', 'blue': '#00f'})
print(colors['red']) # ➔ #f00
print(colors.inv['#0f0']) # ➔ green (обратный вид)
# Добавление пары остается консистентным в обе стороны
colors['yellow'] = '#ff0'
print(colors['yellow'], colors.inv['#ff0']) # ➔ #ff0 yellow
# Попытка дублировать значение — ошибка (сохранение биекции)
try:
colors['scarlet'] = '#f00'
except ValueError as e:
print(e) # ➔ Value already present: '#f00'
# Неизменяемая версия для безопасного шаринга
immutable = frozenbidict({'a': 1, 'b': 2})
# immutable['c'] = 3 # ➔ TypeError
➕ Преимущества:
pip install bidict
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🌚1
Позволяет выполнить функцию через заданный промежуток времени в отдельном потоке. Полезно для отложенных операций, напоминаний, автоматических задач.
import threading
def say_hello():
print("Привет через 5 секунд!")
# Запускаем функцию через 5 секунд
timer = threading.Timer(5.0, say_hello)
timer.start()
print("Ожидаем...")
threading.Timer(delay, function)
создаёт таймер с задержкой delay
в секундах..start()
запускает таймер в фоновом потоке.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁2
В статье покажу как собрать HAProxy 3.2+ для поддержки полного QUIC не в режиме совместимости, со сборкой OpenSSL 3.5+ с поддержкой QUIC и защитой 0-RTT от replay-атак.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Истекающие TLS-сертификаты = внезапные падения сайтов и API. Этот скрипт опрашивает хосты, парсит дату истечения сертификата и логирует предупреждения, если осталось мало дней
#!/bin/bash
# Список хостов (можно указывать порт: host:port, по умолчанию 443)
DOMAINS=("example.com" "api.example.com:443" "github.com")
THRESHOLD_DAYS=30
LOG_FILE="/var/log/tls_expiry_check.log"
echo "🔐 Проверка TLS-сертификатов... $(date)" | tee -a "$LOG_FILE"
for entry in "${DOMAINS[@]}"; do
host=${entry%:*}
port=${entry#*:}
[[ "$host" == "$port" ]] && port=443
# Получаем дату истечения (notAfter) у сервера
end_date=$(echo | timeout 10 openssl s_client -servername "$host" -connect "$host:$port" 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null | sed 's/^notAfter=//')
if [[ -z "$end_date" ]]; then
echo "❌ Не удалось получить сертификат для $host:$port" | tee -a "$LOG_FILE"
continue
fi
end_ts=$(date -d "$end_date" +%s 2>/dev/null)
now_ts=$(date +%s)
if [[ -z "$end_ts" ]]; then
echo "❌ Не удалось распарсить дату истечения для $host:$port: $end_date" | tee -a "$LOG_FILE"
continue
fi
days_left=$(( (end_ts - now_ts) / 86400 ))
if (( days_left <= THRESHOLD_DAYS )); then
echo "⚠️ $host:$port — истекает через $days_left дн. (до $end_date)" | tee -a "$LOG_FILE"
else
echo "✅ $host:$port — $days_left дн. до истечения (до $end_date)" | tee -a "$LOG_FILE"
fi
done
echo "🔚 Проверка завершена." | tee -a "$LOG_FILE"
openssl s_client + x509
вытягивает дату истечения без лишних зависимостейhost:port
, таймаут защищает от «зависших» коннектовTHRESHOLD_DAYS
для ранних предупреждений/var/log
— удобно для алертов (email/Telegram/Slack)0 8 * * * /path/to/tls_expiry_check.sh
🗣 Подходит для прод-сервисов, внутренних API и доменов — чтобы не словить внезапный 526/495 из-за просроченного сертификата
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28👍5🔥4🤔1
В этом ролике я наконец установил всеми долгожданный Arch Linux. По началу Арч показался мне каким-то слишком сложным и непостижимым, но кто мог знать, как сильно меня заинтересует данная тема?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤🔥2🗿2
Как‑то раз двое ML‑щиков решили соединить свою любовь к компьютерному зрению и ракеточным видам спорта. Так родилась идея сделать систему видеоаналитики для падел‑тенниса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
На своëм канале он уже осветил такие темы, как:
— Что такое ядро Linux и зачем оно нужно?
— Как защитить свой Linux от взлома
— Как создать собственный ISO-образ в Linux
— Linux и управление пакетами
— Процессы в Linux и отладка зависаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
🧭 Аудит и управление Linux capabilities (вместо SUID)
Capabilities позволяют выдавать бинарям точечные привилегии (например, только «сырые сокеты») вместо полного
📌 Полезные команды
🟢
🟢
🟢
🗣 Полезно при hardening серверов, аудите безопасности и минимизации прав системных утилит.
😎 PyLinux | #linux
Capabilities позволяют выдавать бинарям точечные привилегии (например, только «сырые сокеты») вместо полного
root
через SUID. Этот набор команд поможет быстро проверить, где используются capabilities, назначать/снимать их и запускать процессы с урезанными правами.# Установить инструменты (Debian/Ubuntu)
sudo apt install -y libcap2-bin
# Посмотреть назначенные capabilities у конкретного бинаря
getcap /usr/bin/ping
# Рекурсивно найти все файлы с capabilities в системе
sudo getcap -r / 2>/dev/null
# Заменить SUID на точечные права: убрать SUID у ping и выдать CAP_NET_RAW
sudo chmod u-s /bin/ping
sudo setcap cap_net_raw+ep /bin/ping
getcap /bin/ping # проверить
# Сбросить все capabilities у файла
sudo setcap -r /path/to/bin
# Посмотреть текущие capabilities процесса (вашей оболочки)
capsh --print
# Декодировать маску эффективных прав текущего процесса
capsh --decode=$(grep CapEff /proc/$$/status | awk '{print $2}')
# Узнать эффективные права конкретного PID (пример для nginx)
PID=$(pidof nginx); grep Cap(Prm|Eff|Inh) /proc/$PID/status
# Запустить команду с принудительно урезанными правами (без CAP_NET_ADMIN)
sudo capsh --drop=cap_net_admin -- -c 'your_command_here'
# Полный список и описание всех capabilities
man 7 capabilities
Capabilities
позволяют отказаться от опасного SUID и выдать только нужные привилегииgetcap/setcap
— быстрый аудит и точечная настройка прав бинарейcapsh
помогает печатать/декодировать маски и запускать команды с пониженными правамиPlease open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
dacite — это утилита для преобразования словарей (например, JSON) в экземпляры
dataclass
с поддержкой вложенных структур, конвертации типов, значений по умолчанию и хуков для кастомного парсинга.Идеальна для безопасной загрузки конфигов и API-ответов прямо в строго типизированные модели dataclass.
from dataclasses import dataclass
from typing import Optional, List
from datetime import datetime
from dacite import from_dict, Config
@dataclass
class Profile:
created_at: datetime
tags: List[str]
@dataclass
class User:
id: int
name: str
is_active: bool = True
profile: Optional[Profile] = None
raw = {
"id": "42",
"name": "Alice",
"profile": {
"created_at": "2025-08-01T10:00:00Z",
"tags": ["admin", "team"]
}
}
# Хук для преобразования ISO-строки в datetime
cfg = Config(type_hooks={
datetime: lambda s: datetime.fromisoformat(s.replace("Z", "+00:00"))
})
user = from_dict(User, raw, config=cfg)
print(user) # ➔ User(id=42, name='Alice', is_active=True, profile=Profile(...))
print(user.profile.created_at) # ➔ 2025-08-01 10:00:00+00:00
➕ Преимущества:
type_hooks
dataclass
и Optional/Union
полейpip install dacite
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15😁6
tracemalloc
— встроенный инструмент, который показывает, какие строки кода «раздувают» память. Снимайте снапшоты до/после участка кода и сравнивайте их — увидите точные источники роста RAM, со стеком вызовов.import tracemalloc
tracemalloc.start(25) # глубина стека до 25 кадров
snap_before = tracemalloc.take_snapshot()
# --- подозрительный участок ---
do_something_heavy()
# ------------------------------
stats = tracemalloc.take_snapshot().compare_to(snap_before, 'lineno')
for stat in stats[:5]:
print(stat) # file:line: size=… (+Δ), count=… (+Δ)
tracemalloc.stop()
➕ Преимущества:
compare_to
) показывает, где реально выросла памятьPlease open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
Расскажу, как в Linux увидеть здоровье батареи: утилиты, трюк в терминале/трее, пару скриптов, подводные камни. Кратко и реально полезно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤🔥5
Частая причина «внезапно заполненного диска»: лог-файл удалили или ротировали, а процесс всё ещё держит его открытым. Пространство не освобождается, пока дескриптор не закрыт.
Этот скрипт находит такие случаи и логирует крупные «висящие» файлы.
#!/bin/bash
LOG_FILE="/var/log/open_deleted_files.log"
MIN_SIZE_MB=100 # Порог размера «висящего» файла для отчёта (в МБ)
echo "🗑 Поиск открытых удалённых файлов... $(date)" | tee -a "$LOG_FILE"
# Требуется lsof; лучше запускать с sudo для полноты картины
if ! command -v lsof >/dev/null 2>&1; then
echo "❌ Не найден lsof. Установите пакет lsof." | tee -a "$LOG_FILE"
exit 1
fi
# Выдаёт: PID|FD|SIZE(bytes)|CMD|USER|NAME
sudo lsof +L1 -nP 2>/dev/null | awk '
NR>1 {
cmd=$1; pid=$2; user=$3; fd=$4; size=$7;
name="";
for (i=9;i<=NF;i++) name=name $i " ";
gsub(/^[ \t]+|[ \t]+$/,"",name);
gsub(/[a-zA-Z]+$/,"",fd); # оставить только номер FD
gsub(/[^0-9]/,"",size); if (size=="") size=0; # очистить SIZE/OFF
print pid "|" fd "|" size "|" cmd "|" user "|" name
}' \
| while IFS='|' read -r PID FD BYTES CMD USER NAME; do
MB=$(( (BYTES + 1024*1024 - 1) / (1024*1024) ))
if [ "$MB" -ge "$MIN_SIZE_MB" ]; then
echo "⚠️ PID:$PID USER:$USER CMD:$CMD FD:$FD SIZE:${MB}MB NAME:${NAME}" | tee -a "$LOG_FILE"
# 🔽 Опционально: аккуратно освободить место, обнулив дескриптор (НЕ по умолчанию!)
# Использовать осторожно и только для безопасных логов, НИКОГДА для БД/критичных файлов.
# if [ -e "/proc/$PID/fd/$FD" ]; then
# : > "/proc/$PID/fd/$FD" && echo "🧹 Освобождён дескриптор /proc/$PID/fd/$FD" | tee -a "$LOG_FILE"
# fi
fi
done
echo "✅ Проверка завершена." | tee -a "$LOG_FILE"
/proc/PID/fd/N
*/15 * * * * /path/to/open_deleted_watch.sh
🗣 Полезно для прод-серверов с активным логированием (nginx, app-сервисы), где «пропавшее» место — частая головная боль.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥7