PyLinux - Всё о Linux, Python и IT
10.4K subscribers
1.4K photos
39 videos
2 files
1.27K links
У нас ты найдешь 👇

- библиотеки и скрипты python
- инструменты linux
- полезный софт
- важнейшие новости из мира IT

Связь с админом: @ghostifix

Купить рекламу: https://telega.in/c/pylinux0

Архив: @pylinux0_archive
Download Telegram
🔜 Гиковские «часики»: уникальный гаджет с MIPS-процессором и Android на борту

Вскрываем редкие SmartQ-часы 2014 года на MIPS: три ОС, экономичный чипсет, крошечный аккумулятор и Android, который живёт на 280 мАч. Почему старые часы умнее и круче многих современных.

🖥 Перейти к статье

😎 PyLinux | #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤‍🔥2
➡️ Я сменил Arch на NixOS... и это просто потрясающе!

В данном ролике расскажу о всех преимуществах и фишках NixOS, которые удалось найти после перехода с Arch Linux.

📱 Ссылка на источник

😎 PyLinux | #videos
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤‍🔥2
Ну я

😎 PyLinux | #memes
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22
🧭 Диагностика DNS и кэша резолвера в 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 подтверждает, уходят ли запросы и приходят ли ответы
🟢 Сброс кэша часто решает странные, «застывшие» проблемы резолвинга

🗣 Набор особенно полезен при миграциях, смене провайдера, проблемах с VPN/DoH и непредсказуемом поведении /etc/resolv.conf.

😎 PyLinux | #linux
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3
🔜 The Shit — Скажи опечаткам НЕТ

Часто ли вы опечатываетесь во время работы в терминале? Уверен, что каждый хоть раз забывал sudo или вместо cd писал cs. Как-то раз увидел алиас fuck для добавления sudo к предыдущей команде. Я заинтересовался и начал копать.

🖥 Перейти к статье

😎 PyLinux | #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤‍🔥4
👩‍💻 Библиотека Python: bidict

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



Преимущества:


🟢 Быстрый двусторонний поиск ключ↔️значение
🟢 Гарантия уникальности и целостности соответствий
🟢 Удобные .inv и frozenbidict (обратный и неизменяемый виды)
🟢 Совместим со стандартным API dict и порядком вставки

✔️ Установка

pip install bidict


➡️ Ссылка на документацию

😎 PyLinux | #python_libs
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() запускает таймер в фоновом потоке.
🟢 Полезно для отложенного выполнения без блокировки основного потока

😎 PyLinux | #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁2
🔜 Реализация QUIC протокола через HAProxy

В статье покажу как собрать HAProxy 3.2+ для поддержки полного QUIC не в режиме совместимости, со сборкой OpenSSL 3.5+ с поддержкой QUIC и защитой 0-RTT от replay-атак.

🖥 Перейти к статье

😎 PyLinux | #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
🔏 Мониторинг срока истечения TLS-сертификатов в Linux

Истекающие 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)

➡️ Добавьте в crontab для ежедневной проверки:
0 8 * * * /path/to/tls_expiry_check.sh


🗣 Подходит для прод-сервисов, внутренних API и доменов — чтобы не словить внезапный 526/495 из-за просроченного сертификата


😎 PyLinux | #scripts
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 на основной ПК, стоило ли?

В этом ролике я наконец установил всеми долгожданный Arch Linux. По началу Арч показался мне каким-то слишком сложным и непостижимым, но кто мог знать, как сильно меня заинтересует данная тема?

📱 Ссылка на источник

😎 PyLinux | #videos
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤‍🔥2🗿2
🔜 Сказ о том, как мы приложение для падел-тенниса создавали

Как‑то раз двое ML‑щиков решили соединить свою любовь к компьютерному зрению и ракеточным видам спорта. Так родилась идея сделать систему видеоаналитики для падел‑тенниса.

🖥 Перейти к статье

😎 PyLinux | #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
🧭 Аудит и управление Linux capabilities (вместо SUID)

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 помогает печатать/декодировать маски и запускать команды с пониженными правами

🗣 Полезно при hardening серверов, аудите безопасности и минимизации прав системных утилит.

😎 PyLinux | #linux
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
👩‍💻 Библиотека Python: dacite

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



Преимущества:


🟢 Автоконвертация типов (str→int, str→datetime и т.п.) через type_hooks
🟢 Поддержка вложенных dataclass и Optional/Union полей
🟢 Значения по умолчанию и пропуск отсутствующих полей

✔️ Установка

pip install dacite


➡️ Ссылка на документацию

😎 PyLinux | #python_libs
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 — быстрый поиск утечек памяти

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()


Преимущества:

🟢 Встроено в Python — без сторонних зависимостей
🟢 Точная привязка к строкам + стек вызовов (настраиваемая глубина)
🟢 Сравнение снапшотов (compare_to) показывает, где реально выросла память
🟢 Можно фильтровать пути (исключать stdlib/site-packages) и мерить пиковое потребление

😎 PyLinux | #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
🔜 Деградация батареи в Linux

Расскажу, как в Linux увидеть здоровье батареи: утилиты, трюк в терминале/трее, пару скриптов, подводные камни. Кратко и реально полезно.

🖥 Перейти к статье

😎 PyLinux | #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤‍🔥5
🗑Обнаружение процессов с «удалёнными, но занятыми» файлами в Linux

Частая причина «внезапно заполненного диска»: лог-файл удалили или ротировали, а процесс всё ещё держит его открытым. Пространство не освобождается, пока дескриптор не закрыт.

Этот скрипт находит такие случаи и логирует крупные «висящие» файлы.


⚙️ Исходный код

#!/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"


🟢 Находит «висящие» (deleted) файлы, которые удерживают место
🟢 Помогает выявить неправильно настроенный logrotate/процессы без перезапуска
🟢 Есть безопасная (закомментированная) опция обнуления дескриптора через /proc/PID/fd/N

➡️ Добавьте в crontab для регулярной проверки:
*/15 * * * * /path/to/open_deleted_watch.sh


🗣 Полезно для прод-серверов с активным логированием (nginx, app-сервисы), где «пропавшее» место — частая головная боль.


😎 PyLinux | #scripts
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥7