en
Feedback
BashTex | Linux

BashTex | Linux

Open in Telegram

Авторский канал для тех, кто хочет глубже погрузиться в мир Linux. Подойдет для разработчиков, системных администраторов и DevOps Реклама: @dad_admin

Show more
2 524
Subscribers
-224 hours
-67 days
No data30 days
Posts Archive
Сравнение производительности: grep / awk / sed / perl Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность? ⭐️ Тест: кто быстрее? Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.

# 1. grep — специализируется на поиске
time grep 'ERROR' logs.txt

# 2. awk — универсален, но чуть медленнее grep
time awk '/ERROR/' logs.txt

# 3. sed — может искать, но не для этого заточен
time sed -n '/ERROR/p' logs.txt

# 4. perl - мощь и регулярки, но запускается дольше
time perl -ne 'print if /ERROR/' logs.txt
🕛 Результаты (примерные):
Команда Время (сек) Комментарий grep 0.18 - Самый быстрый в чистом поиске awk 0.25 - Универсал, чуть медленнее sed 0.30 - Не лучший для просто поиска perl 0.35 - 0.50 Мощно, но медленно стартует
🌟 Что важно помнить:
grep - лучший выбор для быстрого поиска. Используй grep -F (fixed strings) для ещё большей скорости. awk - когда нужна логика: фильтрация, подсчёты, агрегирование. sed - идеально для простых замен (особенно sed -i), но не лучший инструмент для поиска. perl - тянет даже сложнейшие регулярки и постобработку, но стоит дороже по времени запуска.
🌟 Хитрости: Для поиска без регулярных выражений: 1. grep -F "ERROR" → быстрее, чем обычный grep. 2. Используй LC_ALL=C или LANG=C для ускорения поиска (отключает локализацию):

LC_ALL=C grep 'ERROR' logs.txt
3. Объединяй:

grep 'ERROR' logs.txt | awk '{print $1}'  # вытащить дату, например
BashTex 📱 #linux #utils

А, ой, я случайно BashTex 📱 #юмор
А, ой, я случайно BashTex 📱 #юмор

Умная работа с PID: поиск и завершение зависших процессов Иногда процессы зависают - висят в D (disk sleep) или Z (zombie), потребляют CPU без пользы, или держат файлы, которые нужно удалить. Просто killall - грубо и может снести лишнее. Давайте сделаем это умнее. ▪️ Задача: Найти и безопасно завершить только зависшие или чрезмерно "прожорливые" процессы, избегая случайных убийств важных задач. ▪️ Подход:
Сканируем ps на предмет "подозрительных" состояний. Проверяем длительность жизни процесса. Ограничиваем по имени, CPU или статусу. Включаем dry-run перед действием.
▪️ Пример скрипта:

#!/usr/bin/env bash
set -euo pipefail

PATTERN="python"           # Имя процесса (или часть имени)
MAX_CPU=80                 # Максимально допустимая загрузка CPU
MAX_AGE=3600               # В секундах: 1 час
DRY_RUN=true               # Безопасный режим

echo "Поиск процессов по шаблону: $PATTERN"

ps -eo pid,etime,pcpu,comm --sort=-pcpu | awk -v pattern="$PATTERN" -v max_cpu="$MAX_CPU" -v max_age="$MAX_AGE" -v dry_run="$DRY_RUN" '
function hms_to_sec(s,   t, n, h, m) {
    gsub("-", "", s)
    n = split(s, t, /[:-]/)
    if (n == 3)      { h = t[1]; m = t[2]; s = t[3] }
    else if (n == 2) { h = 0;    m = t[1]; s = t[2] }
    else             { h = 0;    m = 0;    s = t[1] }
    return h * 3600 + m * 60 + s
}

NR>1 && $4 ~ pattern {
    age = hms_to_sec($2)
    cpu = $3
    if (cpu > max_cpu || age > max_age) {
        printf "[!] Найден подозрительный процесс: PID=%s CPU=%.1f%% AGE=%ss CMD=%s\n", $1, cpu, age, $4
        if (dry_run == "false") {
            system("kill -9 " $1)
            print "[x] Завершен PID=" $1
        } else {
            print "[i] Dry run: процесс НЕ завершен"
        }
    }
}
▪️ Что умеет:
Выборочно завершает процессы с перегрузкой по CPU Проверяет "возраст" процессов по etime Работает в dry-run режиме по умолчанию Прост в кастомизации: ищи по имени, статусу, времени
BashTex 📱 #bash

Создание своего systemd-сервиса для скрипта Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd. 1️⃣ Подготовка скрипта. Убедись, что скрипт исполняемый и логирует всё в файл:

#!/bin/bash
echo "$(date): Скрипт запущен" >> /var/log/myscript.log
# Здесь твоя логика
Сохрани его, например, в /usr/local/bin/myscript.sh
И не забудь дать права:

chmod +x /usr/local/bin/myscript.sh
2️⃣ Юнит-файл systemd. Создай сервис:

sudo nano /etc/systemd/system/myscript.service
Пример содержимого:

[Unit]
Description=Мой кастомный скрипт
After=network.target

[Service]
ExecStart=/usr/local/bin/myscript.sh
Restart=on-failure
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
3️⃣ Активация и запуск

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service
Проверка:

systemctl status myscript.service
🌟 Зачем это вообще?
Скрипт запускается при старте Контролируется systemd (перезапуск, статус, логи) Удобная интеграция в системную инфраструктуру
🌟 Советы:
Нужен таймер? Используй myscript.timer Хочешь лог в journalctl? - уже встроено Скрипт должен зависеть от другого сервиса? Укажи в After= и Requires=
BashTex 📱 #linux #utils

В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них ран
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда? Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России 📆 в канале размещаются как онлайн, так и оффлайн мероприятия; 👩‍💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие; 🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах: 🚀 IT-мероприятия Россииподписывайся и будь в курсе всех предстоящих мероприятий!

Фоновая очередь задач на Bash с контролем параллелизма Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов. ▪️ Идея:
Создаём продвинутую фоновую очередь на Bash, с: ограничением на количество параллельных задач; логированием статуса выполнения; возможностью динамически подставлять команды.
▪️ Пример:

#!/usr/bin/env bash
set -euo pipefail

MAX_PARALLEL=4
LOGFILE="./queue.log"
TASKS=(
    "sleep 3 && echo task1"
    "sleep 2 && echo task2"
    "sleep 1 && echo task3"
    "sleep 4 && echo task4"
    "sleep 5 && echo task5"
    "sleep 2 && echo task6"
)

run_task() {
    local cmd="$1"
    local id=$(date +%s%N)
    echo "[$id] START: $cmd" >> "$LOGFILE"
    eval "$cmd"
    local status=$?
    echo "[$id] END: $cmd (exit=$status)" >> "$LOGFILE"
    return $status
}

active_jobs() {
    jobs -rp | wc -l
}

for task in "${TASKS[@]}"; do
    run_task "$task" &
    
    # Ждём, если число фоновых задач превысило лимит
    while (( $(active_jobs) >= MAX_PARALLEL )); do
        sleep 0.2
    done
done

wait
echo "Все задачи завершены. Лог: $LOGFILE"
▪️ Объяснение: jobs -rp выводит только PID'ы активных фоновых процессов. run_task() логирует начало, завершение и статус команды. Используем eval - аккуратно, если команды приходят из недоверённого источника. 🌟 Такой подход можно использовать в:
CI/CD пайплайнах без внешних тулов; миграции данных или резервном копировании; массовой обработке видео/изображений; сетевом сканировании и мониторинге.
BashTex 📱 #bash

Теперь точно ответит BashTex 📱 #юмор
Теперь точно ответит BashTex 📱 #юмор

Сканирование сети и вывод в CSV с nmap Когда нужно быстро получить список активных хостов и открытых портов в сети - nmap, то что нужно. Особенно, если нужно сохранить результаты в CSV для анализа или импорта куда-нибудь (например, в Excel, LibreOffice, Grafana и т.д) 📱 Пример скрипта:

#!/bin/bash
NETWORK="192.168.1.0/24"
OUTPUT="scan_result.csv"

# Заголовок CSV
echo "IP,Hostname,Ports" > "$OUTPUT"

# Сканируем сеть
nmap -sP "$NETWORK" -oG - | awk '/Up$/{print $2}' | while read ip; do
    HOST=$(nmap -sL "$ip" | grep "Nmap scan report" | awk '{print $NF}')
    PORTS=$(nmap -Pn -p- --min-rate=1000 --open "$ip" | awk '/^[0-9]+\/tcp/ {printf "%s; ", $1}')
    echo "$ip,$HOST,\"$PORTS\"" >> "$OUTPUT"
done
▪️ Что делает скрипт:
сканирует активные устройства в сети 192.168.1.0/24 для каждого IP делает порт-скан сохраняет IP, hostname и список открытых портов в CSV
BashTex 📱 #bash #utils

Массивы и ассоциативные массивы Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации. ▪️ Обычные массивы. Когда нужен список значений, например, список баз данных:

databases=("db1" "db2" "db3")

for db in "${databases[@]}"; do
  echo "Делаю бэкап $db..."
  pg_dump "$db" > "$db.sql"
done
▪️ Ассоциативные массивы. Когда нужно сопоставить ключ → значение, например: сервис и его порт.

declare -A services
services=(
  [nginx]=80
  [ssh]=22
  [postgres]=5432
)

for service in "${!services[@]}"; do
  port=${services[$service]}
  echo "$service работает на порту $port"
done
▪️ Реальное применение 📍 Мониторинг процессов:

declare -A procs=( [nginx]="nginx" [db]="postgres" [ssh]="sshd" )

for name in "${!procs[@]}"; do
  pgrep -x "${procs[$name]}" > /dev/null || echo "$name не работает!"
done
📍 Распределённая отправка по email:

emails=(user1@example.com user2@example.com user3@example.com)

for email in "${emails[@]}"; do
  echo "Привет!" | mail -s "Уведомление" "$email"
done
BashTex 📱 #linux #utils

Циклический дамп баз данных и удаление старых бэкапов Резервные копии баз данных - вещь критически важная. Но без автоматизации быстро превращаются в хаос. Сегодня про то, как настроить скрипт, который: делает дамп базы с меткой времени сохраняет в указанный каталог удаляет старые бэкапы по заданной политике (например, старше 7 дней) ▪️ Пример для PostgreSQL:

#!/bin/bash
set -euo pipefail

DB_NAME="mydb"
BACKUP_DIR="/var/backups/postgres"
DAYS_TO_KEEP=7
DATE_SUFFIX=$(date +%Y-%m-%d_%H-%M-%S)
FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE_SUFFIX.sql.gz"

# Создание дампа
pg_dump "$DB_NAME" | gzip > "$FILENAME"

# Удаление старых бэкапов
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$DAYS_TO_KEEP -delete
Для MySQL/MariaDB подойдёт mysqldump "$DB_NAME" ▪️ Дополнительно, добавить исполнение скрипта в cron:

0 3 * * * /path/to/backup.sh — ежедневный бэкап в 3:00
BashTex 📱 #bash #utils

Удобное копирование файлов в облако Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен rclone. Это утилита для синхронизации, копирования, шифрования и резервного копирования файлов в облачные хранилища. Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски. ⚙️ Установка

sudo apt install rclone #Ubuntu/Debian

Или вручную:

```bash
curl https://rclone.org/install.sh | sudo bash
▪️ Быстрая настройка (на примере Google Drive)

rclone config
n - создать новое подключение 1. Введи имя, например gdrive 2. Выбери тип (drive для Google Drive) 3. Авторизуй через браузер Готово! ▪️ Основные команды 📍 Копировать файлы в облако:

rclone copy ./backup gdrive:/my_backups
📍 Синхронизация (удаляет на целевой стороне лишнее):

rclone sync ./media gdrive:/media --progress
📍 Копирование из облака:

rclone copy gdrive:/media ./local_copy
📍 Просмотр файлов в облаке:

rclone ls gdrive:/my_backups
▪️ Продвинутые фишки 📍 Шифрование: Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/ Теперь все файлы будут шифроваться на лету, прямо перед отправкой. 📍 Сжатие + передача:

tar cz folder | rclone rcat gdrive:archive.tar.gz
📍 Тест пропускной способности:

rclone bench
📍 Мониторинг через Web UI:

rclone rcd --rc-web-gui
🌟 Зачем использовать rclone?
Удобный CLI-стиль как у rsync Работает с почти любым облаком Поддержка крипты, логирования, многопоточности Можно использовать в скриптах, cron, backup-сценариях Идеален для сервера без GUI
Rclone = rsync для облаков. BashTex 📱 #linux #utils

Простая работа с фоновыми процессами через пайпы coproc - один из недооценённых инструментов в Bash. Он позволяет создавать фоновые процессы с доступом к их вводу/выводу через переменные. То есть, ты получаешь легкий способ запускать команды асинхронно и при этом взаимодействовать с ними. 🌟 Зачем нужен coproc? Иногда тебе нужно запустить процесс в фоне, при этом: 1. Посылать ему данные (stdin) 2. Читать от него результат (stdout) 3. Не колхозить с mkfifo, & и exec Вот тут и заходит coproc. ▪️ Синтаксис

coproc ИМЯ { команда; }
После этого у тебя появятся: ${ИМЯ[0]} - дескриптор для чтения (stdout команды) ${ИМЯ[1]} - дескриптор для записи (stdin команды) ▪️ Пример 1: диалог с bc

coproc CALC { bc -l; }

echo "2^10" >&"${CALC[1]}"
read -r result <&"${CALC[0]}"
echo "Результат: $result"
bc запустился в фоне, мы отправили ему выражение, получили результат - красиво, без лишних файлов и форков. ▪️ Пример 2: интерактивный grep

coproc GREPPER { grep --line-buffered "error"; }

# Пишем в grep
echo "all ok" >&"${GREPPER[1]}"
echo "fatal error!" >&"${GREPPER[1]}"

# Читаем вывод (будет только строка с error)
read -r matched <&"${GREPPER[0]}"
echo "Найдено: $matched"
▪️ Пример 3: асинхронная обработка большого файла

coproc SORTER { sort > sorted.txt; }

# Пишем данные на сортировку
cat bigfile.csv >&"${SORTER[1]}"

# Ждём завершения
wait "${SORTER_PID}"
echo "Готово!"
BashTex 📱 #bash #utils

✅ Имба: в сети обнаружили мегашпаргалку с самыми полезными нейросетями на все случаи жизни. Сохраняем самое крутое: 🤩Claude
Имба: в сети обнаружили мегашпаргалку с самыми полезными нейросетями на все случаи жизни. Сохраняем самое крутое: 🤩Claude 3.7 Sonnet — мастхев для программистов 🤩Same New — быстрая копия интерфейса сайта 🤩Openrouter — доступ ко всем ИИ 🤩Suno AI — своя музыка с нейросетью Подпишись и находи для себя крутые нейросети бесплатно: https://t.me/+JXmPkCIqryU1NmQy

…Я уже Ubuntu накатил 😎 BashTex 📱 #юмор
…Я уже Ubuntu накатил 😎 BashTex 📱 #юмор

Настройка автообновления сертификатов Let’s Encrypt Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут. 1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt. Для Ubuntu/Debian:

sudo apt update
sudo apt install certbot python3-certbot-nginx  # для Nginx
Для Apache:

sudo apt install certbot python3-certbot-apache
2️⃣ Получение сертификата. Пример для Nginx:

sudo certbot --nginx -d example.com -d www.bashtex.com
Для Apache:

sudo certbot --apache -d bashtex.com
Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS. 3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты. Проверить вручную:

sudo certbot renew --dry-run
Если тест успешен — автообновление работает. 4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:

sudo crontab -e

Добавь строку:

```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx
Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат. 5️⃣ Обновление через hook (если веб-сервер кастомный)

certbot renew --deploy-hook "systemctl reload myserver"
Хук сработает только если сертификат реально обновился - не будет лишних рестартов. 🌟 Как узнать дату истечения сертификата?

openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate
BashTex 📱 #linux #utils

Ограничение ресурсов процессов прямо из терминала В Linux каждый процесс потребляет ресурсы: память, количество открытых файлов, размер стека и прочее. Чтобы предотвратить вылет системы или несанкционированное потребление ресурсов, используется команда ulimit. 🌟 Что такое ulimit?
ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.
🌟 Что можно ограничить? Команда ulimit -a покажет текущие лимиты:

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
open files                      (-n) 1024
max user processes              (-u) 15635
🌟 Часто используемые лимиты
Параметр Назначение -n Количество открытых файлов (очень важно для веб-серверов и баз данных) -u Кол-во пользовательских процессов -f Максимальный размер создаваемого файла -v Максимальный объём виртуальной памяти -s Размер стека -t Максимальное время CPU, сек
▪️ Примеры использования 📍 Увеличить лимит открытых файлов:

ulimit -n 65535
📍 Ограничить процесс в использовании CPU временем:

ulimit -t 60
(После 60 секунд использования CPU - процесс будет убит) 📍 Запретить создание файлов > 10 МБ:

ulimit -f $((10 * 1024))  # 10 МБ в блоках по 1K
▪️ Мягкие и жёсткие лимиты Мягкий лимит - может быть изменён пользователем в рамках жёсткого Жёсткий лимит - верхняя граница, меняется только от root 📍 Посмотреть:

ulimit -Sn  # soft
ulimit -Hn  # hard
📍 Установить:

ulimit -Sn 4096
ulimit -Hn 65535
📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки: /etc/security/limits.conf:

youruser hard nofile 65535
youruser soft nofile 65535
Убедитесь, что PAM обрабатывает лимиты:

/etc/pam.d/common-session
Добавьте:

session required pam_limits.so
⭐️ Когда пригодится?
Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch) CI/CD-сборки, которые могут упереться в лимит памяти или процессов Безопасность: ограничение прав скриптов или сторонних процессов
BashTex 📱 #linux #utils

🚨 Готовься к топовой карьере в ИБ с нашим Telegram-каналом! 🔒 Хочешь прокачать навыки в информационной безопасности, узнать
🚨 Готовься к топовой карьере в ИБ с нашим Telegram-каналом! 🔒 Хочешь прокачать навыки в информационной безопасности, узнать реальные зарплаты и уверенно пройти собеседование? Подписывайся на @training_hard_skill — твой гид в мир ИБ! 💻 Что тебя ждет?🔍 Викторины по ИБ: Тестируй знания с вопросами про Sysmon, Falco, Kubernetes и SIEM и пр. От Junior до Senior! 💰 Зарплатные вилки: Узнай, сколько платят ИБ-специалистам, SOC-аналитикам и DevOps в 2025 году. 📋 Вопросы с собеседований: Реальные кейсы и задачи от топовых компаний. Будь готов к любому вопросу! Почему мы? Еженедельные викторины с объяснениями. Свежие данные по зарплатам из России, Европы и США. Практические советы, чтобы выделиться на собеседовании. 🔥 Подписывайся на @training_hard_skill и стань мастером ИБ! 👉 Жми: t.me/training_hard_skill #ИБ #Cybersecurity #SOC #Собеседование #Зарплаты

Cтраховка от неожиданных ошибок в скриптах При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку. ❓ Что делает эта магическая строка?

set -euo pipefail
-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||). -u (unset variables) — ошибка при попытке использовать неинициализированную переменную. -o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).
Разберём на примерах. 🚫 Скрипт без set -euo pipefail (пропустит ошибки)

#!/bin/bash
echo "Начинаем работу..."

rm /несуществующий_файл   # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"

VAR=$(cat $UNKNOWN_VAR)   # Неинициализированная переменная (ошибка, но не критично)

ls | grep myfile | awk '{print $1}'  # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"
Итог: скрипт продолжает работать, даже если что-то пошло не так. ✔️ Скрипт с set -euo pipefail (контроль ошибок)

#!/bin/bash
set -euo pipefail

echo "Начинаем работу..."

rm /несуществующий_файл   # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"

VAR=$(cat $UNKNOWN_VAR)   # Ошибка: переменная не объявлена

ls | grep myfile | awk '{print $1}'  # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"
Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения. ⭐️ Где это особенно полезно?
Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась). Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии). Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).
❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными. Например, если файл может отсутствовать, но это не должно останавливать выполнение:

rm myfile.txt || true  # Явно игнорируем ошибку
Или если команда в пайпе не всегда должна возвращать код 0:

set +o pipefail  # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail   # Включаем обратно
BashTex 📱 #linux #utils

Даже лишнего немного BashTex 📱 #юмор
Даже лишнего немного BashTex 📱 #юмор

Развёртывание Linux по сети с PXE Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях. 🌟 Как это работает?
Компьютер включается и запрашивает сетевой загрузчик по DHCP. Сервер отвечает и передаёт загрузочный образ через TFTP. Клиент загружает ядро Linux и переходит к установке системы.
🌟 Что нужно для развертывания PXE?
DHCP-сервер (для раздачи PXE-загрузчика) TFTP-сервер (для передачи загрузочных файлов) HTTP/NFS-сервер (для хранения установочных файлов)
1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):

sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2
2️⃣ Настраиваем DHCP для PXE. Редактируем /etc/dhcp/dhcpd.conf:

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  next-server 192.168.1.10; # PXE-сервер
  filename "pxelinux.0";
}
Перезапускаем DHCP:

sudo systemctl restart isc-dhcp-server
3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в /etc/default/tftpd-hpa:

TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"
Перезапускаем:

sudo systemctl restart tftpd-hpa
4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:

sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .
Создаём каталог для меню:

mkdir -p /srv/tftp/pxelinux.cfg
5️⃣ Создаём загрузочное меню PXE. Создаём файл /srv/tftp/pxelinux.cfg/default:

DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install

LABEL install
  MENU LABEL Install Ubuntu 22.04
  KERNEL ubuntu/vmlinuz
  APPEND initrd=ubuntu/initrd.gz netboot=http://192.168.1.10/ubuntu/
6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:

sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz
Перезапускаем Apache:

sudo systemctl restart apache2
7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства. Клиент загрузится и начнёт установку Linux прямо из сети. BashTex 📱 #linux #utils