TGViewer
Channel Public Channel
PyLinux - Всё о Linux, Python и IT

PyLinux - Всё о Linux, Python и IT

@pylinux0

У нас ты найдешь 👇

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

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

РКН: https://clck.ru/3NywZG
Subscribers
11K
Photos
1.9K
Videos
48
Links
1.7K
Recent Posts 20 shown
Post #2864 540
🗂 100 ГБ файлов, тысячи копий. Найдём дубликаты с помощью Python

На диске могут годами лежать одинаковые архивы, фотографии, бэкапы и документы под разными именами. Сравнивать имена бессмысленно. А вот SHA-256 позволяет искать файлы с одинаковым содержимым, даже если они называются по-разному.

⚙️ Небольшой скрипт, который обходит папку, вычисляет хеши и выводит группы дубликатов.

from pathlib import Path
from collections import defaultdict
import hashlib
import sys

def sha256(path):
h = hashlib.sha256()
with path.open("rb") as f:
for chunk in iter(
lambda: f.read(1024 * 1024), b""
):
h.update(chunk)
return h.hexdigest()

def find_duplicates(folder):
sizes = defaultdict(list)

for path in Path(folder).rglob("*"):
if path.is_file() and not path.is_symlink():
try:
sizes[path.stat().st_size].append(path)
except OSError:
pass

for size, paths in sizes.items():
if len(paths) < 2:
continue

hashes = defaultdict(list)
for path in paths:
try:
hashes[sha256(path)].append(path)
except OSError:
continue

for group in hashes.values():
if len(group) > 1:
print(f"\nDuplicate group ({size} bytes):")
for path in group:
print(f" {path}")

find_duplicates(sys.argv[1])


Сохраняем как duplicates.py и запускаем:

python duplicates.py ~/Downloads


📌 Что здесь интересного?

🔵 Сначала файлы группируются по размеру. Разный размер — значит, содержимое точно отличается.
🔵 SHA-256 вычисляется только для файлов с совпадающим размером.
🔵 Чтение идёт блоками по 1 МБ, поэтому не нужно загружать огромные файлы целиком в RAM.
🔵 Скрипт ничего не удаляет — только показывает совпадения.

💡 Нюанс: одинаковый SHA-256 практически гарантирует совпадение в обычных задачах поиска дубликатов, но для строгой побайтовой проверки перед удалением ценных данных стоит дополнительно сравнить содержимое файлов.

Также стоит учесть, что символические ссылки пропускаются, а несколько жёстких ссылок на один inode могут попасть в результаты как отдельные пути.

Сохраняй и ставь — 👍


😎 PyLinux | #python #scripts
  • 👍 8
  • 🔥 7
Post #2863 1.11K
Это проходил каждый... 🫡

😎 PyLinux | #memes
  • 😁 31
  • 💯 10
  • 👍 4
Post #2862 1.25K
👻 Файл удален, но Linux всё ещё его хранит

Представим: процесс пишет логи в файл:

./server > server.log 2>&1


Файл разросся до нескольких гигабайт. Мы его удаляем:

rm server.log


Затем проверяем:

ls server.log


Файла нет. Но проверив свободное место:

df -h


Увидим, что место не освободилось.

💬 Почему так?

В Linux удаление файла через rm не обязательно означает немедленное удаление его данных с диска.

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

Найти такие файлы можно так:

sudo lsof +L1


Например:

server  1842  root  3w  REG  8,1  5.2G  0  /var/log/server.log (deleted)


Вот куда исчезли наши 5.2 GB. Процесс 1842 продолжает работать с уже удалённым файлом.

⚠️ Именно поэтому иногда бывает ситуация:

Удалили огромный лог — du его больше не видит — а df показывает, что диск всё ещё забит.


Освободить место можно, например, корректно перезапустив процесс:

sudo systemctl restart myservice


После закрытия последнего файлового дескриптора ядро сможет окончательно освободить занятое пространство.

💡 Поэтому если сервер внезапно показывает 100% занятого диска, хотя больших файлов вы найти не можете — попробуйте:

sudo lsof +L1


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

😎 PyLinux | #linux
  • 👍 19
  • 🔥 8
Post #2860 1.72K
🛡 Файл, который не может удалить даже root

В Linux права rwx — далеко не последний уровень защиты файла.

Есть атрибут immutable, который запрещает изменять, переименовывать и удалять файл:

sudo chattr +i important.conf


Теперь попробуем:

sudo rm important.conf


Получим:

rm: cannot remove 'important.conf': Operation not permitted


И это несмотря на sudo.

То же самое произойдёт при попытке изменить файл:

sudo nano important.conf


Сохранить изменения не получится.

🔍 Проверить атрибуты файла:

lsattr important.conf


Увидите примерно:

----i--------- important.conf


Буква i и означает immutable.

Чтобы снова разрешить изменения:

sudo chattr -i important.conf


💡 Где пригодится?

Например, чтобы случайно не удалить или не перезаписать важный конфиг:

sudo chattr +i /etc/myapp/config.conf


Но есть нюанс: root всё ещё контролирует систему — он может снять атрибут через chattr -i. Поэтому это не защита от администратора, а дополнительный барьер от случайных изменений и некоторых сценариев повреждения файлов.

😎 PyLinux | #linux
  • 👍 19
  • ❤‍🔥 3
  • 🔥 2
Post #2859 2.24K
🌚

😎 PyLinux | #memes
  • 😁 20
  • 🤣 8
  • 🔥 3
Post #2858 1.99K
🚀 Я наконец-то запускаю свой магазин — Invenstory

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

И сегодня там появился первый полноценный релиз — VPS Starter Kit.

Идея появилась из знакомой ситуации:
код написал, а когда нужно взять чистый VPS и выкатить туда проект — начинается магия из SSH, Docker, портов, доменов, HTTPS и конфигов.


Если отдельные команды тебе уже знакомы, но нет понимания всего процесса от чистого сервера до работающего проекта — VPS Starter как раз про это.

Это практический тренажёр, который проходишь на своём реальном сервере.

✔️ За 11 актов ты:

🔵 подключишься и настроишь SSH
🔵 защитишь сервер
🔵 развернёшь Docker + PostgreSQL
🔵 подключишь домен и HTTPS
🔵 настроишь backup и восстановление
🔵 специально сломаешь диск, БД и Caddy
🔵 найдёшь причины и починишь всё сам
🔵 в финале развернёшь свой проект без пошаговой инструкции

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

Перед релизом я дал финальную версию первому тестировщику и ещё допилил несколько моментов по его обратной связи.

Именно такого практикума мне самому не хватало, когда я начинал разбираться с VPS.

💸 На запуске −25%: 1492 ₽ вместо 1990 ₽ до 1 октября

👉 Пройти VPS Starter со скидкой →
  • 👍 5
  • 🔥 5
Post #2857 1.79K
📱 Создание MCP‑серверов на FastMCP: 7 ошибок, которых стоит избегать

В этой статье автор расскажет о 7 распространенных ошибок, которые разработчики допускают при создании MCP‑серверов на FastMCP: от отсутствующих аннотаций инструментов и слабой обработки ошибок до ответов, расходующих слишком много токенов, и пробелов в безопасности.

Также обсуждаются конкретные способы исправления каждой ошибки.

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

😎 PyLinux | #python #articles
  • 👍 6
  • 🔥 2
Post #2856 1.59K
А как еще помочь то... 🌚

😎 PyLinux | #memes
  • 😁 25
  • 💯 3
  • ❤‍🔥 1
  • 🔥 1
Post #2854 1.55K
👀 Автоматически запускаем команду при изменении файла

Во время разработки часто приходится повторять один и тот же цикл: изменил код, сохранил, перезапустил скрипт, снова изменил и снова перезапустил. В Linux это можно автоматизировать небольшой утилитой — entr.

entr следит за файлами и выполняет указанную команду каждый раз, когда один из них изменяется.

➡️ Например, автоматически запускаем Python-скрипт после сохранения:

echo main.py | entr python3 main.py


Изменили main.py — entr заметил событие и скрипт запустился заново.

➡️ Можно следить сразу за всем проектом:

find . -name "*.py" | entr python3 main.py


Теперь изменение любого .py файла вызовет новый запуск.

💬 А если нужно перезапускать уже работающий процесс?

Для этого есть -r:

find . -name "*.py" | entr -r python3 main.py


При изменении файла entr завершит предыдущий процесс и запустит его заново.

➡️ Работает это не только с Python. Например, можно автоматически запускать тесты:

find . -name "*.py" | entr pytest


Пересобирать проект:

find src/ -type f | entr make


Или реагировать на изменение конфигурации:

echo nginx.conf | entr nginx -t


📦 Установка

sudo apt install entr


entr следует классической философии Unix: получает список файлов через stdin, следит за ними и делает ровно одну вещь — запускает команду, когда что-то изменилось.


Если было полезно, сохраняй и ставь — 👍

😎 PyLinux | #linux #tools
  • 👍 18
  • 🔥 5
Post #2853 1.33K
🔐 Почему passwd может менять /etc/shadow без root?

В Linux хеши паролей пользователей хранятся в /etc/shadow. Попробуем посмотреть его содержимое:

cat /etc/shadow


От обычного пользователя получим:

cat: /etc/shadow: Permission denied


Всё логично — файл защищён и доступен только привилегированным процессам.

Но при этом любой пользователь может выполнить:

passwd


и спокойно изменить свой пароль. Новый хеш каким-то образом попадёт в тот самый /etc/shadow, к которому у пользователя нет доступа.

💬 Так откуда берутся права?

Посмотрим на passwd:

ls -l /usr/bin/passwd


Увидим примерно следующее:

-rwsr-xr-x 1 root root ... /usr/bin/passwd


Здесь самое интересное — s вместо x в правах владельца:

rws


Это специальный бит SUID (Set User ID).

Когда запускается исполняемый файл с SUID, процесс получает effective UID владельца этого файла. А владельцем /usr/bin/passwd является root.

Получается:
user → passwd → effective UID 0 → /etc/shadow


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

🔎 А сколько таких файлов вообще есть в системе?

Проверить можно одной командой:

find / -perm -4000 -type f 2>/dev/null


Она найдёт исполняемые файлы с установленным SUID-битом.

И здесь начинается интересная часть с точки зрения безопасности: если SUID-программа принадлежит root и при этом содержит уязвимость или настроена неправильно, её повышенные привилегии потенциально могут стать способом выполнить действия от имени root.

Так что неприметная s среди прав файла — далеко не просто ещё один символ.


Если интересен такой формат, сохраняй и ставь — 👍

😎 PyLinux | #linux #security
  • 👍 30
  • 🔥 6
Post #2851 1.83K
Сохраняйте, чтоб не забыть 😄

😎 PyLinux | #memes
  • 😁 20
  • 💯 2
Post #2849 1.86K
🛠 moreutils — коллекция утилит, которых не хватает в coreutils

В Linux есть знаменитый набор coreutils: cp, mv, cat, sort, wc и десятки других команд. Но со временем выяснилось, что некоторых полезных инструментов там всё же не хватает.

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

📌 Что внутри

🔵 sponge — читает весь ввод, а затем записывает результат в файл.

Обычная конструкция может сломать файл:
cat file.txt | sed 's/foo/bar/g' > file.txt


А так работает безопасно:
cat file.txt | sed 's/foo/bar/g' | sponge file.txt


🔵 ts — добавляет временные метки к выводу команды.
ping 1.1.1.1 | ts


Результат:
Sep 21 20:15:03 64 bytes from ...


Полезно для логирования и отладки.

🔵 vidir — массовое переименование файлов через текстовый редактор.
vidir


Откроется список файлов. Меняем имена как обычный текст, сохраняем — переименование выполнится автоматически.

🔵 parallel — запускает несколько задач одновременно.
seq 10 | parallel wget https://site/file{}


Удобно для пакетной обработки данных.

🔵 pee — отправляет один поток сразу нескольким командам.
cat log.txt | pee "grep ERROR" "wc -l"


Аналог tee, но для команд.

✔️ Установка

sudo apt install moreutils


Если было полезно, сохраняй и ставь — 👍

😎 PyLinux | #linux
  • 👍 17
  • 🔥 4
Post #2848 1.78K
📱 Jellyfin — домашний Netflix для фильмов и музыки

Jellyfin — полностью бесплатный и открытый медиасервер: заливаешь фильмы, сериалы и музыку, а он сам подтягивает обложки, описания и раздаёт всё на ТВ, телефон и браузер.

📦 Установка через Docker

Самый чистый способ — контейнер. Создаём docker-compose.yml:

services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: uid:gid
ports:
- 8096:8096/tcp
- 7359:7359/udp
volumes:
- /path/to/config:/config
- /path/to/cache:/cache
- type: bind
source: /path/to/media
target: /media
- type: bind
source: /path/to/media2
target: /media2
read_only: true
restart: 'unless-stopped'


Поднимаем:
docker compose up -d


Если не хочется докер:

curl -s https://repo.jellyfin.org/install-debuntu.sh -O && \
curl -s https://repo.jellyfin.org/install-debuntu.sh.sha256sum -O && \
sha256sum -c install-debuntu.sh.sha256sum

sudo bash install-debuntu.sh


📁 Правильная структура папок

Это ключевой момент — Jellyfin сам находит обложки и описания, если файлы названы правильно:
media/
├── Movies/
│ └── Inception (2010)/
│ └── Inception (2010).mkv
└── Shows/
└── Breaking Bad/
└── Season 01/
└── Breaking Bad S01E01.mkv


Год в скобках и понятные имена — залог того, что метаданные подтянутся автоматически.

⚙️ Первая настройка

🔵 Открываем http://IP-сервера:8096 и проходим мастер:
🔵 Создаём администратора (логин + пароль)
🔵 Добавляем медиатеки: указываем тип (Фильмы / Сериалы / Музыка) и папку
🔵 Выбираем язык метаданных

Jellyfin начнёт сканировать и подтягивать обложки.


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

😎 PyLinux | #tools
  • 👍 14
  • ❤‍🔥 5
  • 🔥 3
  • 🤣 1
Post #2847 2.3K
У кого было? ☕️

😎 PyLinux | #memes
  • 😁 27
  • 🔥 5
  • 💯 3
Post #2845 2.38K
🖥 script — записываем сессию терминала в файл

script — это встроенная утилита, которая запускает новую shell-сессию и пишет всё, что в ней происходит, в файл. Работаем как обычно, а в конце получаем полный лог: команды, их вывод, ошибки.

📌 Полезно для:

🔵 Документирования действий на сервере
🔵 Записи инструкций с реальным выводом
🔵 Логирования troubleshooting-сессии
🔵 Подготовки туториалов и демо

⚡️ Простейший пример

Запускаем:

script session.log


Теперь всё, что мы делаем, пишется в session.log.

ls -la
echo "Hello from script"
cat /etc/hostname


Когда закончили — выходим:

exit


Сессия завершается, лог сохранён.

➡️ Смотрим результат:

cat session.log


Там будет весь вывод.

⚠️ Важно

script
не записывает скрытые пароли через sudo, но записывает всё остальное.

😎 PyLinux | #linux
  • 👍 17
  • ❤‍🔥 4
Post #2844 2.61K
😄

😎 PyLinux | #memes
  • 😁 26
  • 🤣 6
  • 🔥 4
Post #2842 2.21K
📱 typing.Protocol — интерфейс без наследования

Позволяет описывать «контракты» методов/атрибутов и принимать любые объекты, которые им соответствуют — без общей базы/миксинов. Упрощает плагины, адаптеры и тесты.

from typing import Protocol

class Logger(Protocol):
def log(self, message: str) -> None:
...

def process(logger: Logger):
logger.log("Запуск процесса")


Теперь process() принимает любой объект, у которого есть подходящий метод log() — наследоваться от Logger не нужно.

class FileLogger:
def log(self, message: str) -> None:
print(f"[FILE] {message}")

class TelegramLogger:
def log(self, message: str) -> None:
print(f"[TG] {message}")

process(FileLogger())
process(TelegramLogger())


💡 Это называется структурной типизацией: важен не класс объекта, а его структура.

🔥 Почему это удобно:

🔵 меньше связности — не нужны общие базовые классы
🔵 mypy / pyright проверяют контракт ещё до запуска
🔵 удобно писать плагины и адаптеры
🔵 проще подменять зависимости в тестах
🔵 можно использовать Generic и TypeVar для сложных API

📌 Где особенно полезен: плагины, API-клиенты, хранилища, логгеры, стратегии и тестовые реализации.

😎 PyLinux | #python #tips
  • ❤‍🔥 9
  • 👍 2
Post #2841 2.07K
🤔 Почему я перешёл с Zorin OS на Omarchy 4

В этом видео автор рассказывает, почему перешёл с Zorin OS на Omarchy 4 и как этот дистрибутив изменил его представление о том, какой вообще может быть операционная система.

Omarchy 4 — это дистрибутив Linux на базе Arch и Hyprland с упором на быстрый keyboard-driven workflow, глубокую кастомизацию и работу в терминале. Систему можно максимально настроить под себя, в том числе с помощью AI-агентов.


Рассмотрим установку и кастомизации, интеграции с AI-агентами и о том, как они помогают менять окружение под конкретные привычки и задачи. И, конечно, подведём итог и разберёмся, кому стоит задуматься о переходе на Omarchy.

🎥 Ссылка на видео

😎 PyLinux | #linux #videos
  • 👍 9
  • 🔥 2
  • 🤣 2
  • 🤔 1
  • 🗿 1
Post #2840 2.12K
И так каждый день... 🥲

😎 PyLinux | #memes
  • 😁 10
  • 🔥 4
  • 💯 3
Older posts →

About this channel

How can I read @pylinux0 without a Telegram account?
TGViewer shows the public web preview Telegram publishes for PyLinux - Всё о Linux, Python и IT: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does PyLinux - Всё о Linux, Python и IT have?
PyLinux - Всё о Linux, Python и IT (@pylinux0) has 11K subscribers on Telegram, refreshed roughly every 30 minutes.
Does PyLinux - Всё о Linux, Python и IT know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
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 →