NetworkAdmin.ru – Telegram
NetworkAdmin.ru
4.75K subscribers
226 photos
25 videos
2 files
499 links
Авторский блог про сетевое и системное администрирование.

Сайт: networkadmin.ru
Реклама: @dad_admin
Биржа: https://telega.in/c/networkadminru
Download Telegram
📈 Как сымитировать нагрузку в linux без сторонних утилит

Иногда при настройке мониторинга на малонагруженных серверах нужно протестировать графики и дашборды, добавив искусственную нагрузку. Устанавливать отдельные утилиты вроде stress или stress-ng не всегда хочется. К счастью, это можно сделать встроенными средствами - через dd, sha1sum, yes, /dev/zero, /dev/urandom и другие.

▪️ Нагрузка на диск и CPU одновременно. Сжимаем случайные данные и пишем во временный файл:


while true; do
dd if=/dev/urandom count=30M bs=1 | bzip2 -9 > /tmp/tempfile
rm -f /tmp/tempfile
done


/dev/urandom → нагрузка на диск
bzip2 -9 → нагрузка на CPU

count=30M - объем данных
-9 - максимальная степень сжатия


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

▪️ Только диск: оценка скорости записи. Быстрое тестирование производительности диска:


sync; dd if=/dev/zero of=/tmp/tempfile bs=1M count=1024; sync


Вывод покажет, с какой скоростью пишутся 1 ГБ данных.

▪️ Только CPU: простейшие варианты.

Нагрузка на одно ядро:


dd if=/dev/zero of=/dev/null


Параллельная нагрузка на несколько ядер:


cpuload() {
dd if=/dev/zero of=/dev/null &
dd if=/dev/zero of=/dev/null &
}
cpuload; read; pkill dd


Либо:


sha1sum /dev/zero


Для нескольких ядер:


seq 4 | xargs -P0 -n1 timeout 10 sha1sum /dev/zero


▪️ Простая нагрузка в пространстве ядра


seq 4 | xargs -P0 -n1 timeout 10 yes > /dev/null


Запускается yes, который генерирует бесконечный вывод. Отлично грузит CPU в режиме ядра.

▪️ Загрузка памяти. Скрипт на Python, резервирующий 1 ГБ RAM:


python3 -c 'a="a"*1024**3; input()'


Можно менять объем, изменяя 1024**3.

#linux #monitoring

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
11
Как работает LACP и зачем использовать агрегирование каналов

Когда одного сетевого интерфейса мало - приходит время объединять их в «команду». Это называется агрегация каналов, и один из самых популярных способов реализовать ее - протокол LACP (Link Aggregation Control Protocol).

LACP - часть стандарта IEEE 802.3ad. Он позволяет объединить несколько физических интерфейсов в один логический (LAG - Link Aggregation Group), который операционная система и приложения видят как один.

🌟 Зачем это нужно?

📍 Повышение пропускной способности;
📍 Повышение отказоустойчивости (если один порт отваливается - остальные продолжают работать);
📍 Балансировка нагрузки между портами.


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

📍 LACP автоматически обнаруживает, какие интерфейсы можно объединить
📍 Обе стороны (свитч и хост) договариваются, какие порты войдут в LAG
📍 Если кабель выпал или порт упал - он просто исключается из группы, ничего не рушится


▪️ Настройка в Linux. Пример для двух интерфейсов ens33 и ens34:

1️⃣ Устанавливаем ifenslave (если нужно):


sudo apt install ifenslave


2️⃣ Настраиваем bonding-мод LACP (mode 4): В /etc/network/interfaces или аналогичном конфиге:


auto bond0
iface bond0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves ens33 ens34
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-xmit-hash-policy layer3+4


3️⃣ Важно! На свитче тоже нужно включить LACP на соответствующих портах (обычно называются channel-group или LAG в интерфейсе).

⭐️ Несколько нюансов:

📍 LACP работает только при поддержке с обеих сторон (сервер + свитч)
📍 LAG не удваивает скорость для одного TCP-соединения, но позволяет нескольким соединениям распределяться по разным каналам
📍 Лучше всего работает с хешированием по Layer3+4 (IP + порт)


#network #LACP

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
🛡 Как корректно отслеживать и логировать выполнение Ansible-плейбуков

Если вы регулярно работаете с Ansible - важно не только писать рабочие плейбуки, но и контролировать, когда, кем и как они были запущены. Особенно, если в вашей инфраструктуре Ansible используется как часть CI/CD или централизованного управления.

1️⃣ Включаем логирование в конфиге Ansible. В файле /etc/ansible/ansible.cfg (или в локальной копии ansible.cfg) пропишите:


[defaults]
log_path = /var/log/ansible.log


Ansible начнет писать все свои действия в указанный файл. Убедитесь, что у пользователя, запускающего Ansible, есть права на запись.

2️⃣ Используйте теги и переменные для понятности. Добавляйте теги к задачам:


- name: Установка nginx
apt:
name: nginx
state: present
tags:
- web
- nginx


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

3️⃣ Логируйте переменные, хосты, результаты. Для отладки - полезно писать значения переменных в лог:


- name: Показываем значение переменной
debug:
var: some_variable


Также можно логировать hostname, пользователя и дату запуска, добавляя кастомную задачу:


- name: Логируем запуск
shell: echo "{{ ansible_date_time.iso8601 }}: {{ inventory_hostname }} - {{ ansible_user }}" >> /var/log/ansible_run.log


4️⃣ Используйте Ansible Callback Plugins. Для более глубокого логирования можно подключить callback-плагины.

Например, json или yaml:


[defaults]
stdout_callback = yaml


А если хотите логировать в файл в формате JSON, можно использовать:


[defaults]
callback_whitelist = json
stdout_callback = json
log_path = /var/log/ansible-json.log


5️⃣ Храните вывод выполнения с ansible-playbook. При запуске:


ansible-playbook site.yml | tee -a /var/log/ansible-run-$(date +%F-%T).log


Так у вас будет отдельный лог под каждое выполнение.

6️⃣ Интеграция с CI/CD и мониторингом. Если Ansible запускается через GitLab, Jenkins, Drone и прочее - обязательно сохраняйте артефакты выполнения и возвращайте статус завершения. Также можно отправлять результаты выполнения в телегу через webhook после ansible-playbook.

#ansible #security

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤢 HDD или SSD? Как быстро определить тип диска в linux

Если вы не уверены, установлен ли в вашем сервере SSD или классический жесткий диск, вот простой способ это проверить без сторонних утилит:


cat /sys/block/sda/queue/rotational
1

cat /sys/block/sde/queue/rotational
0


Значение 1 означает HDD (с вращающимся шпинделем), 0 - SSD (без вращения).

🌟 Как это работает?

Это файловый интерфейс к параметрам устройств в Linux. Поле rotational говорит ядру, как обращаться с устройством:

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

Поэтому для SSD оптимизация очереди часто не нужна - это влияет на планировщик ввода-вывода.

А что в виртуалках?

Виртуальные машины чаще всего по умолчанию видят виртуальные диски как HDD, даже если физический диск - SSD. Проверка rotational внутри VM может вернуть 1.

Пример: Proxmox. Чтобы "объяснить" виртуалке, что она на SSD:

📍 В настройках диска активируйте опцию SSD Emulation.
📍 После этого значение rotational станет 0.

Это не критично, но желательно - для корректной работы планировщика в гостевой ОС.

Trim в VM: работает или нет? Появляется логичный вопрос: если включить SSD-эмуляцию, будет ли работать TRIM в виртуалке?

Нет, сам по себе флаг SSD не включает поддержку TRIM.

Чтобы TRIM работал в гостевой ОС:

📍 Виртуальный диск должен поддерживать discard.
📍 Должна быть включена поддержка в гипервизоре (например, в proxmox - флаг Discard).
📍 Гостевая ОС должна использовать файловую систему, поддерживающую TRIM (ext4, btrfs и т.д.) и выполнять его (например, через fstrim или discard в /etc/fstab).

#linux #storage

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112
This media is not supported in your browser
VIEW IN TELEGRAM
Неожиданно стал верующим человеком

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁292
🐶 Фейковый root в linux: зачем он нужен и когда пригодится

Наткнулся на утилиту с говорящим названием - fakeroot. Оказывается, она довольно старая и есть в стандартных репозиториях большинства дистрибутивов. Программа запускает окружение, в котором приложения думают, что работают с root-доступом. На самом деле вы остаетесь обычным пользователем, а fakeroot просто перехватывает системные вызовы (через LD_PRELOAD) и подменяет информацию.

▪️ Установка:


sudo apt install fakeroot


Запускаем:


fakeroot


В консоли появляется как будто бы root@host, и все поведение напоминает работу с sudo su.

▪️ Пример


touch test.txt
ls -la test.txt


Внутри fakeroot получите:


-rw-r--r-- 1 root root 0 ...


Выйдя из него:


-rw-r--r-- 1 username username 0 ...


То есть реально файл принадлежит обычному пользователю, но fakeroot создаёт иллюзию root-доступа.

Зачем это вообще нужно?

Основное назначение - создание архивов и пакетов, содержащих файлы от имени root, без необходимости работать под настоящим root.

Например, вы собираете .deb-пакет с системными файлами или конфигами, которые в реальной установке должны принадлежать root. С помощью fakeroot вы можете задать нужные владельцы/права без прав суперпользователя.

🌟 Также будет полезно, если:

📍 Вы хотите пропустить ошибки доступа к файлам при архивации/копировании;
📍 Программа ругается на отсутствие root-доступа, но для вашей задачи это некритично;
📍 Вы работаете на CI/CD или в изолированном окружении без root-доступа

#fakeroot #linux

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
Не до всех доходит

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁33👍8🗿5💊2🍾1
🚫 Блокировка стран по IP

Если нужно ограничить доступ к сервису из определенных стран (например, через iptables или nginx), потребуется актуальный список IP-сетей по географии.

Готовые списки можно взять отсюда. Например, список сетей России здесь
Каждая строка - отдельная подсеть, удобно парсить скриптами.

🛠 Пример скрипта: создаем IP whitelist через ipset


#!/bin/bash

# Удаляем старый список (если был)
ipset destroy whitelist 2>/dev/null

# Создаем новый
ipset create whitelist hash:net

# Скачиваем нужные страны (пример: некоторые страны СНГ)
wget -O netwhite http://www.ipdeny.com/ipblocks/data/countries/{ru,kz,by,uz,kg,am,az,ge,tj}.zone

# Добавляем подсети в ipset
for ipnet in $(cat netwhite); do
ipset add whitelist $ipnet
done

# Проверка
ipset save whitelist > whitelist-export.txt
echo "IP-сети загружены в ipset"


Теперь подключаем список к iptables:


iptables -A INPUT -m set --match-set whitelist src -p tcp --dport 80 -j ACCEPT


⚠️ Важно: если сетей больше ~2000, не загружайте их напрямую в iptables - используйте ipset, иначе правила займут много памяти и ресурсов.

▪️ Альтернатива - готовые конфиги под разные сервисы

Сервис: https://www.ip2location.com/free/visitor-blocker

Можно сразу получить правила под apache, nginx, iptables, mikrotik и другие.

#iptables #ipset

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13
📄 Разделение логов по уровням и сервисам с systemd-journald

Если вы работаете на современном дистрибутиве linux, то почти наверняка используете systemd, а значит - и journald для сбора логов. Это система логирования, которая умеет куда больше, чем просто показывать логи командой journalctl. Сегодня - о том, как удобно фильтровать и разделять логи по уровню важности (info, warning, error и т.д.) и сервисам, чтобы быстро находить нужную информацию.

▪️ Фильтрация логов по юниту. Чтобы посмотреть логи конкретного сервиса:


journalctl -u nginx.service


Добавьте -b для вывода только с текущей загрузки:


journalctl -u ssh.service -b


▪️ Логи по уровню важности. Вы можете указать минимальный уровень важности:


journalctl -p err # Только ошибки и критичнее


Список уровней (от менее к более важным):

0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug


Пример: показать все warning и выше от sshd:


journalctl -u ssh.service -p warning


▪️ Ограничение по времени. Чтобы не утонуть в огромных логах:


journalctl --since "1 hour ago"
journalctl --since "2025-09-18" --until "2025-09-19 03:00"


▪️ Разделение логов по каталогам. По умолчанию journald пишет в /run/log/journal (в RAM), если /var/log/journal отсутствует. Чтобы сохранять логи между перезагрузками:


mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald


▪️ Настройка persist-логирования и лимитов. В файле /etc/systemd/journald.conf можно настроить:


Storage=persistent
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=7day


После правок - перезапустите journald:


systemctl restart systemd-journald


▪️ Глубокие фильтры. Вывести только ошибки от ядра:


journalctl _TRANSPORT=kernel -p err


Фильтр по PID:


journalctl _PID=1234


По имени бинарника:


journalctl _COMM=nginx


#logs #systemd

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135
👤 Как перенести пользователей между серверами с сохранением UID, групп и паролей

Иногда возникает необходимость перенести локальных пользователей с одного linux-сервера на другой - при миграции, клонировании окружений или настройке тестовой копии. Но важно не просто скопировать имена, а сохранить UID, GID, пароли и групповые принадлежности, чтобы избежать конфликтов и сохранить доступы.

🌟 Что нужно сохранить

/etc/passwd - основная информация о пользователях
/etc/shadow - пароли пользователей
/etc/group - группы
/etc/gshadow - пароли групп (редко)
/home/ - директории пользователей и их данные (если нужно)


1️⃣ Фильтрация нужных пользователей. На проде часто много системных аккаунтов. Чтобы перенести только нужных людей, можно отфильтровать пользователей с UID > 1000 (или 500 - зависит от дистрибутива):


awk -F: '$3 >= 1000 && $3 < 60000 { print $1 }' /etc/passwd


2️⃣ Экспорт записей. Выполните на исходном сервере:


#пользователей
awk -F: '$3 >= 1000 && $3 < 60000' /etc/passwd > users.passwd

#пароли
awk -F: 'NR==FNR{a[$1]; next} $1 in a' users.passwd /etc/shadow > users.shadow

#группы
awk -F: '$3 >= 1000 && $3 < 60000' /etc/group > users.group
awk -F: 'NR==FNR{a[$1]; next} $1 in a' users.passwd /etc/gshadow > users.gshadow


Скопируйте файлы users.passwd, users.shadow, users.group, users.gshadow на новый сервер.

3️⃣ Импорт на новом сервере. На новом сервере:

Сначала делаем резервные копии оригинальных файлов:


cp /etc/passwd /etc/passwd.bak
cp /etc/shadow /etc/shadow.bak
cp /etc/group /etc/group.bak
cp /etc/gshadow /etc/gshadow.bak


Затем добавляем новые записи (убедитесь, что нет конфликтов UID/GID):


cat users.passwd >> /etc/passwd
cat users.shadow >> /etc/shadow
cat users.group >> /etc/group
cat users.gshadow >> /etc/gshadow


4️⃣ Копирование домашней директории


rsync -avz /home/ user@newserver:/home/


Не забудьте про владельцев:


chown -R username:groupname /home/username


Проверка


getent passwd имя_пользователя
id имя_пользователя
su - имя_пользователя


🌟 Если вы переносите пользователей с sudo-доступом, убедитесь, что их записи присутствуют в /etc/sudoers или /etc/sudoers.d/.

#linux #users

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
📍 Анализ открытых портов и процессов в Linux

Когда сервер начинает вести себя подозрительно - например, появляется неизвестный открытый порт, нестандартный трафик или система тормозит - важно быстро выяснить: что за процесс, что он слушает и какие соединения установлены. Для этого можно использовать связку: ss, lsof и каталог /proc.

1️⃣ ss - быстро и точно о сетевых соединениях. Современная замена netstat, работает быстрее и точнее:


ss -tulnp


Покажет все TCP/UDP-порты, которые слушают процессы:

-tuln - TCP/UDP, слушающие, без разрешения имен
-p - имя процесса и PID

Пример:


LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))


2️⃣ lsof - подробности о дескрипторах и файлах. lsof позволяет заглянуть глубже в то, что именно открыт у процесса:


lsof -i :80


Выведет все процессы, использующие порт 80.


lsof -nP -iTCP -sTCP:LISTEN


Список всех TCP-сервисов, которые слушают порты.

3️⃣ /proc - внутренняя кухня процесса. Для изучения процесса изнутри можно обратиться к /proc/<PID>/fd - тут видны все открытые дескрипторы:


ls -l /proc/1234/fd


Покажет, какие файлы, сокеты и каналы открыт у процесса с PID 1234.

Для конкретного сокета:


ls -l /proc/1234/fd | grep socket


Также можно посмотреть cmdline:


cat /proc/1234/cmdline


4️⃣ Комбинируем все вместе. Узнаем, какой процесс слушает порт:


ss -tulnp | grep :8080


Получаем его PID → проверяем, какие соединения установлены:


lsof -p 1234 -i


Лезем в /proc/1234/ за подробностями:

/fd - дескрипторы
/status - ресурсы и права
/cmdline - команда запуска

#linux #network

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123
Та самая задачка на 5 минут

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁141
This media is not supported in your browser
VIEW IN TELEGRAM
10–11 сентября встречаемся на IT Elements — конференции, сделанной айтишниками для айтишников.

Площадка в третий раз станет точкой притяжения тех, кто реально делает ИТ в России. В этом году в фокусе — критически важные направления отрасли: инфраструктура, сети, кибербезопасность, данные и AI/ML.

Тематические треки:

▪️Инфраструктура: антихрупкость в архитектуре, инфраструктура для ИИ, отечественные решения, защита, стратегии, ключевые платформы (гибридные облака, БД, хранилища), контейнеры и Kubernetes.

▪️Сети: будущее сетей, сервис, ЦОДы для ИИ, VXLAN, балансировка, UC, управление.

▪️Кибербезопасность: киберустойчивость, импортозамещение NGFW, безопасная разработка, управление уязвимостями, мониторинг инцидентов, киберучения.

▪️Данные и ИИ: Data-driven-инфраструктура, миграция на LakeHouse, Big Data, автоматизация разработки, MES-оптимизация, корпоративные GPT-ассистенты и агенты, ESM-системы.

Формат: офлайн в Москве или онлайн.

Участие бесплатное, по предварительной регистрации.
⚙️ Управление оперативной памятью без перезагрузки

Знали ли вы, что в linux можно отключать и включать оперативную память без перезагрузки? Главное условие - отключаемые блоки памяти должны быть свободны.

▪️ Для начала - полезная команда:


lsmem


Она покажет, как ядро видит вашу память - в виде блоков. Например:


RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000f7ffffff 3.9G online yes 0-30
0x0000000100000000-0x0000000107ffffff 128M online yes 32


Блоки - по 128M. Всего - 4G.

▪️ Пример: хотим временно отключить 1G памяти:


chmem -d 1G


▪️ Или выборочно - блоки с 22 по 29:


chmem -d -b 22-29


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

▪️ Проверяем результат:


lsmem


Теперь 1G памяти offline. Осталась активной - 3G.

▪️ Возвращаем память обратно:


chmem -e 1G


#linux #RAM

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73
👁 Проверка MTU и проблемы с фрагментацией пакетов

MTU (Maximum Transmission Unit) - это максимальный размер пакета, который может быть передан без фрагментации. Неправильно настроенное значение MTU может привести к странным сетевым багам: страницы не грузятся до конца, SSH висит, API-запросы обрываются и т.д.

▪️ Как проверить MTU между двумя узлами?

Один из самых надежных способов - использовать ping с флагом запрета фрагментации (в Linux - -M do):


ping -c 4 -M do -s 1472 8.8.8.8


Почему 1472? 1472 байта данных + 28 байт заголовков (IP + ICMP) = 1500 байт - стандартное MTU для Ethernet.


Если MTU меньше - вы получите ошибку:


Frag needed and DF set


Уменьшайте значение -s по шагам, пока ping не пройдет - это и будет максимальный размер без фрагментации.

▪️ Альтернатива - tracepath:


tracepath 8.8.8.8


Этот инструмент сам определяет, на каком узле в пути начинается фрагментация.

▪️ Настройка MTU:

Постоянная настройка через netplan (Ubuntu):


ethernets:
eth0:
dhcp4: yes
mtu: 1400


Для временного изменения:


ip link set dev eth0 mtu 1400


▪️ Проблемы с фрагментацией чаще всего появляются:

При использовании VPN и туннелей (WireGuard, IPsec, OpenVPN)
В облачных сетях с Jumbo Frames
При неправильно настроенном MSS (Maximum Segment Size)


Для TCP можно использовать iptables для автоматической коррекции MSS:


iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu


#ping #MTU

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Please open Telegram to view this post
VIEW IN TELEGRAM
👎11😁8🤡1
📱 Быстрый запуск PHP-приложений без веб-сервера

Многие не знают, что в PHP есть встроенный веб-сервер. Он отлично подходит для тестов, разовых задач или работы с локальными утилитами - без необходимости устанавливать и настраивать Apache или Nginx.

📍 Пример - запуск phpMyAdmin без веб-сервера

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

1️⃣ Установите PHP и модуль mysqli:


apt install php php-mysqli


2️⃣ Скачайте и распакуйте phpMyAdmin:


wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
tar xzvf phpMyAdmin-5.2.1-all-languages.tar.gz


3️⃣ Запустите встроенный веб-сервер:


cd phpMyAdmin-5.2.1-all-languages
php -S 172.27.50.130:8080


4️⃣ Перейдите в браузере по адресу: http://172.27.50.130:8080

Если конфигурация еще не создана - перейдите в /setup/, настройте подключение к серверу баз данных и сохраняйте конфиг. Если все уже настроено - сразу входите в интерфейс.

Когда работа закончена, просто остановите сервер (Ctrl+C). Все HTTP-запросы будут видны прямо в консоли - удобно для отладки.

#PHP #phpMyAdmin

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112
📎 Понимаем атрибуты файлов в Linux: stat, mtime, ctime, atime, birth

Часто путаетесь в modify и change? Я - тоже. Поэтому сделал небольшую шпаргалку по выводу stat и значению каждой метки.

▪️ Команда для просмотра полной информации о файле:


stat file.txt


Пример вывода:


File: file.txt
Size: 3 Blocks: 8 IO Block: 4096 regular file
Device: fe00h/65024d Inode: 657571 Links: 1
Access: 2025-08-22 00:31:39.446518364 +0300
Modify: 2025-08-22 00:30:55.460753550 +0300
Change: 2025-08-22 00:30:55.460753550 +0300
Birth: 2025-08-22 00:30:45.778142819 +0300


▪️ Разбор полей:

1️⃣ Birth (crtime) - время создания иноды. Показывается не на всех файловых системах. Например, ext4 и xfs поддерживают, но не гарантированно. Это именно момент физического создания файла.

2️⃣ Access (atime) - время последнего доступа к файлу (чтение, просмотр).

⚠️ Влияет параметр монтирования:

noatime - метка не обновляется вовсе;
relatime (по умолчанию) - обновляется, если: прошло более 24 часов с последнего доступа; atime < mtime или ctime.

Проверьте сами:


cat file.txt
stat file.txt # atime обновится
cat file.txt
stat file.txt # atime НЕ обновится, если прошло меньше 24ч


3️⃣ Modify (mtime) - изменение содержимого файла (например, записали новые данные).

4️⃣ Change (ctime) - изменение метаданных файла: прав, владельца, ссылок и т.д. Например:


chmod 644 file.txt
# изменится только ctime, mtime останется прежним


🌟 Частая путаница:

На слух change и modify кажутся синонимами, но это совершенно разные вещи в контексте файловой системы. mtime - это про СОДЕРЖИМОЕ, ctime - про ОБОЛОЧКУ (метаданные).

▪️ Когда это важно? Например, при использовании find:


# Найти файлы, измененные по содержимому за последние 2 дня
find . -mtime -2

# Найти файлы с измененными правами/владельцем за последние 2 дня
find . -ctime -2


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

#linux #files

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🔥1
👤 TOTP-авторизация в Linux: двухфакторка прямо в консоли

Хотите добавить второй фактор авторизации в linux, но без заморочек с внешними порталами и веб-интерфейсами? Все можно сделать прямо в терминале с помощью PAM и TOTP. Покажу, как настроить двухфакторную авторизацию через google authenticator или oathtool.

1️⃣ Установка модуля PAM для TOTP.


sudo apt install libpam-google-authenticator # на debian/ubuntu
sudo yum install google-authenticator # на RHEL/centOS


2️⃣ Генерация секретного ключа для пользователя. Под нужным пользователем запускаем:


google-authenticator


Вы получите:

📍Секретный ключ (его нужно добавить в приложение google authenticator или аналог);
📍URL в формате otpauth://...;
📍Резервные коды на случай потери доступа;

3️⃣ Настройка PAM. Открываем PAM-конфиг sshd:


sudo nano /etc/pam.d/sshd


Добавляем в начало:


auth required pam_google_authenticator.so


Также нужно разрешить использование PAM в sshd_config:


sudo nano /etc/ssh/sshd_config


Убедитесь, что указано:


ChallengeResponseAuthentication yes
UsePAM yes


Перезапускаем SSH:


sudo systemctl restart sshd


Теперь при входе по SSH будет запрашиваться TOTP-код.

4️⃣ Использование oathtool (альтернатива телефону). Если вы хотите получать коды в консоли, используйте oathtool.

Устанавливаем:


sudo apt install oathtool


Пример генерации кода (вставьте свой секретный ключ в base32):


oathtool --totp -b 'JBSWY3DPEHPK3PXP'


Можно сделать shell-функцию:


totp() {
oathtool --totp -b "$1"
}


И использовать:


totp JBSWY3DPEHPK3PXP


🌟 Полезно знать

📍Конфигурация хранится в ~/.google_authenticator;
📍Двухфакторка включается для каждого пользователя отдельно;
📍Можно задать ограничения - например, разрешить доступ по SSH только с TOTP, но не требовать при входе локально.

#linux #2FA

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
🤓

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17🤔2🤡2
📱 Консоль через браузер за 1 минуту с помощью ttyd

Если вдруг понадобилось зайти в терминал через веб или дать кому-то временный доступ - есть простой и удобный способ: ttyd.

▪️ Установка. Скачиваем и устанавливаем:


wget https://github.com/tsl0922/ttyd/releases/download/1.7.3/ttyd.i686
mv ttyd.i686 /usr/local/bin/ttyd
chmod +x /usr/local/bin/ttyd


▪️ Запуск. Запускаем веб-терминал с Bash:


ttyd bash


В консоли появится порт (по умолчанию - 7681). Переходим в браузере: http://<IP_сервера>:7681 - и вы в консоли.

▪️ Использование. Вы можете запускать любую CLI-программу:


ttyd top # Мониторинг системы
ttyd mc # Midnight Commander в браузере
ttyd htop # Более наглядный top


▪️ Возможности. Запустите ttyd без параметров, чтобы увидеть все опции:

📍выбор порта и интерфейса (-p, -i);
📍basic-аутентификация (--credential);
📍режим только для чтения (--readonly);
📍автоматическое переподключение и прочее.

Утилита идеальна для быстрой отладки, демонстрации или временного доступа без SSH-настройки. Например, можно повесить top в read-only режиме для удаленного мониторинга.

#linux #ttyd

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141