BashMaster
8.24K subscribers
682 photos
14 videos
1 file
705 links
Удобные консольные наработки на каждый день для разработчиков, девопсов и сисадминов.

Реклама: @Kone4noVasya

Канал на бирже: https://telega.in/c/bash_help
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Станьте разработчиком нейро-сотрудников на Python и зарабатывайте от 150.000р в месяц 🔥🔥🔥

Мы научим вас создавать топовых нейро-сотрудников на базе GPT-4 Omni, и вы сможете:
1️⃣ Устроиться разработчиком в крупную компанию и зарабатывать от 150 тысяч ₽ в месяц
2️⃣ Разрабатывать такие проекты на заказ и зарабатывать от 500 тысяч ₽ за проект
3️⃣ Создать нейро-сотрудника в вашей компании и вырасти на +30-100% в зарплате

Что будет на интенсиве?
🧬 Теория: как создаются нейро-сотрудники с GPT-4o на Python
🧬 Практика: мы создадим нейро-консультанта, нейро-HR, нейро-маркетолога и др.

Ведущий интенсива - Senior AI разработчик нейросетей и основатель Университета искусственного интеллекта
🔥 Регистрируйтесь на бесплатный интенсив! Встречаемся в ближайший четверг!
⚙️ Мониторинг перебора паролей на почту

✔️Мониторинг перебора паролей на почту позволяет оценить, сколько недоброжелателей пытается подбирать пароли к вашей почте. Рассмотрим на примере почтового сервера 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_help
Please open Telegram to view this post
VIEW IN TELEGRAM
🎓 Тренинги 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.
⚙️ 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_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ 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_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Освой работу с Prometheus, Grafana, ELK, etc и настрой мониторинг!

Владение инструментами Observability открывает новые карьерные горизонты администраторам Linux, DevOps-инженерам 

Стройте сложные эффективные системы мониторинга и логирования инфраструктуры и приложений 

💪 Ответьте на 15 вопросов и проверьте, насколько вы готовы к обучению на курсе «Observability: мониторинг, логирование, трейсинг» от OTUS.

+ 5 новых занятий, для вашего профессионального развития

Пройти тест и получить спец. предложение:  
https://otus.pw/HhMG/?erid=LjN8KPGU9

#реклама
О рекламодателе
⚙️ Bash Prompt Generator

✔️Очень крутой ресурс, где можно сконфигурировать строку для ввода команд в bash.

➡️ Выбираете параметры, расставляете их в нужной последовательности и копируете готовую конфигурацию.

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
😂 Подборка каналов для каждого сетевого инженера и безопасника

👨‍💻 Серверная Админа — Большое количество уроков, статей, книг и гайдов по устройству и настройке компьютерных сетей.

😎 Арсенал Безопасника — Проект по кибербезопасности - сборник лучших инструментов и утилит по OSINT, хакингу и деанону

😎 Бункер Хакера — Все что необходимо, для того чтобы начать свой путь в безопасности - инструменты, книги, справочники, гайды и ресурсы.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Аналог 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_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Скрытие процессов Linux с помощью Bind Mounts

✔️Если у вас есть вредоносный процесс, который вы хотите скрыть, используйте Bind Mounts, чтобы смонтировать другой каталог поверх каталога /proc/PID для вредоносного процесса.

🖼️ Статья на английском языке

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ ble.sh — Bash Line Editor

✔️Линейный редактор, написанный на чистом Bash, с подсветкой синтаксиса, автоматическими предложениями, режимами vim и т. д. для интерактивных сеансов Bash.

▶️Он заменяет GNU Readline по умолчанию. Предоставляет такие функции, как расширенное завершение и режим редактирования

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ PathPicker

✔️Инструмент командной строки, который позволяет выбирать файлы из вывода bash

▶️Пользователи могут редактировать выбранные файлы в своем любимом текстовом редакторе или выполнять с ними произвольную команду

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Компоненты AD Kerberos, Microsoft SQL Server и центр сертификации — как их взломать?
Научим на курсе “Атака на Active Directory". Авторы: HackerRalf (Михаил Порываев) и BlackRabbit (Павел Никитин), 5-кратные победители the Standoff

Старт: 16 декабря. Успейте приобрести курс по старой цене до конца ноября!*

Содержание курса:
- Архитектура AD и ее базис
- Харденинг в AD, добыча критичной информации, развитие по инфраструктуре
- Как закрепиться внутри? Техники и эксплоиты

На 100% прикладной курс:
практическая лаборатория AD содержит 16 виртуальных машин, позволяя участникам отточить свои навыки на практике в 100+ рабочих тасках

🏆 Сертификат / удостоверение о повышении квалификации 

*С декабря стоимость курсов увеличится на 15%

@Codeby_Academy
Подробнее о курсе
⚙️ CLI-To-Whatsapp

✔️Bash-скрипт, который позволяет пользователям отправлять выходные данные CLI команды GNU/Linux контакту WhatsApp в виде сообщения

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ sshto – небольшой bash-скрипт для управления ssh-соединениями

✔️Он создает меню (через диалог) из вашего ~/.ssh/config. Он может не только подключаться, но и выполнять команды, копировать файлы, туннелировать порты

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Парсим данные с GisMeteo в bash’е

✔️Если вы вдруг каким-то чудом еще не слышали про сайт gismeteo.ru, то, в двух словах, это сайт, на котором публикуется текущая информация о погоде для различных населенных пунктов. Чтобы посмотреть, что сейчас примерно на улице за погода (с определенной погрешностью, естественно), достаточно открыть сайт и посмотреть. Кроме того, у этого сайта есть возможность получать данные в формате XML.

▶️Но мы не будем пользоваться форматом XML, потому что для корректного разбора xml обычно используются дополнительные программы. Мы воспользуемся другими программами, которые обычно в системе уже присутствуют (за исключением curl, который по умолчанию имеется не во всех системах) — bash, sed и curl. Curl нужен только для получения странички по протоколу https, и вместо него можно воспользоваться любой другой программой, которая может получить страничку по https и вывести ее в терминал (это может сделать и wget, и links), можно использовать ту программу, которая вам больше нравится.

▶️Главная задача этого скрипта — выводить в консоль информацию о погоде в текстовом режиме. Чем этот скрипт может быть еще полезен? Тем что результат его работы можно использовать для отправки себе в качестве SMS, по электронной почте или использовать для отображения на рабочем столе при помощи conky.

➡️ Для настройки скрипта потребуется адрес страницы, на которой находятся данные о погоде в соответствующем городе. У меня это будет Санкт-Петербург. Вы можете свой URL найти просто скопировав из браузера адрес страницы и вставив его в скрипт.
#!/bin/bash

CITY_URL="https://www.gismeteo.ru/city/daily/4079/"
curl $CITY_URL 2>/dev/null \
| sed -nre '/section higher/,/мм рт. ст./p' \
| sed -r '/section higher|cloudness|wicon wind|crumb|scity|\/div|value m_temp f|m_wind mih|m_wind kmh|png|\/dl|class="temp|wicon barp|dt/d' \
| sed -r 's/(.*)class="type(.*)>(.*)<\/h2>/Город: \3/' \
| sed -r 's/(.*)<dd(.*)td>(.*)<\/td(.*)\/dd>/Погода: \3/' \
| sed -r 's/(.*)<dd class=(.*)>(.*)<span class="meas(.*)span><\/dd>/Температура воздуха: \3 C/' \
| sed -r 's/(.*)value m_wind ms(.*)>(.*)<span class="unit">(.*)<\/span><\/dd>/Ветер: \3 \4/' \
| sed -r 's/(.*)value m_press torr(.*)>(.*)<(.*)>(.*)<\/span><\/dd>/Давление: \3 \5/'

▶️Если не совсем понятно, немного поясню, что происходит. Скачиваем curl’ом страничку, выводим ее в стандартный потов вывода, а ошибки в /dev/null. Затем удаляем все ненужные строки, оставляем только те, которые содержатся между строкой с подстрокой «section higher» и «мм рт. ст.» включительно. Таким образом удалится информация о температуре воды, но это в моем случае не страшно, потому что Питер не самый курортный город, и о влажности воздуха, что тоже не страшно, потому что влажность обычно не самая низкая. Затем из оставшихся строк снова удаляем ненужные, достаем название города, состояние атмосферы (ясно, пасмурно, облачно), температуру воздуха, скорость ветра и атмосферное давление.

➡️ И, собственно, всё. После запуска скрипта получаем такой вот вывод:
$ ./gm.sh
Город: Санкт-Петербург
Погода: Пасмурно
Температура воздуха: +15 C
Ветер: 2 м/с
Давление: 766 мм рт. ст.


🖼️ Ссылка на источник

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Я айтишник и я устал!

С годами работы в IT все сильнее напрягает рутина, прокрастинация, куча задач и 0 желания их выполнять. Че делать?

Рекомендуем подписаться на того, кто уже не первый год работает с IT-специалистами и помогает им справиться с апатией и прокрастинацией - Психолог с научным подходом.

✔️ Как оторваться от ленты соцсетей и сесть за работу с удовольствием?
✔️ Как спокойно общаться с коллегами, если они бесят?
✔️ Как избавиться от постоянной тревожности?
✔️ Как успокоить конфликты в семье и перестать срываться на всех, а вместо этого получить поддержку и понимание со стороны близких?

Подписывайся на канал @remizov_changes - начни работать и жить в кайф, не скатываясь в кризисы и выгорание!

А в закрепе тебя уже ждут бонусы:
👨🏻‍💻 Видео, в котором ты найдёшь ответ на вопрос «Почему у тебя нет энергии и что с этим делать» + гайд как IT-специалисту вернуть энергию, даже если не получается отдохнуть.
⚙️ LazyJournal

✔️Терминальный пользовательский интерфейс (TUI) для journalctl, логов файловой системе и контейнеров Docker для быстрого просмотра и фильтрации, написанный на языке Go с использованием библиотеки gocui.

▶️Простая установка, для запуска достаточно загрузить в систему один исполняемый файл без зависимостей.
▶️Проект вдохновлен работами Jesse Duffield, по этому интерфейс будет знаком всем тем, кто уже использует LazyDocker и LazyGit.
▶️Для всех журналов присутствует возможность динамической фильтрации вывода с поддержкой нечеткого поиска и регулярных выражений (в стиле fzf и grep), а также подсветкой найденных слов.
▶️Позволяет получить список всех доступных журналов юнитов из journalctl (используется для чтения логов из подсистемы systemd).
▶️Возможность просматривать все доступные лог-файлы из каталога /var/log с сортировкой по дате изменения (например, для Apache, Nginx или СУБД), включая доступ к архивным логам.
▶️Поддержка логов контейнеров Docker.
▶️Проект будет полезен в первую очередь для системных администраторов Linux, больше не нужно вручную искать журналы в системе и каждый раз вызывать grep.

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Вебинар
Новая система управления доступом пользователей Eltex NAICE

29.11.2024
14:00 по МСК

План вебинара:
- Общая информация о NAC системах
- Что уже сделано в NAICE
- Демонстрация настроек и работы авторизации пользователей домена AD
- Профилирование устройств

👉 Регистрация 

👤 Ведущий вебинара:
Алексей Листаров — инженер с многолетним опытом работы в крупном операторе связи. Сертифицированный преподаватель Академии Eltex.

#eltex #eltexcm #вебинар #naice

 @eltexcm

Реклама. ООО "ЭЛТЕКС КОММУНИКАЦИИ". ИНН 7714966730.
⚙️ basht

✔️Файловый менеджер терминала, написанный на bash.

▶️Он использует fzf для навигации и выбора файлов и каталогов. Имеет предварительный просмотр изображений, различные темы.

🐙 Перейти на Github

🔨 bash_help
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Cyber Media
UserGate открывает новую страницу в истории российского NGFW-строения!

Предлагаем вашему вниманию видео с честным нагрузочным тестированием нового решения – UserGate DCFW.

UserGate Data Center Firewall (DCFW) – высокопроизводительный межсетевой экран следующего поколения с широкими функциональными возможностями и высокой отказоустойчивостью для защиты дата-центров и крупных корпоративных сетей.

Это решение для тех, кому требуется защита сетей с трафиком, исчисляемым в десятках гигабит в секунду: корпоративные сервисы крупного бизнеса, государственные информационные системы, ЦОДы, интернет-провайдеры.

➡️ Смотреть запись

*Реклама, ООО «Юзергейт»
Please open Telegram to view this post
VIEW IN TELEGRAM