BashMaster
前往频道在 Telegram
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов. Реклама: @Kone4noVasya Канал на бирже: https://telega.in/c/bash_help
显示更多8 730
订阅者
-224 小时
+27 天
+21030 天
帖子存档
8 729
⚙️ CLI-To-Whatsapp
✔️Bash-скрипт, который позволяет пользователям отправлять выходные данные CLI команды GNU/Linux контакту WhatsApp в виде сообщения
🐙 Перейти на Github
🔨 bash_help
8 729
Компоненты AD Kerberos, Microsoft SQL Server и центр сертификации — как их взломать?
Научим на курсе “Атака на Active Directory". Авторы: HackerRalf (Михаил Порываев) и BlackRabbit (Павел Никитин), 5-кратные победители the Standoff
Старт: 16 декабря. Успейте приобрести курс по старой цене до конца ноября!*
Содержание курса:
- Архитектура AD и ее базис
- Харденинг в AD, добыча критичной информации, развитие по инфраструктуре
- Как закрепиться внутри? Техники и эксплоиты
На 100% прикладной курс:
практическая лаборатория AD содержит 16 виртуальных машин, позволяя участникам отточить свои навыки на практике в 100+ рабочих тасках
🏆 Сертификат / удостоверение о повышении квалификации
*С декабря стоимость курсов увеличится на 15%
@Codeby_Academy
Подробнее о курсе
8 729
⚙️ PathPicker
✔️Инструмент командной строки, который позволяет выбирать файлы из вывода bash
▶️Пользователи могут редактировать выбранные файлы в своем любимом текстовом редакторе или выполнять с ними произвольную команду
🐙 Перейти на Github
🔨 bash_help
8 729
⚙️ ble.sh — Bash Line Editor
✔️Линейный редактор, написанный на чистом Bash, с подсветкой синтаксиса, автоматическими предложениями, режимами vim и т. д. для интерактивных сеансов Bash.
▶️Он заменяет GNU Readline по умолчанию. Предоставляет такие функции, как расширенное завершение и режим редактирования
🐙 Перейти на Github
🔨 bash_help
8 729
Приглашаем 14 ноября в 10:00 на вебинар «Миграция на отечественную ИТ-инфраструктуру и решения для кибербезопасности»
Вы узнайте, что важно учесть при переходе на отечественные инфраструктурные и ИБ-решения. Опытом поделятся руководители служб ИТ и информационной безопасности из РСХБ Факторинг, R-Style Softlab, РЭД Софт.
О чем вебинар:
– Оптимальный выбор решений для кибербезопасности. Как сделать правильный выбор между универсальными ИБ-решениями ( например, NGFW и XDR) и узкоспециализированными (VPN-шлюзы, межсетевые экраны или системы обнаружения киберугроз).
– Служба единого каталога. Обзор отечественных новинок Directory Service. Альтернативы Microsoft Active Directory с учетом совместимости с текущей инфраструктурой.
– Платформы виртуализации. Обзор рынка отечественных решений. Опыт перехода на отечественные платформы виртуализации в РСХБ Факторинг.
– Обзор подходов к миграции ИТ-инфраструктуры. Как перейти на гетерогенную ИТ-инфраструктуру без потери функциональности на этапе миграции.
– Управление проектами по миграции ИТ-инфраструктуры. Как делать сложные проекты по импортозамещению ИТ-инфраструктуры в условиях кадрового голода.
Вебинар будет полезен:
– ИТ-директорам. Узнаете опыт крупных российских компаний по миграции ИТ-инфраструктуры на отечественные решения.
– Директорам и специалистам по информационной безопасности. Получите методологию подбора ИБ-решений и построения систем кибербезопасности, которая позволит экономить до 20% бюджета без потери надежности и функциональности.
– Руководителям компаний. Узнаете опыт РСХБ Факторинг, как делать глобальные проекты по импортозамещению в условиях кадрового голода на ИТ и ИБ-специалистов.
14 ноября, четверг, в 10:00 по МСК.
Регистрация свободная.
Реклама. АО "ЭР-СТАЙЛ СОФТЛАБ". ИНН: 7719198440. Erid: 2VSb5xkYdTe
8 729
⚙️ Скрытие процессов Linux с помощью Bind Mounts
✔️Если у вас есть вредоносный процесс, который вы хотите скрыть, используйте Bind Mounts, чтобы смонтировать другой каталог поверх каталога /proc/PID для вредоносного процесса.
🖼️ Статья на английском языке
🔨 bash_help
8 729
⚙️ Аналог wget на bash
✔️Если вам необходимо скачать какой-то файл, а curl’а или wget’а нет, то можно воспользоваться командной оболочкой bash, написав скрипт, позволяющий скачать любой файл по протоколу http.
➡️ Вот этот скрипт:
download.sh:
#!/bin/bash
if [ "$1" == "" ]
then
echo "usage: $0 URL"
exit 0
fi
HOST=`echo $1 | sed 's/http\:\/\///' | sed -r 's/([^/])\/(.*)/\1/'`
FILENAME=`echo "$1" | sed -r 's/(.*)\/(.*)/\2/'`
PATH=`echo "$1" | sed 's/http\:\/\///' | sed -r "s/$HOST//" | sed "s/$FILENAME//"`
PORT=80
HEADERS="HTTP/1.1\r\nHost: $HOST\r\nConnection: close\r\nContent-Length: 0\r\n\r\n"
F="/tmp/dlfile"
exec 3<>/dev/tcp/$HOST/$PORT
echo -e "GET $PATH$FILENAME $HEADERS" >&3
/bin/cat <&3 > $F
/usr/bin/tail $F -n +$((`/bin/sed $F -e '/^\r$/q' | /usr/bin/wc -l`+1)) > $FILENAME
/bin/rm $F
🖼️ Ссылка на источник
🔨 bash_help8 729
😂 Подборка каналов для каждого сетевого инженера и безопасника
👨💻 Серверная Админа — Большое количество уроков, статей, книг и гайдов по устройству и настройке компьютерных сетей.
😎 Арсенал Безопасника — Проект по кибербезопасности - сборник лучших инструментов и утилит по OSINT, хакингу и деанону
😎 Бункер Хакера — Все что необходимо, для того чтобы начать свой путь в безопасности - инструменты, книги, справочники, гайды и ресурсы.
8 729
⚙️ Bash Prompt Generator
✔️Очень крутой ресурс, где можно сконфигурировать строку для ввода команд в bash.
➡️ Выбираете параметры, расставляете их в нужной последовательности и копируете готовую конфигурацию.
🐙 Перейти на Github
🔨 bash_help
8 729
Освой работу с Prometheus, Grafana, ELK, etc и настрой мониторинг!
✅ Владение инструментами Observability открывает новые карьерные горизонты администраторам Linux, DevOps-инженерам
Стройте сложные эффективные системы мониторинга и логирования инфраструктуры и приложений
💪 Ответьте на 15 вопросов и проверьте, насколько вы готовы к обучению на курсе «Observability: мониторинг, логирование, трейсинг» от OTUS.
+ 5 новых занятий, для вашего профессионального развития
Пройти тест и получить спец. предложение:
https://otus.pw/HhMG/?erid=LjN8KPGU9
#реклама
О рекламодателе8 729
⚙️ bind – встроенная команда оболочки Bash
✔️Используется для установки привязок клавиш и переменных к функциям.
▶️
-l – перечислить имена связанных функций редактирования.
▶️ -P – перечислить названия привязываемых функций редактирования и их привязки, если они есть.
▶️ -p – то же, что и -P, но выводит результат в форме, которую можно использовать в качестве входных данных для команды bind.
▶️ -S – перечислить последовательности клавиш, которые вызывают макросы и их значения.
▶️ -s – то же, что и -S, но выводит результат в форме, которую можно использовать в качестве входных данных для bind.
▶️ -V – перечислить переменные и их значения, которые используются при привязке ключа bash.
▶️ -v – то же, что и -V, но выводит результат в форме, которую можно использовать в качестве входных данных для bind.
▶️ -q название функции – отобразить (запросить) привязку клавиш для функции bash имя_функции.
▶️ -u имя функции – отключить все ключи, привязанные к функции редактирования function-name.
▶️ -r последовательность клавиш – удалить все привязки для последовательности клавиш keyseq.
▶️ -f имя файла – считать привязки клавиш из файла имя_файла и использовать их в качестве входных данных для команды привязка.
▶️ -x keyseq:shell-команда – привязать команду. Команда оболочки shell-command будет выполнена bash, когда получит последовательность клавиш keyseq.
▶️ -X – перечислить последовательности клавиш, привязанные к -x, в форме, подходящей для ввода в bind.
🖼️ Ссылка на источник
🔨 bash_help8 729
⚙️ Process substitution в Bash
✔️Process substitution — это функция в Bash, которая позволяет использовать вывод команды или процесса в качестве входа для другой команды. Она помогает оптимизировать Bash-скрипты, уменьшив потребность во временных файлах и упростив сложные конвейеры
➡️ Синтаксис process substitution:
<(command). Создаёт именованный канал (FIFO) и подключает к нему вывод команды внутри скобок. Именованный канал ведёт себя как файл, что позволяет использовать его в качестве входа для другой команды.
>(command). Также создаёт именованный канал, но подключает его к входу команды внутри скобок. Это позволяет перенаправить вывод одной команды на вход другой команды.
➡️ Некоторые примеры использования process substitution для оптимизации Bash-скриптов:
▶️Сравнение вывода двух команд
Подстановку процесса можно использовать для сравнения вывода двух команд с помощью команды diff. Например, для сравнения вывода ls в двух разных каталогах:
diff <(ls dir1) <(ls dir2)
▶️Перенаправление вывода на несколько команд
Вы можете использовать подстановку процесса, чтобы отправить вывод команды нескольким командам. Например, чтобы отправить вывод ls и в grep, и в wc:
ls | tee >(grep 'txt$') >(wc -l) > /dev/null
▶️Цепочка процессов замены
Подстановку процессов можно объединить в цепочку для создания сложных конвейеров. Например, чтобы отсортировать и подсчитать слова в текстовом файле, а затем отобразить 10 самых распространенных слов:
cat file.txt | tr '[:space:]' '\n' | grep -v '^$' | sort | uniq -c | sort -nr | head -n 10
▶️Объединение и сортировка двух файлов
Предположим, у вас есть два отсортированных файла, file1.txt и file2.txt, и вы хотите объединить их в новый отсортированный файл, merged.txt . Вы можете использовать команду sort вместе с подстановкой процесса, чтобы добиться этого:
sort -m <(sort file1.txt) <(sort file2.txt) > merged.txt
▶️Отображение различий между деревьями каталогов
Вы можете использовать замену процессов для сравнения структуры каталогов двух каталогов с помощью команды tree и diff:
diff -y <(tree -fi dir1) <(tree -fi dir2)
▶️Фильтрация и сохранение записей журнала
Предположим, у вас есть файл журнала, и вы хотите извлечь записи, содержащие слово "ERROR", сохранить их в отдельный файл и отобразить на экране. Для этого можно использовать grep и tee с заменой процессов:
grep 'ERROR' logfile.txt | tee >(cat > errors.txt)
▶️Выполнение арифметических операций над столбцами CSV-файла
Вы можете использовать awk с подстановкой процессов для выполнения арифметических операций над столбцами CSV-файла. Например, чтобы сложить столбцы 2 и 3 CSV-файла и отобразить результат:
awk -F, '{ print $1, $2 + $3 }' <(cat file.csv)
▶️Объединение стандартного вывода и стандартной ошибки
Чтобы объединить стандартный поток вывода и стандартный поток ошибок в один поток, можно использовать замену процессов с помощью cat:
command 2> >(cat >&1)
В этом примере команда представляет команду, которую вы хотите выполнить. Подстановка процесса >(cat >&1) перенаправляет стандартный поток ошибок (файловый дескриптор 2) в стандартный поток вывода (файловый дескриптор 1).
➡️ Эти примеры иллюстрируют мощь и гибкость подстановки процессов в Bash. Понимая, как эффективно использовать эту функцию, вы можете создавать более сложные и эффективные скрипты.
🖼️ Ссылка на источник
🔨 bash_help8 729
🎓 Тренинги Zabbix Сертифицированный Специалист 7.0 и Zabbix Сертифицированный Профессионал — ответ на вопрос «как быстро получить самые полные знания по Zabbix 7.0».
@zabbix_ru — наш телеграм-канал, посвященный Zabbix и ничему кроме Zabbix.
Тренинги Zabbix — лучшая инвестиция, которую вы можете сделать для себя или своих коллег. Мы опросили участников предыдущих потоков и сформулировали основные преимущества от прохождения тренингов:
📖 устранить пробелы. Часто знания Zabbix ограничиваются эпизодическим изучением документации и фрагментарны. Курс поможет систематизировать знания и откроет для вас новые возможности уже знакомой системы мониторинга.
📖 делать своими силами. Участие подрядчиков в проектах внедрения подразумевает предоставление доступа в ваше окружение. Прохождение официальных курсов Zabbix на русском языке позволит вам выполнять работы своими силами.
📖 распространять знания. Сотрудники, получившие сертификат Zabbix, не просто совершенствуют свои собственные технические навыки — они привносят полученные знания в коллектив и делятся ими со своими коллегами.
📖 получить сертификат. Это официальный вендорский курс Zabbix, переведенный на русский язык. После прохождения курса у вас будет возможность сдать экзамен и получить сертификат. Сертификат подтверждает знания и дает дивиденды компании и мотивацию сотрудникам.
📖 получить компетенции. Курсы проводят сертифицированные тренеры и эксперты Zabbix, которые регулярно повышают свою компетенцию как путем прохождения дополнительного обучения, так и участием в проектах внедрения Zabbix.
Проведем 2 тренинга подряд в этом году. Далее только в новом 2025. Программа тренингов по ссылкам выше.
📅 Zabbix сертифицированный специалист 7.0 (ZCS 7.0) 11-15 ноября
📅 Zabbix сертифицированный профессионал 7.0 (ZCP 7.0) 18-20 ноября
Подробную информацию вы можете запросить, написав @galssoftware или через почту welcome@gals.software.
8 729
⚙️ Мониторинг перебора паролей на почту
✔️Мониторинг перебора паролей на почту позволяет оценить, сколько недоброжелателей пытается подбирать пароли к вашей почте. Рассмотрим на примере почтового сервера dovecot как можно собирать статистику по тому, сколько попыток перебора было сделано с тех или иных адресов. После сбора статистики с полученными адресами можно сделать всё, что посчитаете нужным. Например, заблокировать трафик с этих адресов при помощи iptables. Или заняться исследованиями атакующих.
▶️Для работы с информацией будем использовать bash-скрипты, чтобы фильтровать информацию, и планировщик
cron, чтобы выполнять анализ по расписанию и высылать результат вам на почту. Результат будем сохранять в отдельном файле на каждый день и в одном файле будем собирать всю информацию. Саму информацию представим в виде двух значений — количество попыток и IP-адрес. Таким образом мы можем посмотреть заодно, правильно ли работает fail2ban и сколько попыток залогиниться на почтовый сервер проходит за сутки.
➡️ Сбор статистической информации
▶️Для получения информации будем использовать логи почтового сервера, в которых регистрируются попытки подключения к почтовому серверу. Вот что нам нужно. Из лога аутентификации будем отфильтровывать ошибки аутентификации и считать для IP-адресов, при обращении с которых происходили ошибки, количество попыток. После размещения скрипта в cron’е вам на почту будет приходить каждый день письмо со статистикой атак. Рассмотрим аутентификацию почтового сервера dovecot, но вы можете поправить скрипт под свои нужды.
➡️ Мониторинг перебора паролей
▶️Напишем скрипт на bash, который будет фильтровать логи.
#!/bin/bash
# Название файла с адресами, включающее дату
IP_BLACKLIST="/root/scripts/blacklist-`date "+%Y-%m-%d"`.lst"
# Фильтрация ошибок аутентификации
CURRENT_DATE=`date "+%b %d"`
grep "dovecot:auth" /var/log/auth.log \
| grep "authentication failure" \
| grep "$CURRENT_DATE" \
| cut -d" " -f 14 \
| sed 's/rhost=//' \
| sort | uniq -c >> $IP_BLACKLIST
# Добавление в большой список только IP-адресов из сегодняшнего лога
awk '{print $2}' $IP_BLACKLIST >> /root/scripts/blacklist-full.lst
# После добавления сортируем и убираем неуникальные адреса
cat /root/scripts/blacklist-full.lst | sort | uniq >> /root/scripts/blacklist-full.lst.new
rm /root/scripts/blacklist-full.lst
mv /root/scripts/blacklist-full.lst.new /root/scripts/blacklist-full.lst
# Выводим сегодняшний лог
cat $IP_BLACKLIST
▶️Можно добавить также автоматическое удаление файла лога, если он пустой. Кроме того, можно здесь же удалять адреса, которые принадлежат вам.
▶️После написания скрипта необходимо его записать в крон, чтобы он выполнялся по расписанию. Когда будут неудачные попытки аутентификации, вам будет приходить письмо со списком и количеством попыток, если их не будет, то письмо тоже не будет приходить. Добавим для этого в файл /etc/crontab следующую строчку:
55 23 * * * root /root/scripts/check-auth-errors.sh➡️ Блокировка перебора при помощи iptables ▶️Для блокировки при помощи
iptables можно написать еще один скрипт, которым можно блокировать адреса из ежедневного лога:
#!/bin/bash
IPLIST=$(awk '{print $2}' $1)
for IP in ${IPLIST}
do
echo -n Blocking ${IP} ...
iptables -t filter -A INPUT -s ${IP} -j DROP
echo Done
done
🖼️ Ссылка на источник
🔨 bash_help8 729
Станьте разработчиком нейро-сотрудников на Python и зарабатывайте от 150.000р в месяц 🔥🔥🔥
Мы научим вас создавать топовых нейро-сотрудников на базе GPT-4 Omni, и вы сможете:
1️⃣ Устроиться разработчиком в крупную компанию и зарабатывать от 150 тысяч ₽ в месяц
2️⃣ Разрабатывать такие проекты на заказ и зарабатывать от 500 тысяч ₽ за проект
3️⃣ Создать нейро-сотрудника в вашей компании и вырасти на +30-100% в зарплате
Что будет на интенсиве?
🧬 Теория: как создаются нейро-сотрудники с GPT-4o на Python
🧬 Практика: мы создадим нейро-консультанта, нейро-HR, нейро-маркетолога и др.
Ведущий интенсива - Senior AI разработчик нейросетей и основатель Университета искусственного интеллекта
🔥 Регистрируйтесь на бесплатный интенсив! Встречаемся в ближайший четверг!
8 729
⚙️ ipbash — функции для работы с IP и подсетями
✔️Функции, представленные здесь, могут пригодиться для объединения нескольких списков ip-адресов или подсетей, полученных из разных источников, допустим, для бана.
▶️С помощью ENTRYIP, можно убрать подсети, которые перекрывают друг-друга — например подсеть 192.168.1.0/24 входит в подсеть 192.168.0.0/23. И для бана достаточно будет оставить только последнюю.
▶️А если в списке есть еще подсеть 192.168.2.0/23, то с помощью функции MERGESUBNETS можно объединить подсети 192.168.0.0/23 192.168.2.0/23 в одну 192.168.0.0/22, уменьшив список и увеличив скорость работы фильтра.
➡️ Все функции написаны на чистом bash, без использования сторонних программ, поэтому скорость выполнения не очень большая, но они будут работать, где есть bash.
🐙 Перейти на Github
🔨 bash_help
8 729
Как разрабатывать и настраивать Grafana Stack для эффективного визуализирования метрик и логов?
🔹Расскажем на открытом уроке «Grafana Stack: закрываем все современные потребности Observability», урок приурочен к курсу «Observability: мониторинг, логирование, трейсинг» от Otus.
Рассмотрим ключевые компоненты Grafana Stack и их роли в Observability.
Настроим интеграции с различными системами для получения актуальных данных.
✅ Практика: Создание настраиваемых дашбордов и алертов, для эффективного управления производительности и надежности сервисов
👉 Регистрация и подробности:
https://otus.pw/6D1pa/?erid=LjN8KcNUf
#реклама
О рекламодателе
8 729
⚙️ lssh
✔️Клиент SSH/SCP/SFTP на основе списка, поддерживающий одиночные и параллельные соединения, локальное использование
bashrc на удаленных машинах и расширенное проксирование.
➡️ Эта командная утилита для чтения заранее подготовленного списка и подключения ssh/scp/sftp к выбранному хосту. Файл списка задается в формате yaml. При выборе хоста можно фильтровать по ключевым словам. Может выполнять команды одновременно для нескольких хостов.
🐙 Перейти на Github
🔨 bash_help8 729
🟡 Сравнение российских платформ виртуализации
Функционал. Эксплуатация. Преимущества и недостатки.
3 года тестируем и исследуем российские платформы виртуализации.
Собрали весь материал в одном посте⬇️
🔄СРАВНИТЕЛЬНЫЕ ИССЛЕДОВАНИЯ
2022: сравнение шести платформ
2024: характеристики одиннадцати платформ
🔄ТЕСТИРОВАНИЕ ПЛАТФОРМ
2022-2023 год:
Astra Linux, «Брест»
zVirt
Альт сервер виртуализации на базе OpenNebula
Альт сервер виртуализации на базе Proxmox
РЕД виртуализация
РУСТЭК
2024 год:
zVirt
SpaceVM
Numa vServer
🔄ОПЫТ ВНЕДРЕНИЯ
VMware по-русски: как мы внедряли отечественные платформы виртуализации
Как электросети переехали в частные облака и на российскую виртуализацию
🔄ТЕСТИРОВАНИЕ VDI
ВРС на базе Basis.Workplace + Р-Платформа
ВРС на базе Termidesk + zVirt
SPACE VDI
➡️ Подписывайтесь
8 729
⚙️ 5 вариантов генерации конфигурационных файлов Shell-скриптами
✔️Подготовка конфигурационных файлов из шаблонов — весьма распространённая задача системного администрирования. Решать её можно разными способами, каждый из которых хорош по-своему, здесь же мы рассмотрим, как это сделать с помощью Shell-скриптов.
▶️Наше исследование проведём в виде решения типовой задачи, в которой необходимо создать Shell-скрипт, генерирующий конфигурационный файл с настройками сетевого стека узла. Формат конфигурационного файла соответствует
/etc/network/interfaces. Примем, что настраиваемый узел обладает только одним сетевым интерфейсом с именем «ens33». Скрипт должен обеспечивать возможность указания статического IP-адреса, маски подсети и шлюза по умолчанию.
▶️С учётом вышесказанного получаем следующий шаблон конфигурационного файла:
auto ens33 iface ens33 inet static address ЗНАЧЕНИЕ_IP_АДРЕСА netmask ЗНАЧЕНИЕ_МАСКИ_СЕТИ gateway ЗНАЧЕНИЕ_ШЛЮЗА_ПО_УМОЛЧАНИЮ▶️Для дальнейших примеров договоримся, что IP адрес установим в 192.168.0.10, маску подсети 255.255.255.0, а шлюз по умолчанию 192.168.0.1. ➡️ Размещение шаблона внутри скрипта, формирование вывода стандартными средствами Самый простой вариант решения задачи, которым обычно пользуются начинающие разработчики, — это поместить шаблон в тело скрипта и использовать локальные переменные в качестве подстановочных значений.
#!/bin/bash
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
TEMPLATE="$(
cat << EOF
auto ens33
iface ens33 inet static
address $IP
netmask $NETMASK
gateway $GATEWAY
EOF
)"
echo -e "$TEMPLATE"
▶️Результат работы скрипта (как и всех следующих) будет выглядеть так:
auto ens33 iface ens33 inet static address 192.168.0.10 netmask 255.255.255.0 gateway 192.168.0.1▶️Данный вариант решения всем хорош, за исключением того, что человеческие ошибки (опечатки и прочие), которые могут возникнуть при внесении изменений в шаблон, могут «сломать» скрипт. Поэтому архитектурно более правильным решением будет разнести скрипт и шаблон по разным файлам. ▶️Внимательный читатель может заметить, что мы устанавливаем значения переменных в теле скрипта, и что для генерации следующего конфигурационного файла, с другими настройками всё равно потребуется вносить изменения в скрипт. Да, это так, но сделано это намеренно, для упрощения. Никто же не мешает нам усложнить скрипт и, скажем, реализовать в нём пользовательский интерфейс ввода значений переменных с консоли. ➡️ Размещение шаблона во внешнем файле и его заполнение с помощью envsubst Создадим файл шаблон «template.txt» следующего содержания:
auto ens33 iface ens33 inet static address $IP netmask $NETMASK gateway $GATEWAY▶️Для заполнения шаблона воспользуемся утилитой
envsubst, которая ищет во входящем потоке строки вида $имя_переменной или ${имя_переменной} и заменяет их на значение соответствующих переменных. Важно отметить, что для работы этой утилиты переменные должны быть отмечены ключевым словом export. С учётом всего вышесказанного наш скрипт будет выглядеть следующим образом:
#!/bin/bash
export IP="192.168.0.10"
export NETMASK="255.255.255.0"
export GATEWAY="192.168.0.1"
envsubst < template.txt
🖼️ Дочитать статью на Habr'e
🔨 bash_help
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
