BashTex | Linux – Telegram
BashTex | Linux
2.57K subscribers
48 photos
9 videos
293 links
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.

Подойдет для разработчиков, системных администраторов и DevOps

Реклама: @dad_admin
Download Telegram
Установка разрешений по умолчанию

В Linux, когда создаются новые файлы или директории, им автоматически назначаются определенные права доступа. Эти права регулируются с помощью утилиты umask, которая задает маску доступа по умолчанию. Понимание работы umask позволяет администратору управлять правами доступа и обеспечивать безопасность данных.

Что такое umask?

umask определяет, какие разрешения не будут устанавливаться при создании нового файла или директории. Она представляет собой побитовую маску, которая вычитает определенные права доступа из максимальных возможных прав.


Для файлов: максимальные разрешения - 666 (rw-rw-rw-).
Для директорий: максимальные разрешения - 777 (rwxrwxrwx).

1. Проверка текущего значения umask:


umask


Вывод, например, 0022, означает, что новые файлы будут создаваться с правами 644 (rw-r--r--), а директории — с правами 755 (rwxr-xr-x).

2. Настройка umask для текущей сессии: Чтобы установить umask так, чтобы новые файлы создавались с правами 664 (rw-rw-r--), а директории с правами 775 (rwxrwxr-x):


umask 0002


3. Постоянное изменение umask: Чтобы изменить umask для всех пользователей и сеансов, добавьте строку в файл ~/.bashrc, ~/.profile или /etc/profile:


umask 0027


После этого новые файлы будут создаваться с правами 640 (rw-r-----), а директории — с 750 (rwxr-x---), что ограничивает доступ для других пользователей.

Как работает umask? Маска umask вычитает указанные права из максимальных значений:

Файл с umask 0022:
Максимальные права 666 → 644 (rw-r--r--).
Директория с umask 0022:
Максимальные права 777 → 755 (rwxr-xr-x).


Настройка umask особенно важна для многопользовательских систем, где необходимо ограничить доступ к создаваемым файлам и папкам. Например, umask 0077 подходит для случаев, когда файлы должны быть доступны только их владельцу (права 600 для файлов и 700 для директорий).

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Умная оболочка для повседневных задач

insh - это попытка объединить возможности традиционных shell'ов с интеллектуальными функциями, которые обычно ассоциируются с современными текстовыми редакторами и IDE. Основные цели insh — минимизация ошибок, повышение продуктивности и улучшение пользовательского опыта.

Ключевые возможности:

Интеллектуальные подсказки и автодополнение: insh поддерживает контекстуальные подсказки, которые помогают пользователю понять, какие команды и параметры доступны в текущем контексте. Например, при вводе ls или grep, оболочка подскажет доступные ключи и параметры, что облегчает запоминание.

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

История команд с улучшенным поиском: insh позволяет легко находить ранее использованные команды с помощью мощной функции поиска по истории. Команды можно искать не только по первому символу, но и по ключевым словам.

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



Установка insh. Для начала работы необходимо установить insh. Обычно оболочка доступна в официальных репозиториях, но можно использовать и GitHub для последней версии:


git clone https://github.com/intellishell/insh.git
cd insh
sudo make install


Пример работы с insh. После установки введите insh для запуска оболочки:


insh


В процессе работы начните ввод команды, например, tar, и insh предложит автодополнение с объяснением ключей:


tar -[option] [file]
Options:
-c Create a new archive
-x Extract files from an archive
-t List the contents of an archive


А теперь коротко про ключевые фишки, зачем оно нужно и чем помогает:

Поддержка скриптов: insh может использоваться для написания скриптов, где автодополнение и проверка синтаксиса помогают избежать ошибок.

Модульность: оболочка поддерживает плагины и расширения, которые можно установить для добавления новых функций.

Совместимость: insh совместим с большинством стандартных команд и утилит Linux.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤨1
Тестируем производительность серверов

YABS (Yet Another Benchmark Script) - популярный скрипт для быстрого тестирования производительности серверов. Он предназначен для оценки дисковой производительности, пропускной способности сети и производительности процессора. YABS прост в использовании, и его можно запустить всего одной командой.


YABS проверяет:

Производительность процессора с помощью sysbench.
Скорость дисковых операций (I/O) для SSD и HDD.
Сетевую пропускную способность через iperf3, тестируя скорость связи с различными узлами.

Установка и запуск YABS. Запуск YABS осуществляется без предварительной установки, достаточно использовать команду curl или wget:


curl -sL yabs.sh | bash


или


wget -qO- yabs.sh | bash


Что вы получите? После выполнения скрипта вы получите подробный отчет, который включает:

Результаты теста CPU: количество операций за секунду (OPS).
Результаты дисковых операций: скорость чтения и записи.
Скорость сети: измерения скорости загрузки и выгрузки данных с разных серверов по всему миру.

Ссылка на GitHub 📱

BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🗿1
Шпаргалка по bash

Шпаргалка поможет вам не только ознакомиться с базовой терминологией скриптинга, но и с вычиткой параметров из файла, хэндлинг сигналов (SIGTERM) и проч. Та самая полезная сохраненка.

BashTex 📱 #bash
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Перенос больших файлов с помощью SCP

SCP - это отличный инструмент для переноса данных, однако при работе с большими файлами могут возникать определенные проблемы, такие как прерывание соединения или медленная скорость передачи. В этой статье рассмотрим, как эффективно использовать scp для передачи больших файлов.

Обычный перенос данных осуществляется так:


scp logs.tar user@192.168.1.10:/project/logs/


Но как быть если архив большой? Одно из решений - сжатие данных. Используйте флаг -C, чтобы сжать данные во время передачи. Это может значительно ускорить передачу, особенно для текстовых и плохо сжатых файлов:


scp -C logs.tar user@192.168.1.10:/project/logs/


Другие полезные фишки:

Ограничение скорости передачи. Чтобы избежать перегрузки сети, можно ограничить скорость передачи с помощью флага -l (в килобитах в секунду):


scp -l 5000 logs.tar user@192.168.1.10:/project/logs/


Здесь -l 5000 ограничивает скорость до 5000 Кбит/с (примерно 625 КБ/с).

Перезапуск передачи после сбоя. Если передача файла была прервана, ее нужно начать заново. Однако, чтобы избежать этого, лучше использовать rsync, который поддерживает продолжение передачи с места остановки:


rsync --partial --progress logs.tar user@192.168.1.10:/project/logs/


---

Альтернативой scp является rsync, который поддерживает:

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


Пример использования rsync:


rsync -avP logs.tar user@192.168.1.10:/project/logs/


Флаг -P включает отображение прогресса и позволяет продолжить передачу при прерывании.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Настройка безопасного SSH-соединения

SSH - это основной инструмент для безопасного управления серверами и обмена данными в сети. Однако, чтобы минимизировать риски и усилить защиту сервера, необходимо настроить SSH-соединение с дополнительными мерами безопасности. В этой статье разберем ключевые шаги для улучшения безопасности SSH.

1. Отключение входа по паролю. Использование паролей может быть уязвимо к атакам типа brute-force. Настройка входа по SSH-ключам делает подключение гораздо более защищенным.

Создание SSH-ключа:


ssh-keygen -t rsa -b 4096


Добавление ключа на сервер:


ssh-copy-id user@server_ip


После успешного добавления ключа, в файле /etc/ssh/sshd_config измените строку: PasswordAuthentication no

2. Изменение стандартного порта SSH. Для предотвращения автоматизированных сканирований лучше изменить стандартный порт с 22 на менее очевидный.

Измените строку в файле /etc/ssh/sshd_config: Port 2222

Перезапустите SSH:

sudo systemctl restart ssh


3. Ограничение входа по IP-адресам. Если возможно, настройте брандмауэр для разрешения подключения к SSH только с определенных IP-адресов.

Используйте ufw для настройки правил:


sudo ufw allow from 192.168.1.100 to any port 2222
sudo ufw enable


4. Настройка двухфакторной аутентификации (2FA). Установка двухфакторной аутентификации добавляет дополнительный уровень защиты.

Установите Google Authenticator:


sudo apt install libpam-google-authenticator


Настройте PAM для использования 2FA, добавив строку в /etc/pam.d/sshd: auth required pam_google_authenticator.so

5. Ограничение числа попыток подключения. Используйте fail2ban для защиты от атак грубой силы.

Установите fail2ban:


sudo apt install fail2ban


Настройте его в /etc/fail2ban/jail.local:

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3


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

В файле /etc/ssh/sshd_config измените: PermitRootLogin no

Комбинация использования SSH-ключей, изменения порта, ограничения доступа и дополнительных мер, таких как 2FA и fail2ban, делает ваш сервер значительно менее уязвимым к атакам.

BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Углубленное использование find

find - это одна из мощных команд в арсенале Linux, которая позволяет находить файлы и каталоги по множеству критериев. Применяя её в комбинации с другими утилитами и флагами, вы можете добиться впечатляющих результатов и автоматизировать рутинные задачи.

Пример базового поиска всех файлов с расширением .txt в текущем каталоге:


find . -name "*.txt"


Но что если задача чуть сложнее, чем просто найти файлы с одним расширением?

1. Поиск по времени изменения и доступа. find может искать файлы по дате их изменения или доступа:

Файлы, измененные за последние 7 дней/Файлы, доступ к которым был более 30 дней назад:

find /path/to/dir -mtime -7
find /path/to/dir -atime +30


2. Поиск по размеру. Если вам нужно найти файлы определенного размера/Файлы меньше 1 КБ:


find /path/to/dir -size +100M
find /path/to/dir -size -1k


3. Поиск по типу файла. find может искать определенные типы файлов:

Только каталоги/Только обычные файлы:


find /path/to/dir -type d
find /path/to/dir -type f


4. Комбинирование условий. С помощью логических операторов можно комбинировать разные условия:

Поиск файлов .log, измененных за последние 3 дня:


find /path/to/dir -name "*.log" -mtime -3


Исключение определенных файлов:


find /path/to/dir -type f ! -name "*.bak"


5. Выполнение действий с найденными файлами. find поддерживает выполнение команд с найденными файлами:

Удаление файлов старше 30 дней/Сжатие найденных файлов:


find /path/to/dir -type f -mtime +30 -exec rm {} \;
find /path/to/dir -name "*.log" -exec gzip {} \;


6. Использование find с xargs для повышения производительности. Для более эффективной обработки большого количества файлов используйте xargs:

Удаление всех файлов .tmp с помощью xargs:


find /path/to/dir -name "*.tmp" | xargs rm


Бонусом, полезные флаги:

-maxdepth N: Ограничивает глубину поиска.
-mindepth N: Исключает файлы выше указанной глубины.
-print0 и xargs -0: Обработка имен файлов с пробелами.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Управление облачным хранилищем Backblaze B2 из командной строки

Backblaze B2 - одно из самых доступных и надежных облачных хранилищ, а утилита b2-tools позволяет работать с ним прямо из терминала. Это мощный инструмент для разработчиков, системных администраторов и всех, кто хочет автоматизировать работу с B2.

b2-tools - это CLI-утилита, предоставляемая Backblaze, которая позволяет:

Загружать и скачивать файлы.
Управлять хранилищами (buckets).
Настраивать права доступа и политики хранения.
Мониторить использование ресурсов


В этой статье рассмотрим установку, настройку и базовые команды для работы с b2-tools.

1. Установка b2-tools:

Убедитесь, что у вас установлен Python 3, а затем установите b2-tools через pip:


pip install b2


2. Настройка подключения. Для работы с B2 вам понадобятся Account ID и Application Key, которые можно получить в панели управления Backblaze.

Настройте утилиту:


b2 authorize-account


Введите ваши Account ID и Application Key, после чего утилита сохранит настройки авторизации.

3. Работа с хранилищами (buckets). Создание нового хранилища:


b2 create-bucket my-new-bucket allPrivate


Где allPrivate указывает, что файлы будут приватными (можно указать allPublic для публичного доступа).

Список основных команд:

b2 list-buckets - список всех хранилищ

b2 delete-bucket my-old-bucket - удаление хранилища

b2 upload-file my-bucket /path/to/local/file.txt file.txt - загрузка файла в хранилище

b2 download-file-by-name my-bucket file.txt /path/to/save/file.txt - скачивание файла

b2 delete-file-version file.txt FILE_ID - удаление файла из хранилища, где FILE_ID можно получить через команду b2 list-file-versions.

b2 get-account-info - мониторинг использования


---

Скрипт для загрузки всех файлов из директории:


for file in /path/to/dir/*; do
b2 upload-file my-bucket "$file" "$(basename $file)"
done


Можете интегрировать с Cron для автоматизированного резервного копирования:


0 2 * * * /usr/bin/b2 upload-file my-bucket /path/to/backup.tar.gz backup.tar.gz


И напоследок, перед загрузкой файлов можете зашифровать их с помощью gpg:


gpg -c file.txt
b2 upload-file my-bucket file.txt.gpg file.txt.gpg


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
This media is not supported in your browser
VIEW IN TELEGRAM
Альтернатива команде tree

tre - это модернизированная версия команды tree, которая упрощает визуализацию файловой структуры. Она создана для тех, кто ценит удобство, скорость и красоту вывода в терминале.

Особенности tre:

Красивый цветной вывод.
Интеграция с Git: отображение состояния файлов (измененные, новые и т.д.).
Минималистичный и понятный интерфейс.
Поддержка фильтров для исключения ненужных файлов.


Установка:

git clone https://github.com/dduan/tre
cd tre
cargo build --release


Показ скрытых файлов: tre -a

Интеграция с Git: tre -g

tre делает вывод удобным и современным, добавляя цветовые акценты и полезную информацию (например, Git-статусы). Это отличный инструмент для всех, кто работает с большими проектами и хочет видеть структуру файлов "с первого взгляда".

Ссылка на GitHub 📱

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Удаляем особые режимы разрешений в Linux: SUID, SGID и Sticky bit

Файловая система Linux позволяет настраивать специальные режимы разрешений, такие как SUID, SGID, и Sticky bit. Эти флаги предоставляют дополнительные привилегии или ограничения для работы файлов и каталогов, но иногда их нужно удалить, чтобы избежать потенциальных уязвимостей или ошибок.

В этой статье разберём, что означают эти режимы и как безопасно их удалять.

Что такое SUID, SGID и Sticky bit?

SUID (Set User ID):
Позволяет запускать файл с правами владельца, а не текущего пользователя.
Пример: /usr/bin/passwd.

SGID (Set Group ID):
Для файлов: позволяет запускать файл с правами группы-владельца.
Для директорий: все новые файлы и папки наследуют группу родительской директории.

Sticky bit:
Обычно используется для директорий, таких как /tmp. Позволяет удалять файлы только владельцу, даже если папка доступна для записи всем.


1. Как определить наличие специальных флагов? Используйте команду ls с опцией -l:


ls -l file_or_directory


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


-rwsr-xr-x 1 root root 12345 Oct 28 10:00 suid_file
drwxrwsr-x 2 user group 4096 Oct 28 10:00 sgid_dir
drwxrwxrwt 2 user group 4096 Oct 28 10:00 sticky_dir


s в правах владельца (rws) указывает на SUID.
s в правах группы (rws) указывает на SGID.
t в правах других пользователей (rwt) указывает на Sticky bit.

Удаление специальных режимов

1. Удаление SUID

Команда удаления и проверка:


chmod u-s suid_file
ls -l suid_file




-rwxr-xr-x 1 root root 12345 Oct 28 10:00 suid_file


2. Удаление SGID

Команда и проверка:


chmod g-s sgid_dir
ls -ld sgid_dir


Вывод:


drwxrwxr-x 2 user group 4096 Oct 28 10:00 sgid_dir


3. Удаление Sticky bit

Команда и проверка:


chmod o-t sticky_dir
ls -ld sticky_dir


Вывод:


drwxrwxr-x 2 user group 4096 Oct 28 10:00 sticky_dir


Автоматическое удаление флагов с группой файлов. Создадим скрипт для массового удаления специальных флагов:


#!/bin/bash

for file in "$@"; do
echo "Удаляем специальные флаги с $file"
chmod u-s,g-s,o-t "$file"
done


Сохраните скрипт, например, как remove_flags.sh, и не забудьте сделать его исполняемым:


chmod +x remove_flags.sh


Теперь его можно запускать для нескольких файлов:


./remove_flags.sh file1 file2 dir1


Когда стоит удалять специальные флаги?

Устаревшие файлы: Удаляйте SUID/SGID у устаревших программ, которые больше не используются.
Безопасность: SUID/SGID могут быть использованы злоумышленниками для эскалации привилегий.
Упрощение управления: Удаление Sticky bit может быть полезным, если директория больше не используется как общедоступная.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
df: нестандартное использование

df (disk free) — это команда, которая отображает информацию о свободном и занятом месте на файловых системах. Обычно её используют для быстрого просмотра дискового пространства, но в этой статье мы посмотрим на нестандартное использование команды df в bash-скриптах для автоматизации задач.

Базовая команда с примером вывода:


df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 20G 60% /
tmpfs 2.0G 1.0M 2.0G 1% /dev/shm
/dev/sdb1 100G 50G 50G 50% /mnt/data


Флаг -h показывает размеры в удобных для чтения единицах (MB, GB).

1. Уведомление при малом свободном месте. Скрипт для проверки свободного места и отправки уведомления, если оно меньше заданного порога.


#!/bin/bash

# Установим порог свободного места (в процентах)
THRESHOLD=80

# Проверяем каждый раздел
df -h | awk 'NR>1 {sub("%", "", $5); if ($5 > ENVIRON["THRESHOLD"]) print $0}' | while read -r line; do
echo "Внимание! Диск переполнен: $line" | mail -s "Диск почти заполнен" admin@bashtex.com
done


Как работает: awk извлекает колонку с использованием (Use%) и сравнивает её с пороговым значением. Если оно превышено, отправляется уведомление.

2. Удаление временных файлов при переполнении. Скрипт для автоматического удаления файлов в /tmp, если свободное место на / меньше 20%.


#!/bin/bash

# Устанавливаем порог
THRESHOLD=20

# Получаем свободное место на /
FREE=$(df / | awk 'NR==2 {sub("%", "", $5); print 100 - $5}')

if [ "$FREE" -lt "$THRESHOLD" ]; then
echo "Мало места на корневом разделе. Удаляю старые файлы в /tmp..."
find /tmp -type f -mtime +7 -delete
echo "Очистка завершена!"
else
echo "Места достаточно: $FREE% свободно."
fi


Как работает: скрипт проверяет, сколько процентов свободного места на корневом разделе, и удаляет файлы старше 7 дней в папке /tmp, если места мало.

3. Мониторинг использования дисков в реальном времени. Скрипт для отображения изменений в свободном месте на диске каждые 5 секунд.


#!/bin/bash

echo "Мониторинг свободного места (каждые 5 секунд):"

while true; do
clear
df -h
sleep 5
done


Как работает: бесконечный цикл обновляет вывод df -h каждые 5 секунд, что позволяет отслеживать изменения в реальном времени.

4. Логирование дискового пространства. Скрипт для записи информации о дисковом пространстве в лог-файл с указанием времени.


#!/bin/bash

LOG_FILE="/var/log/disk_usage.log"

# Логирование состояния дисков
df -h | awk -v date="$(date '+%Y-%m-%d %H:%M:%S')" 'NR==1 {print "Дата:", date; print $0} NR>1 {print}' >> "$LOG_FILE"

echo "Данные записаны в $LOG_FILE"


Как работает: каждая запись логирует текущее состояние дисков с указанием даты и времени. Подробнее о том, зачем это нужно и как применять поговорим завтра.

---

Небольшие советы по использованию df в скриптах:

Используйте флаг -P для более удобного форматирования вывода, если обрабатываете данные через awk или grep.
Комбинируйте df с другими утилитами (find, mail, cron) для автоматизации задач.
Периодически проверяйте скрипты на корректность, чтобы избежать случайного удаления важных данных.


BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤨1
Логирование дискового пространства в Linux: автоматизация и контроль

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

Почему это важно?

Предотвращение проблем: Заранее узнавайте о нехватке места.
Анализ трендов: Отслеживайте, как быстро растёт использование места.
Автоматизация: Система сама уведомляет о критических ситуациях.


1. Создаём систему логирования дискового пространства. Базовый скрипт для логирования:


#!/bin/bash

LOG_FILE="/var/log/disk_usage.log"

# Текущая дата и время
CURRENT_DATE=$(date '+%Y-%m-%d %H:%M:%S')

# Состояние дисков
DISK_USAGE=$(df -h)

# Запись в лог-файл
{
echo "-----"
echo "Дата: $CURRENT_DATE"
echo "$DISK_USAGE"
} >> "$LOG_FILE"

echo "Логирование завершено. Данные записаны в $LOG_FILE"


Вывод в файле /var/log/disk_usage.log:


-----
Дата: 2024-11-05 14:00:00
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 20G 60% /
tmpfs 2.0G 1.0M 2.0G 1% /dev/shm
/dev/sdb1 100G 50G 50G 50% /mnt/data


2. Автоматизация через cron. Добавьте скрипт в crontab, чтобы запускать его ежедневно:


crontab -e


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


0 0 * * * /path/to/disk_logger.sh


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

3. Уведомления при критическом состоянии. Модифицируем скрипт для отправки уведомлений, если свободного места становится меньше 20%.


#!/bin/bash

LOG_FILE="/var/log/disk_usage.log"
THRESHOLD=20

# Проверка разделов
df -h | awk -v date="$(date '+%Y-%m-%d %H:%M:%S')" -v threshold="$THRESHOLD" 'NR>1 {gsub("%", "", $5); if ($5 > (100-threshold)) print date, $0}' | while read -r line; do
echo "Критическое состояние диска: $line" >> "$LOG_FILE"
echo "$line" | mail -s "Уведомление: мало места на диске" admin@bashtex.com
done


Если свободного места станет меньше 20%, лог будет дополнен, а администратору отправлено уведомление.

4. Анализ роста использования пространства:


grep "/dev/sda1" /var/log/disk_usage.log | awk '{print $2, $3, $5}' | tail


Визуализация:
Сохраните данные в CSV для анализа:


grep "/dev/sda1" /var/log/disk_usage.log | awk '{print $1, $5}' > disk_usage.csv


Затем откройте CSV в Excel или LibreOffice для построения графиков.

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

BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Бесполезно - полезная команда

Когда-нибудь слышали про true? На первый взгляд, команда true в Linux кажется бесполезной: она просто возвращает успешный код выхода (0). Но за этой простотой скрывается мощный инструмент, который можно применять в сложных сценариях автоматизации и написании нестандартных команд.

Что делает true? true возвращает успешный статус и ничего больше.


true
echo $?
0


Но давайте разберемся, где применяется true и какое применение ей можно найти.

1. Бесконечные циклы без условий. Вместо громоздкого while [ 1 ]; do, используйте true для создания чистого бесконечного цикла:


while true; do
echo "Работаем!"
sleep 1
done


2. Заглушки для тестирования. Если вы пишете скрипт и определённые команды ещё не готовы, используйте true как временную заглушку:


Копировать код
#!/bin/bash

echo "Шаг 1: Выполнен"
true # В будущем замените на реальную команду
echo "Шаг 2: Выполнен"


3. Условные команды без выполнения. Иногда нужно выполнить что-то только при ошибке. Вместо добавления условий используйте true как пустую команду:


mkdir /tmp/test || true



4. Условное выполнение с && и ||


[ -d /tmp/test ] && echo "Папка существует" || true


Если папка существует, выводится сообщение. Если нет, ничего не происходит.

5. Отключение alias в сценариях. Чтобы убедиться, что используется реальная команда, а не alias:


true && /bin/ls


Это полезно, если ls переопределён.

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


cp важный_файл.txt /куда-то/ || true


Файл копируется, но ошибки игнорируются.

На самом деле, по итогу команда true - это простой, но очень гибкий инструмент. Она идеально подходит для упрощения циклов, тестирования скриптов и построения сложных сценариев с условным выполнением команд. Если вы хотите писать лаконичный и читаемый код - не забывайте про этого незаменимого помощника.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Инструмент для работы с электронной почтой в Linux

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

Основные возможности mailx:

Отправка писем с вложениями.
Поддержка SMTP-серверов.
Интеграция в bash-скрипты для автоматизации.
Чтение входящих писем.


1. Отправка простого письма:


echo "Привет, это тестовое письмо!" | mailx -s "Тестовое письмо" user@bashtex.com


-s: заголовок письма.
user@bashtex.com: получатель.

Результат: заголовок "Тестовое письмо" и телом "Привет, это тестовое письмо!".

2. Отправка письма с вложением. Для отправки файла в качестве вложения используйте флаг -a:


echo "Смотрите вложение." | mailx -s "Файл во вложении" -a /path/to/file.txt user@bashtex.com


Пример вывода у получателя:

Тема: Файл во вложении.
Текст: Смотрите вложение.
Прикреплённый файл: file.txt.

3. Использование SMTP-сервера. Настройка SMTP-сервера позволяет отправлять письма через внешние почтовые сервисы (например, Gmail):

Добавьте настройки в файл ~/.mailrc:


set smtp-use-starttls
set ssl-verify=ignore
set smtp=smtp://smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=your_email@gmail.com
set smtp-auth-password=your_password
set from="your_email@gmail.com"


Теперь отправка письма будет происходить через SMTP:


echo "Почта через SMTP!" | mailx -s "SMTP тест" user@example.com


4. Автоматическая отправка отчётов. mailx отлично подходит для автоматизации. Например, отправка отчёта о состоянии дисков:


#!/bin/bash

DISK_USAGE=$(df -h)
echo "$DISK_USAGE" | mailx -s "Ежедневный отчёт о дисках" admin@example.com


5. Чтение почты. Если настроен локальный почтовый сервер, mailx можно использовать для чтения входящих сообщений:


mailx


Навигация по письмам:

Нажмите ? для списка доступных команд.
Используйте номер письма для чтения, например:


& 1


При всей своей простоте mailx позволяет отправлять уведомления, автоматизировать отчёты или выполнять простое чтение писем. Если вы ищете лёгкий и надёжный способ управлять почтой в Linux, то mailx будет верным помощником.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Отправка SMS с помощью утилит Linux

Хотите отправлять SMS прямо из Linux? Это полезно для автоматизации уведомлений, мониторинга или личного использования. Рассмотрим, как настроить и использовать популярную утилиту gammu для отправки SMS.

Gammu - это важный инструмент для работы с мобильными телефонами или GSM-модемами. Он позволяет:

Отправлять SMS и MMS.
Управлять контактами и календарями.
Работать с USSD-командами.


1. Подключите устройство: GSM-модем или телефон через USB.

2. Настройка Gammu. Определите порт подключения устройства:


ls /dev/tty*


Обычно модем определяется как /dev/ttyUSB0.

3. Сконфигурируйте gammu:

Создайте файл ~/.gammurc:


[gammu]
device = /dev/ttyUSB0
connection = at


4. Проверьте связь с устройством:


gammu --identify


Ожидаемый вывод:


Device : /dev/ttyUSB0
Manufacturer : Huawei
Model : E173 (E173)
Firmware : 11.126.16.04.00
IMEI : 123456789012345


5. Отправка тестового SMS:


gammu sendsms TEXT +79161234567 -text "Привет! Это тестовое сообщение."


+79161234567 — номер телефона в международном формате.
"Привет! Это тестовое сообщение." — текст сообщения.

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

If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network acknowledgement..OK, message reference=1

6. Автоматизация через скрипты. Создайте bash-скрипт для автоматической отправки уведомлений:


#!/bin/bash

PHONE="+79161234567"
MESSAGE="Сервер работает нормально."

gammu sendsms TEXT "$PHONE" -text "$MESSAGE" >> /var/log/sms.log 2>&1


Это пример базового скрипта, который можно добавить в cron. При необходимости отправку СМС можно связать с мониторингом важных процессов и в случае их падения получать СМС, например.

7. Безопасность. Убедитесь, что права на файл с конфигурацией ограничены:


chmod 600 ~/.gammurc


Для использования сторонних сервисов, таких как SMS-шлюзы, храните API-ключи в защищённых файлах.

---

Дополнительные команды Gammu.
Чтение входящих SMS:


gammu getallsms


Удаление всех SMS:


gammu deleteallsms 1


Отправка Flash SMS (отображается на экране, но не сохраняется):


gammu sendsms FLASH +79161234567 -text "Это Flash SMS!"


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Параллельное выполнение задач в Bash: ускоряем скрипты и контролируем фоновые процессы

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

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


1. Параллельное выполнение с &. Чтобы запустить команду в фоновом режиме, просто добавьте & в конце строки:


sleep 5 & # Фоновая задача
echo "Команда завершена"
wait # Ожидание завершения всех фоновых задач


2. Ограничение количества фоновых задач. Когда слишком много задач выполняются параллельно, это может перегрузить систему. Чтобы избежать этого, можно использовать ограничение.

Пример с семафором (функция parallel_run):


#!/bin/bash

# Функция для параллельного выполнения с ограничением
parallel_run() {
local max_jobs=4 # Максимальное количество фоновых задач
local job_count=0

for i in {1..10}; do
{
echo "Начало задачи $i"
sleep $((RANDOM % 5 + 1)) # Симуляция работы
echo "Задача $i завершена"
} &

((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n # Ждём завершения одной из задач
((job_count--))
fi
done

wait # Ожидание завершения всех оставшихся задач
}

# Запуск
parallel_run


Результат выполнения:


Начало задачи 1
Начало задачи 2
Начало задачи 3
Начало задачи 4
Задача 2 завершена
Начало задачи 5
...


Количество одновременно выполняемых задач не превышает 4.

3. Сравнение производительности

Скрипт с последовательным выполнением:


#!/bin/bash
for i in {1..10}; do
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
done


Результат: время выполнения = 10 задач × 2 секунды = 20 секунд.

Скрипт с параллельным выполнением:


Копировать код
#!/bin/bash
for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
done
wait


Результат: Все задачи запускаются одновременно. Время выполнения ≈ 2 секунды.

Скрипт с ограничением фоновых задач:


Копировать код
#!/bin/bash
parallel_run() {
local max_jobs=3
local job_count=0

for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n
((job_count--))
fi
done
wait
}

parallel_run


Результат: Ограничение до 3 задач одновременно. Время выполнения ≈ 7–8 секунд.

---

Дополнительный инструмент: xargs
Для простого ограничения количества задач можно использовать xargs с флагом -P:


seq 1 10 | xargs -n1 -P4 -I{} bash -c 'echo "Начало задачи {}"; sleep 2; echo "Задача {} завершена"'


-P4: ограничение на 4 параллельные задачи.

В результате получается, что параллельное выполнение задач в Bash значительно ускоряет работу скриптов:

👎 Полное отсутствие ограничений может перегрузить систему.
👍 Ограничение количества задач помогает сбалансировать нагрузку.
👍 Использование инструментов, таких как wait, xargs, или написание собственных функций, позволяет гибко управлять параллельностью.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
logrotate: настройка ротации логов в Linux

Большие объёмы логов могут быстро заполнять дисковое пространство, затрудняя работу системы. Для автоматического управления логами в Linux используется инструмент logrotate. Он позволяет архивировать, удалять или сжимать старые файлы логов, оставляя только актуальные записи.

logrotate работает на основе конфигураций, определяя:

Частоту ротации (ежедневно, еженедельно, ежемесячно).
Количество архивов, которые нужно сохранять.
Сжатие логов для экономии пространства.
Выполнение пользовательских скриптов после ротации.


Настройка logrotate

1. Глобальный файл конфигурации:


Находится по пути /etc/logrotate.conf. Он задаёт общие параметры ротации.

Пример содержимого:


weekly # Ротация раз в неделю
rotate 4 # Хранить 4 архивных файла
create # Создавать новый файл после ротации
compress # Сжимать логи с помощью gzip
include /etc/logrotate.d/ # Подключение дополнительных конфигураций


2. Пользовательские настройки для приложений:

Каждое приложение может иметь свой файл конфигурации в /etc/logrotate.d/.

Пример для файла /etc/logrotate.d/nginx:


/var/log/nginx/*.log {
daily # Ротация логов каждый день
missingok # Пропускать файлы, если их нет
rotate 7 # Хранить 7 архивов
compress # Сжимать архивы
delaycompress # Откладывать сжатие на следующий цикл
notifempty # Пропускать пустые файлы
create 0640 www-data adm # Создавать новый лог с указанными правами
postrotate # Выполнять команду после ротации
systemctl reload nginx > /dev/null
endnoscript
}


Пример настройки ротации пользовательских логов

Допустим, у нас есть приложение, которое пишет логи в /var/log/myapp/. Мы хотим:

Ротировать логи ежедневно.
Сохранять последние 5 архивов.
Сжимать архивы.
Перезапускать приложение после ротации.


Для этого создайте файл /etc/logrotate.d/myapp:


/var/log/myapp/*.log {
daily
rotate 5
compress
missingok
notifempty
create 0640 root root
postrotate
systemctl restart myapp
endnoscript
}


Проверка работы logrotate

Запустите тест ротации:


logrotate -d /etc/logrotate.conf


Опция -d выводит информацию о предстоящих действиях без выполнения.

Принудительно выполните ротацию:


logrotate -f /etc/logrotate.conf


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


/var/log/myapp/myapp.log.1.gz
/var/log/myapp/myapp.log.2.gz


Советы по безопасности

Убедитесь, что права доступа к логам соответствуют требованиям.
Используйте create в конфигурации для автоматического создания новых файлов с нужными правами.
Регулярно проверяйте дисковое пространство, чтобы старые логи не заполняли диск.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Мониторинг перебора паролей и блокировка учетных записей

Безопасность серверов - задача номер один для системного администратора. Перебор паролей (brute force) — одна из самых популярных атак на учетные записи. Чтобы защитить систему, нужно не только обнаруживать такие попытки, но и автоматически блокировать злоумышленников.

Где искать попытки перебора паролей? В Linux информация о входах и попытках авторизации хранится в следующих файлах:

/var/log/auth.log (Debian/Ubuntu).
/var/log/secure (CentOS/RHEL).


Пример попытки перебора паролей в логе:


Oct 28 14:23:45 server sshd[1234]: Failed password for root from 192.168.1.100 port 44567 ssh2
Oct 28 14:23:47 server sshd[1234]: Failed password for root from 192.168.1.100 port 44568 ssh2


Автоматическая блокировка с помощью pam_tally2

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

Настройка блокировки: Откройте файл /etc/pam.d/common-auth (Debian/Ubuntu) или /etc/pam.d/system-auth (CentOS/RHEL).

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


auth required pam_tally2.so onerr=fail deny=5 unlock_time=300
deny=5: блокировать учетную запись после 5 неудачных попыток.
unlock_time=300: автоматически разблокировать через 5 минут.


Для блокировки учетной записи добавьте строку в тот же файл:


account required pam_tally2.so


Проверка работы:

Посмотрите текущие неудачные попытки:


pam_tally2


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


Login Failures Latest failure
root 3 10/28/24 14:23:45
user1 5 10/28/24 14:25:01


Сбросьте счетчик неудач для пользователя:


pam_tally2 --user=user1 --reset


Дополнительная защита с Fail2Ban

Fail2Ban - мощный инструмент, который анализирует логи и автоматически блокирует IP-адреса злоумышленников через iptables.

Установка:


sudo apt install fail2ban # Для Debian/Ubuntu
sudo yum install epel-release && sudo yum install fail2ban # Для CentOS/RHEL


Настройка для SSH:

Откройте файл /etc/fail2ban/jail.local и добавьте:


[sshd]
enabled = true
maxretry = 5
bantime = 3600
findtime = 600
maxretry=5: количество неудачных попыток.
bantime=3600: блокировка IP на 1 час.
findtime=600: анализировать попытки за последние 10 минут.


Перезапустите Fail2Ban:


sudo systemctl restart fail2ban


Проверка работы:

Просмотр заблокированных IP:


sudo fail2ban-client status sshd


Разблокировка IP:


sudo fail2ban-client unban IP_ADDRESS


---

Рекомендации для повышения безопасности

Используйте ключи SSH: Полностью отключите вход по паролю, включив аутентификацию по ключам SSH.

Ограничьте доступ по IP: Настройте файлы hosts.allow и hosts.deny или используйте брандмауэр.

Перенесите SSH на нестандартный порт: Это затруднит автоматизированные атаки.

Регулярно проверяйте логи: Используйте скрипты для автоматического анализа логов на наличие подозрительных активностей.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Неочевидно полезные опции команды ls

Команда ls знакома всем, кто хоть раз работал в командной строке Linux. Но она умеет гораздо больше, чем просто перечислять файлы. Разберём несколько малоизвестных, но крайне полезных опций

1. Показываем файлы со всеми деталями: --almost-all. По умолчанию ls с опцией -a отображает все файлы, включая . и ... Но если они вам не нужны, используйте --almost-all:


ls --almost-all
.bashrc .config .viminfo file1.txt file2.txt


2. Показываем время последнего изменения: --time-style. Эта опция позволяет гибко настроить отображение времени. Например, чтобы видеть точное время:


ls -l --time-style=long-iso
-rw-r--r-- 1 user group 123 Oct 28 14:32 file1.txt


Хотите форматировать время под себя? Используйте:


ls -l --time-style=+"%d-%m-%Y %H:%M:%S"
-rw-r--r-- 1 user group 123 28-10-2024 14:32 file1.txt


3. Нумерация строк: -l --numeric-uid-gid. Эта опция показывает UID и GID вместо имени пользователя и группы. Полезно для отладки:


ls -l --numeric-uid-gid
-rw-r--r-- 1 1000 1000 123 Oct 28 14:32 file1.txt


4. Сортировка по размеру: -lS. Сортируйте файлы по их размеру в порядке убывания:


ls -lS
-rw-r--r-- 1 user group 4567 Oct 28 14:32 large_file.txt
-rw-r--r-- 1 user group 123 Oct 28 14:32 small_file.txt


5. Вывод цвета в терминале: --color=always. Если вы хотите сохранить цвета при перенаправлении вывода команды, используйте:


ls --color=always | less -R


6. Показываем только директории: -d */. Хотите видеть только папки в каталоге?


ls -d */
Documents/ Downloads/Scripts/


7. Группировка файлов и папок: --group-directories-first. Полезно, если вы хотите видеть папки в начале списка:


ls --group-directories-first
Documents/ Downloads/ file1.txt file2.txt


8. Показываем inode каждого файла: -i. Каждый файл в Linux имеет свой уникальный inode. Используйте -i, чтобы увидеть их:


ls -i
123456 file1.txt
123457 file2.txt



Теперь Вы владеете не просто командой, а целым инструментом для работы с файлами. Попробуйте описанные опции, чтобы сделать управление файлами более удобным и эффективным

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🗿1
LDAP: зачем нужен и чем помогает

LDAP (Lightweight Directory Access Protocol) - это стандартный протокол для доступа и управления распределёнными каталогами данных. Если говорить проще, LDAP помогает хранить и быстро находить информацию о пользователях, группах, устройствах или других объектах в сети.

Этот инструмент стал неотъемлемой частью корпоративной инфраструктуры, где нужно организовать централизованное управление данными. Давайте разберём, зачем нужен LDAP и как он облегчает жизнь системным администраторам и IT-командам.

Зачем нужен LDAP?

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

Единая точка аутентификации (SSO)
С помощью LDAP можно настроить единую точку входа для всех сервисов. Например, пользователь входит в систему один раз, и этот логин работает для почты, файловых серверов, систем мониторинга и других ресурсов.

Упрощённое управление группами
LDAP позволяет быстро добавлять, удалять и редактировать группы пользователей. Например, создайте группу «Администраторы», чтобы предоставить всем её членам доступ к определённым ресурсам.

Интеграция с другими системами
LDAP поддерживается большинством корпоративных приложений и служб:

Сервера: Apache, Nginx, Samba.
Почтовые системы: Postfix, Dovecot.
Инструменты DevOps: Jenkins, GitLab.
Операционные системы: Windows, macOS, Linux.
Широкий охват объектов

Кроме пользователей и групп, в LDAP можно хранить:

Информацию о принтерах и устройствах.
Политики безопасности.
Структуру организации (отделы, филиалы).

Как LDAP помогает в реальной жизни?

1. Управление доступом
Представьте, что у вас 100 сотрудников. Вместо того чтобы вручную создавать каждому доступ к десяткам серверов, вы настраиваете LDAP. Теперь достаточно добавить пользователя в базу, и он получит нужные права.

2. Быстрый поиск данных
LDAP поддерживает мощные запросы для поиска объектов. Например, можно легко найти всех сотрудников из отдела маркетинга или пользователей, чей пароль истекает через 7 дней.

Пример запроса через ldapsearch :


ldapsearch -x -b "dc=example,dc=com" "(department=Marketing)"


3. Автоматизация задач
LDAP позволяет автоматизировать ротацию паролей, управление правами доступа и синхронизацию данных между системами.

Преимущества LDAP:

Гибкость: поддерживает сложные структуры данных и широкий набор атрибутов.

Масштабируемость: подходит как для небольших компаний, так и для крупных корпораций.

Безопасность: поддержка SSL/TLS для шифрования трафика.

Открытые стандарты: совместим с широким спектром решений.


Кому и когда нужен LDAP?

LDAP идеально подходит для компаний с:

Большим количеством сотрудников и устройств.
Разнообразными сервисами, которые требуют централизованного управления доступом.
Потребностью в единой системе учётных записей.


В следующей статье разберемся с установкой и настройкой

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1👨‍💻1
LDAP: Установка и настройка LDAP-сервера в Linux

В этой статье разберём процесс установки и базовой настройки LDAP-сервера на основе OpenLDAP в Linux.

1. Установка OpenLDAP. Установка необходимых пакетов:

На Ubuntu/Debian:


sudo apt update
sudo apt install slapd ldap-utils


На CentOS/RHEL:


sudo yum install openldap openldap-servers openldap-clients
sudo systemctl enable slapd
sudo systemctl start slapd


2. Инициализация и настройка LDAP-сервера
2.1. Настройка slapd через утилиту конфигурации (для Ubuntu/Debian):


sudo dpkg-reconfigure slapd


Во время настройки система запросит:

DNS-домен: например, bashtex.com.
Организацию: введите имя вашей компании или группы, например, BashTex
Пароль администратора (admin): задайте надёжный пароль.

2.2. Проверка статуса службы. Убедитесь, что сервер работает:


sudo systemctl status slapd


3. Создание базовой структуры LDAP. Для работы LDAP необходимо задать базовую структуру: организационные единицы (OU), пользователи и группы.

3.1 Создание LDIF-файла с базовой структурой. Создайте файл base.ldif со следующим содержимым:


dn: ou=users,dc=bashtex,dc=com
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=bashtex,dc=com
objectClass: organizationalUnit
ou: groups


3.2. Применение структуры. Загрузите данные в LDAP:


ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f base.ldif


Введите пароль, указанный при настройке slapd.

4. Добавление пользователей. Создайте LDIF-файл с пользователем:


dn: uid=jdoe,ou=users,dc=bashtex,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: jdoe
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/jdoe
loginShell: /bin/bash
userPassword: {SSHA}yourpasswordhash


Чтобы сгенерировать хэш пароля:


slappasswd


4.1. Загрузите пользователя в LDAP:


ldapadd -x -D "cn=admin,dc=bashtex,dc=com" -W -f user.ldif


5. Проверка LDAP. Просмотр записей в LDAP:


ldapsearch -x -LLL -b "dc=example,dc=com" "(objectClass=*)"


5.1. Поиск пользователей:


ldapsearch -x -b "ou=users,dc=example,dc=com" "(uid=jdoe)"


Дополнительная настройка

1. Установка SSL/TLS для защиты соединений:
Убедитесь, что установлен certbot или аналогичный инструмент, и настройте сертификаты. Затем укажите их в конфигурации /etc/ldap/ldap.conf:


TLS_CACERT /etc/ssl/certs/ca-certificates.crt


2. Интеграция с другими сервисами:
LDAP можно использовать для аутентификации пользователей в таких системах, как:

SSH: настройте PAM через libpam-ldap.
Web-сервисы: интеграция с Apache, Nginx.
Почтовые серверы: например, Postfix или Dovecot.

Установив OpenLDAP и создав базовую структуру, вы сможете расширять её для любых корпоративных нужд.

BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍2