Please open Telegram to view this post
VIEW IN TELEGRAM
😁18❤5🔥2
Часто возникает ситуация: программа подвисает, работает странно или вообще не запускается. В таких случаях на помощь приходят два инструмента -
strace и ltrace. Оба они позволяют заглянуть внутрь процесса, но делают это на разных уровнях.
strace ls /nonexistent
Вывод покажет, что ls пытается открыть директорию и получает ENOENT (нет такого файла).
strace -p 1234
Теперь видно, чем занимается процесс с PID 1234.
strace -e open,read,write -p 1234
Будут показаны только вызовы open, read, write.
ltrace ls
Вы увидите вызовы функций вроде malloc(), strlen(), fopen().
ltrace -e malloc,free ./myprog
Будут показаны только вызовы функций управления памятью.
strace → понять, что происходит на уровне системных вызовов (например, программа не может открыть файл из-за прав).
ltrace → отследить логику внутри библиотек (например, неверно передаются параметры в функцию).
strace -p <PID>
Сразу видно, ждёт ли программа I/O или зациклилась.
strace ./prog 2>&1 | grep ENOENT
Можно увидеть, какой именно файл не удаётся открыть.
ltrace -e malloc,free ./prog
Если много malloc(), но мало free() - повод задуматься.
#linux #debug
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
На первый взгляд, копирование файлов в linux выглядит элементарной задачей. Но если копать глубже, у команды cp есть несколько нюансов, которые легко могут привести к неожиданному результату.
cp /dir_a/* /dir_b
Кажется логичным, но так скопируются только файлы верхнего уровня, без вложенных директорий. Чтобы взять все целиком (с поддиректориями и атрибутами), используем:
cp -a /dir_a/* /dir_b
Ключ -a = рекурсия + права доступа + даты + симлинки. В общем, максимально правильное копирование.
Звездочка раскрывается в bash. Символ * обрабатывает сама оболочка, а не cp. То есть bash разворачивает список файлов и передаёт их в виде длинной команды:
cp -a /dir_a/file1 /dir_a/file2 ... /dir_b
Если файлов слишком много - можно упереться в ограничение длины команды.
Скрытые файлы теряются. Файлы, начинающиеся с точки (.htaccess, .env и т.п.), по умолчанию не попадут в *. В результате копирование окажется не точным.
Пустая директория = ошибка. Если в исходной папке нет файлов, то * не развернётся, и cp просто вернет ошибку.
cp -aT /dir_a /dir_b
Здесь:
-a - копирование со всеми атрибутами
-T - воспринимать /dir_b как саму директорию назначения, а не поддиректорию внутри неё
Таким образом, копирование отрабатывает корректно: и вложенные каталоги, и скрытые файлы будут на месте.
#linux #cp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤2🔥1😱1👌1
Swap в linux играет роль страховочного пространства на диске для выгрузки неиспользуемых страниц памяти. Но работать с ним можно по-разному: от полного отключения до использования современных технологий сжатия. Разберем основные практики.
swapon --show
free -h
swapoff -a
Чтобы выключить swap навсегда - закомментируйте его строки в
/etc/fstab.
# swapon /swapfile --priority 100
Текущие приоритеты видно в выводе
swapon --show.0 - максимально избегать использования swap.
60 (по умолчанию) - сбалансированный вариант.
100 - активно выгружать память в swap.
Пример настройки:
sysctl -w vm.swappiness=10
Для постоянного применения добавьте в
/etc/sysctl.conf:
vm.swappiness=10
Активация через параметры ядра:
zswap.enabled=1
Установка и включение в Debian/Ubuntu:
apt install zram-tools
systemctl enable --now zramswap.service
#linux #swap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Когда речь заходит о работе с внешними или сетевыми хранилищами, важно проверять, что файловая система действительно подключена и смонтирована. В Linux для этого есть две удобные утилиты -
findmnt и findfs.
findmnt -x
Success, no errors or warnings detected
Если в конфигурации есть ошибка - получите подробное сообщение:
findmnt -x
/mnt/backup
[E] unreachable on boot required source: UUID=151ea24d-977a-412c-818f-0d374baa5012
Также можно проверять наличие конкретной точки монтирования:
if findmnt -rno TARGET "$1" >/dev/null; then
echo "$1 mounted."
else
echo "$1 not mounted."
fi
findfs "UUID=151ea24d-977a-412c-818f-0d374baa5013"
/dev/sda2
Выходной код тоже полезен в скриптах:
0 → устройство найдено
1 → файловая система не найдена
if findfs "UUID=$1" >/dev/null; then
echo "$1 connected."
else
echo "$1 not connected."
fi
Если не проверить подключение, легко попасть в неприятную ситуацию:
бэкап или копирование пойдет не на внешний диск, а в локальную систему;
место на корневом разделе быстро закончится;
при монтировании обратно старые файлы могут спрятаться за точкой монтирования.
#findmnt #findfs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Когда в скрипте что-то идет не так, часто хочется понять, какая команда выполнилась последней и какие значения получили переменные. Вместо того чтобы расставлять десятки echo, в bash есть встроенный инструмент -
set -x.Если указать его в начале скрипта, оболочка начнет печатать в консоль каждую выполняемую команду с подставленными значениями переменных. Перед строкой появляется символ +, что делает разбор вывода наглядным.
Создадим простой скрипт, который проверяет наличие файла и копирует его в директорию резервных копий:
#!/bin/bash
set -x
src="/etc/hosts"
dst="/tmp/backup"
mkdir -p "$dst"
timestamp=$(date +%Y%m%d_%H%M%S)
cp "$src" "$dst/hosts_$timestamp"
echo "Backup created: $dst/hosts_$timestamp"
Вывод консоли:
▶ Запуск
# ./backup.sh
+ src=/etc/hosts
+ dst=/tmp/backup
+ mkdir -p /tmp/backup
+ date +%Y%m%d_%H%M%S
+ timestamp=20251007_121330
+ cp /etc/hosts /tmp/backup/hosts_20251007_121330
+ echo 'Backup created: /tmp/backup/hosts_20251007_121330'
Backup created: /tmp/backup/hosts_20251007_121330
Мы видим каждое действие: какие переменные подставились, как отработала команда date, куда скопировался файл.
#linux #debug
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4
Cockpit - это встроенный в современные дистрибутивы инструмент, который превращает сервер в управляемый через браузер интерфейс. Вам больше не нужно все делать вручную в консоли - многие задачи можно выполнять из веб-панели.
debian/ubuntu:
apt install cockpit -y
systemctl enable --now cockpit.socket
RHEL/centOS/fedora:
dnf install cockpit -y
systemctl enable --now cockpit.socket
После этого панель доступна по HTTPS на порту 9090:
https://IP-сервера:9090Авторизация выполняется через обычный системный логин и пароль.
Мониторинг ресурсов (CPU, RAM, диски, сеть) в реальном времени
Управление сервисами systemd (запуск, остановка, перезапуск)
Просмотр логов journald
Управление пользователями и правами
Настройка сетевых интерфейсов и firewall
Работа с дисками, RAID и LVM
Подключение Docker/Kubernetes для управления контейнерами
Возможность администрировать несколько серверов через одну панель
Минимальная настройка: поставил и сразу работает.
Не требует сторонних агентов - все идет через systemd и встроенные механизмы.
Легко интегрируется с SELinux, firewalld и другими системными компонентами.
#linux #cockpit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤3
Обычно мы проверяем состояние конкретной службы:
systemctl status mariadb
Но если запустить без указания сервиса:
systemctl status
то получим сводку по всей системе. Очень полезная штука
Что покажет systemctl status без аргументов:
State - общее состояние (например: running, degraded)
Failed - количество упавших юнитов
Uptime - время работы systemd
Версия systemd
Количество активных units
Дерево зависимостей сервисов в удобном виде
systemctl list-units --failed
Посмотреть детали по конкретному юниту:
systemctl status <unit>
journalctl -u <unit>
Пример:
systemctl status
Вывод:
State: degraded
Failed: 1 units
Проверяем, что упало:
systemctl list-units --failed
например, systemd-modules-load.service.
Дальше копаемся в логах:
journalctl -u systemd-modules-load.service
systemctl status → быстрый обзор состояния системы.
systemctl list-units --failed → список проблемных юнитов.
journalctl -u <unit> → подробные логи конкретной службы.
#linux #systemctl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2
Админы, привыкшие к bash и linux, часто недооценивают powershell. А зря - это также неплохая оболочка, которая умеет не только выполнять команды, но и работать с объектами, сервисами и API windows. Ниже несколько полезных сценариев, которые пригодятся, если админите и linux, и windows.
# Процессы по имени
Get-Process | Where-Object { $_.ProcessName -like "*chrome*" }
# Открытые TCP-порты
Get-NetTCPConnection | Where-Object { $_.State -eq "Listen" }
# Найти все *.log файлы и удалить старше 7 дней
Get-ChildItem -Path "C:\Logs" -Filter *.log -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
Remove-Item -Force
$hosts = "8.8.8.8","1.1.1.1","networkadmin.ru"
foreach ($h in $hosts) {
Test-Connection -ComputerName $h -Count 2 -Quiet |
ForEach-Object { "$h -> $($_ -replace 'True','OK' -replace 'False','Fail')" }
}
# Проверить статус службы
Get-Service -Name "Spooler"
# Перезапустить службу
Restart-Service -Name "Spooler"
Invoke-RestMethod -Uri "https://api.ipify.org?format=json"
# Системная информация
Get-ComputerInfo | Select-Object CsName, WindowsVersion, OsArchitecture
# Диски
Get-PSDrive -PSProvider FileSystem
#powershell #windows
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍2🔥2
Ubuntu давно перешла от классического
/etc/network/interfaces к новому инструменту - netplan. Он появился начиная с ubuntu 17.10 и стал основным способом настройки сетевых интерфейсов.❗️ Netplan - это уровень абстракции для сетевых конфигураций.
Использует YAML-файлы в /etc/netplan/.
Работает через рендереры:
systemd-networkd - для серверов и headless-систем.
NetworkManager - для десктопов.
Позволяет централизованно и декларативно описывать сеть.
Все настройки находятся в
/etc/netplan/*.yaml.По умолчанию обычно есть файл
01-netcfg.yaml или 50-cloud-init.yaml.
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true
network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
network:
version: 2
ethernets:
ens33:
addresses:
- 192.168.1.101/24
- 192.168.1.102/24
network:
version: 2
bonds:
bond0:
interfaces: [ens33, ens34]
parameters:
mode: balance-rr
addresses:
- 192.168.1.200/24
gateway4: 192.168.1.1
network:
version: 2
vlans:
vlan100:
id: 100
link: ens33
addresses: [192.168.100.10/24]
После изменения файлов:
sudo netplan apply
Для теста перед применением можно использовать:
sudo netplan try
(дает 120 секунд на подтверждение, если сеть отвалилась - конфиг откатывается).
#linux #netplan
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1
Многие для отправки писем из консоли ставят дополнительные утилиты вроде
mailx или mutt. Но часто этого не нужно - все умеет curl.
curl -v \
--url "smtp://smtp.networkadmin.ru:587" \
--mail-from "admin@networkadmin.ru" \
--mail-rcpt "user@domain.ru" \
--user "admin@networkadmin.ru:MySecurePass" \
--upload-file ~/letter.txt
Пример letter.txt:
From: "Admin" <admin@networkadmin.ru>
To: "User" <user@domain.ru>
Subject: Test mail from curl
Hello from curl!
Заголовки (From, Subject и др.) задаются прямо в файле, и можно указывать любые значения.
Хранить пароль в команде небезопасно. Вместо этого используем ~/.netrc:
machine smtp.networkadmin.ru login admin@networkadmin.ru password MySecurePass
machine smtp.another.ru login user@another.ru password StrongPass123
Теперь команда проще и безопаснее:
curl -v \
--url "smtp://smtp.networkadmin.ru:587" \
--mail-from "admin@networkadmin.ru" \
--mail-rcpt "user@domain.ru" \
--netrc \
--upload-file ~/letter.txt
curl --ssl-reqd ...
curl --ssl ...
curl --url "smtps://smtp.networkadmin.ru" ...
curl --url "smtp://smtp.networkadmin.ru/myhost.domain.ru" ...
#SMTP #curl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1
Когда попадаешь на чужой сервер - никогда не знаешь, какие изменения там вносили. Один из быстрых способов разобраться - использовать утилиту
debsums, которая есть в базовых репозиториях:
apt install debsums
❓ Что делает debsums
Утилита сравнивает MD5-суммы файлов из пакетов с эталонными значениями. Это помогает:📍 проверить целостность пакетов;📍 выявить модифицированные файлы;📍 понять, какие стандартные конфиги редактировались.
debsums --config --changed
Результат может быть таким:
/etc/ssh/ssh_config
/etc/default/ssh
То есть видно, что системные конфиги OpenSSH редактировались.
файлы из базовой системы (/etc/default, /etc/pam.d, /etc/grub.d);
юниты systemd;
конфиги сервисов вроде nginx, mariadb, apache2.
#linux #audit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Проверить все пакеты:
debsums
Показать только измененные файлы:
debsums --changed
Проверять только конфиги (/etc):
debsums --config
Только измененные конфиги:
debsums --config --changed
Показать отсутствующие файлы пакета:
debsums --missing
Игнорировать отсутствующие файлы (проверять только существующие):
debsums --ignore-missing
Проверка конкретного пакета
debsums nginx
Найти какие конфиги менялись руками:
debsums --config --changed
Проверить целостность пакета OpenSSH:
debsums openssh-server
#linux #audit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Одна из полезных практик на пути к оптимизации - переодически смотреть, а что вообще запускается и что из этого действительно нужно, а что можно отключить. Это будет полезно не только для оптимизации, но и для безопасности тоже.
systemctl list-unit-files --state=enabled
Команда покажет список всех юнитов, которые стартуют при загрузке. Также полезно посмотреть реально работающие процессы:
systemctl list-units --type=service
systemctl disable avahi-daemon.service
Чтобы остановить прямо сейчас:
systemctl stop avahi-daemon.service
Если сервис не нужен вообще - можно замаскировать, чтобы исключить случайный запуск:
systemctl mask avahi-daemon.service
(при этом запуск будет невозможен даже вручную, пока не сделаете unmask).
Примеры сервисов, которые часто не используются:
avahi-daemon.service - autodiscovery (не нужен на сервере)
bluetooth.service - если нет блютуза
ModemManager.service - если не используется мобильный модем
rpcbind.service - устаревший RPC, не нужен большинству
Далее уже зависит конкретно от Ваших потребностей и ситуации.
systemctl list-unit-files --state=enabled
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2❤1
ethtool - это не только утилита для просмотра информации о сетевой карте. С ее помощью можно управлять сетевыми интерфейсами в linux: от настройки скорости линка до оптимизации производительности под конкретные задачи.
ethtool eth0
Покажет: скорость, дуплекс, поддержку offload-функций, драйвер, версию прошивки и т.д.
ethtool -s eth0 speed 100 duplex full autoneg off
Можно использовать для тестов или если автосогласование работает некорректно.
Проверить поддержку:
ethtool -k eth0
Отключить контрольную сумму (будет полезно для отладки):
ethtool -K eth0 tx off rx off
Также можно управлять GRO, LRO, TSO и другими функциями.
Проверка кабеля и физики:
ethtool --test eth0
ethtool -t eth0 offline
А команда:
ethtool eth0 | grep detected
покажет, есть ли линк и его скорость.
ethtool -S eth0
Выводит счётчики ошибок, дропов, коллизий. Это помогает отлавливать проблемы на низком уровне.
ethtool -g eth0
Изменить глубину очереди при интенсивной нагрузке:
ethtool -G eth0 rx 4096 tx 4096
ethtool -s eth0 wol d
#network #ethtool
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Часто говорят, что при DDoS провайдер отправляет трафик в blackhole. Это не метафора - blackhole (или nullroute) - реальная запись в таблице маршрутизации, которая заставляет ядро молчаливо отбрасывать пакеты к указанному адресу/сети.
ip route add blackhole 10.20.30.40
ip route show | grep blackhole
Теперь все пакеты к 10.20.30.40 будут просто выброшены, без попытки доставить и без ICMP-ответа.
Для сети:
ip route add blackhole 203.0.113.0/24
Для IPv6:
ip -6 route add blackhole 2001:db8::/32
ip route del blackhole 203.0.113.0/24
blackhole - молча дропает пакеты (никаких ICMP).
prohibit - отсылает ICMP administratively prohibited (полезно, если нужно, чтобы источник получил уведомление).
unreachable - возвращает host unreachable.
Команды выглядят похоже:
ip route add prohibit 10.0.0.0/8
ip route add unreachable 10.0.0.0/8
Выбор зависит от сценария: для имитации «исчезновения» хоста - blackhole, чтобы сигнализировать отправителю - prohibit/unreachable.
Провайдеры - при крупном DDoS обычно ставят null-route на адрес жертвы на своей инфраструктуре. Это позволяет дропать трафик до границ сети провайдера, защищая инфраструктуру дальше по пути.
#network #blackhole
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
nftables - это замена iptables, встроенная в ядро linux. Она объединяет фильтрацию, NAT и маршрутизацию в единую подсистему и считается более быстрой и удобной. Разберемся, как можно построить базовую защиту сервера.
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
Мы сразу задали policy drop, то есть по умолчанию все запрещено. Теперь разрешим только нужное.
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input ip protocol icmp accept
sudo nft add rule inet filter input tcp dport {22,80,443} accept
Что тут происходит:
принимаем все соединения в состоянии ESTABLISHED и RELATED
разрешаем локальный интерфейс (lo)
разрешаем ping (ICMP)
открываем SSH, HTTP и HTTPS
sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 10/minute accept
sudo nft add rule inet filter input tcp dport 22 drop
Теперь на SSH можно будет открыть не более 10 новых подключений в минуту.
# блокируем пакеты без флагов (NULL scan)
sudo nft add rule inet filter input tcp flags == 0 drop
# блокируем XMAS-скан
sudo nft add rule inet filter input tcp flags & (fin|psh|urg) == (fin|psh|urg) drop
sudo nft list ruleset
Сохранить конфиг:
sudo sh -c "nft list ruleset > /etc/nftables.conf"
sudo systemctl enable nftables
sudo systemctl restart nftables
#nftables #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1