Bash Советы
Открыть в Telegram
🚀 Секреты и советы по Bash 🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале. 🔹 Автоматизация, скрипты и оптимизация работы в Linux. 🔹 Стать мастером Bash легко – просто подпишись! По всем вопросам @evgenycarter
Больше2 748
Подписчики
Нет данных24 часа
+27 дней
-1130 день
Архив постов
2 748
🖥 Bash скрипт перекодировки всех файлов в директории
#!/bin/bash
#=====================================
# скрипт изменения кодировки файлов.
#=====================================
# суть для одного файла: iconv -f Исходная_кодировка -t В_какую_кодировку > выходной_файл
# CONFIG:
TYPES="*.txt"; # на случай поиска по расширению. напр. "*.log"
FROM='cp1251'; # из какой кодировки.
TO='utf8'; # в какую кодировку.
FILEPREFIX='.utf8'; # к названию перекодированного файла добавится.
# START:
if [ -z $1 ]
then
echo "Encoding all $TYPES in directory From $FROM To $TO";
echo "use $0 /Path_to_recoding_directory/"; echo;
exit 1;
else
echo "Encoding all $TYPES in directory $1 From $FROM To $TO";
echo;
find $1 -name "$TYPES" -type f -print0|while read -d '' SOURCE; do
echo "========== SOURCE: $SOURCE FROM: $FROM TO: $TO ==========";
cat "$SOURCE"|iconv -f $FROM -t $TO > "$SOURCE$FILEPREFIX";
wait;
done;
exit 0;
fi
# end
👉@bash_srv2 748
В чем разница между объявлением переменной export VAR="VALUE" и VAR="VALUE" в bash?
В
bash (и других оболочках Unix) разница между командами export VAR="VALUE" и VAR="VALUE" связана с областью видимости переменной:
1. VAR="VALUE":
- Это обычное объявление переменной в текущей оболочке (сессии).
- Переменная VAR будет доступна только внутри текущей сессии, и не будет передаваться дочерним процессам, запущенным этой сессией.
- Например, если вы запустите новую команду или скрипт из текущей оболочки, VAR не будет доступна в этом дочернем процессе.
2. export VAR="VALUE":
- Команда export делает переменную VAR доступной для всех дочерних процессов текущей оболочки.
- То есть, VAR будет установлена и доступна не только в текущей сессии, но и во всех процессах, запущенных из этой сессии.
- Это полезно, когда необходимо передать значение переменной в другие программы или скрипты, запущенные из текущей оболочки.
Для примера
# Присвоение переменной без export
VAR="Hello"
bash -c 'echo $VAR' # Ничего не выведет, так как VAR не экспортирована
# Присвоение переменной с export
export VAR="Hello"
bash -c 'echo $VAR' # Выведет "Hello", так как VAR экспортирована
Таким образом, export используется для того, чтобы переменная была доступна в дочерних процессах, тогда как обычное присвоение без export ограничивает переменную только текущей сессией.
👉@bash_srv2 748
🧹 Автоматическая очистка логов старше N дней
Если логи разрастаются, а места становится всё меньше — пора автоматизировать их очистку! Вот простой способ удалить файлы старше, скажем, 14 дней:
find /var/log -type f -name "*.log" -mtime +14 -exec rm -f {} \;
🔧 Объяснение:
- /var/log — каталог с логами (можно заменить на нужный путь);
- -type f — только файлы;
- -name "*.log" — ищем только .log-файлы;
- -mtime +14 — которым больше 14 дней;
- -exec rm -f {} — удаляем.
🛡️ Сухой запуск перед удалением:
find /var/log -type f -name "*.log" -mtime +14
Так ты увидишь, что будет удалено, прежде чем запускать rm.
📌 Добавь в cron, чтобы забыть о рутине навсегда.
👉@bash_srv2 748
🚀 Bash-совет дня: Быстрый мониторинг TCP/UDP портов
Иногда нужно оперативно узнать, какие порты слушает сервер и какие подключения активны. Вот простой однострочник, который поможет:
sudo ss -tunlp
📌 Пояснение ключей:
- -t — TCP
- -u — UDP
- -n — не разрешать имена хостов и портов (быстрее)
- -l — только слушающие сокеты
- -p — показать PID и имя процесса
🔍 Хочешь отсортировать по порту или найти конкретный? Добавь grep:
sudo ss -tunlp | grep 8080
🎯 Альтернатива на случай, если нет ss:
sudo netstat -tunlp
Полезно для отладки фаервола, проверки работы сервисов или просто для уверенности, что сервер не слушает ничего лишнего 😉
👉@bash_srv2 748
🚀 Полезный Bash-скрипт: Очистка кэша пакетного менеджера APT 🧹
Иногда кэш пакетов APT разрастается и занимает лишнее место. Ниже написал простой скрипт, который поможет автоматизировать очистку и освободить дисковое пространство 💾
#!/bin/bash
# Очищаем кэш APT
echo "🧼 Очистка кэша APT..."
sudo apt clean
sudo apt autoclean
# Удаляем неиспользуемые пакеты
echo "🗑 Удаление неиспользуемых пакетов..."
sudo apt autoremove -y
# Отчёт о свободном месте
echo "📊 Свободное место после очистки:"
df -h /
📌 Как использовать:
1. Сохрани как clean_apt.sh
2. Сделай исполняемым: chmod +x clean_apt.sh
3. Запускай по необходимости или добавь в cron
Полезно для серверов с ограниченным дисковым пространством или если хочется держать систему в чистоте 😎
👉@bash_srv2 748
🚀 Полезный Bash-скрипт: Уведомление о перезагрузке сервера 🔔
Иногда нужно предупредить пользователей, что сервер будет перезагружен, особенно если они работают в терминале. Ниже скрипт, который отправит им сообщение и задаст таймер на перезагрузку:
#!/bin/bash
TIMEOUT=5 # Через сколько минут будет перезагрузка
MESSAGE="⚠️ Внимание! Сервер будет перезагружен через $TIMEOUT минут. Пожалуйста, сохраните свою работу."
# Оповестим всех пользователей
wall "$MESSAGE"
# Поставим таймер на перезагрузку
shutdown -r +$TIMEOUT "Плановая перезагрузка сервера через $TIMEOUT минут"
📌 wall рассылает сообщение всем, у кого открыт терминал, а shutdown -r запланирует перезагрузку. Всё просто и эффективно.
💡Можно обернуть это в cron или systemd-таймер — и будет готовый инструмент для автоматических уведомлений и перезагрузок.
👉@bash_srv2 748
🧠 Логи — Самые частые IP-адреса в access.log
Когда нужно быстро понять, кто чаще всего лупит по серверу — вот простой однострочник:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
🔍 Что делает:
1. awk '{print $1}' — вытаскивает IP из первой колонки.
2. sort и uniq -c — считает повторы.
3. sort -nr | head — выводит топ-10 по частоте.
📊 Вывод будет примерно такой:
152 192.168.1.10 103 203.0.113.45 87 172.16.0.5🔥 Подходит для NGINX, Apache и других web-логов с классическим форматом. 👉@bash_srv
2 748
📌 Регулярки — Ищем email-адреса в тексте
Надо быстро вытащить email-адреса из логов или текстов? Лови универсальное регулярное выражение:
grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
📦 Примеры использования:
cat файл.txt | grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
🎯 Оно находит валидные email'ы вроде:
- support@domain.com
- test.user+admin@sub.domain.co
⚙️ Флаг -o в grep выводит только совпадения, без строк целиком.
📥 Используй для анализа логов, дампов или выгрузок из баз.
👉@bash_srv2 748
🔥 Убиваем процесс по порту в один клик
Когда нужно быстро освободить занятый порт, но неохота копаться в
lsof и kill, вот простой и мощный однострочник:
fport() { fuser -k "$1"/tcp; }
Теперь можно просто вызвать:
fport 8080
💡 Этот алиас использует fuser, чтобы найти и завершить все процессы, прослушивающие указанный TCP-порт.
⚠️ Убедись, что fuser установлен (обычно он входит в пакет psmisc):
sudo apt install psmisc # для Debian/Ubuntu
sudo yum install psmisc # для RHEL/CentOS
🚀 Удобно для Dev-серверов, где постоянно перезапускаешь сервисы и ловишь ошибку "Address already in use".
👉@bash_srv2 748
🧯Как отключить историю Bash — навсегда и без следов
Иногда не хочется, чтобы команды сохранялись в истории (~/.bash_history). Особенно при работе с конфиденциальными данными.
🔒 Отключение истории в текущей сессии
Просто обнуляем переменные истории:
unset HISTFILE
export HISTSIZE=0
export HISTFILESIZE=0
💥 После этого Bash не будет сохранять историю вообще. Даже после выхода из сессии.
🧼 Стереть историю прямо сейчас
history -c # очистить историю из памяти
> ~/.bash_history # стереть файл истории
🔁 Отключить навсегда (для пользователя)
Добавь в ~/.bashrc или ~/.bash_profile:
export HISTFILE=
export HISTSIZE=0
export HISTFILESIZE=0
📌 После перезапуска оболочки история вестись не будет.
🧙 Дополнительно (опционально)
Чтобы Bash не пытался писать историю на выходе:
unset HISTFILE
trap "" EXIT
🛑 Будь осторожен! Без истории сложнее откатить действия. Но иногда это нужно: безопасность превыше всего 🔐
👉@bash_srv2 748
🚀 Утилита
timeout: автоматическое завершение зависших команд
Когда ты запускаешь какую-то команду, и она может зависнуть — это беда. Особенно в скриптах. На помощь приходит утилита timeout из пакета coreutils.
🛠 Пример использования:
timeout 30s ./backup.sh
Эта команда завершит ./backup.sh, если она не завершится за 30 секунд.
📌 Можно задать время в секундах (s), минутах (m), часах (h) и даже днях (d).
🔄 Что произойдёт при превышении тайм-аута?
По умолчанию timeout отправляет сигнал SIGTERM, а через 5 секунд — SIGKILL, если процесс всё ещё жив.
☠️ Изменение сигнала:
timeout -s SIGINT 10s ./script.sh
📋 Проверка кода возврата:
if timeout 5s ./some_command; then
echo "Успешно"
else
echo "Команда завершена по таймауту или с ошибкой"
fi
👉@bash_srv2 748
🛡 Проверка SSL-сертификатов с помощью Bash
Иногда нужно быстро проверить срок действия SSL-сертификата удалённого сайта. Вот удобный однострочник на Bash, который покажет дату окончания действия сертификата:
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates | grep notAfter
📆 Чтобы получить только оставшиеся дни до окончания:
end_date=$(echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
end_ts=$(date -d "$end_date" +%s)
now_ts=$(date +%s)
echo "Осталось дней: $(( (end_ts - now_ts) / 86400 ))"
🔒 Полезно для автоматического мониторинга или проверки перед продлением сертификатов!
👉@bash_srv2 748
📁Как отрезать расширение у файла в Bash
filename="example.txt"
name="${filename%.*}"
echo "$name"
📌 Что тут происходит:
- ${filename%.*} — удаляет последнюю точку и всё после неё, то есть расширение.
👀 Примеры:
filename="backup.tar.gz"
name="${filename%.*}" # Результат: backup.tar
Если хочешь убрать все расширения (в т.ч. .tar.gz), можно использовать вот так:
filename="backup.tar.gz"
name="${filename%%.*}" # Результат: backup
🧠 Под капотом:
- %.* — удаляет самую правую точку и всё после.
- %%.* — удаляет самую левую точку и всё после.
Мощно и без внешних команд! 🚀
👉@bash_srv2 748
🚀 Bash-совет дня: Как быстро найти и удалить пустые директории
Иногда в системах с большим количеством файлов и директорий накапливаются пустые папки. Вот простой способ найти и удалить их одним махом:
find /path/to/search -type d -empty -delete
🔍 Разбор:
- /path/to/search — укажи директорию, где искать.
- -type d — ищем только директории.
- -empty — фильтруем только пустые.
- -delete — удаляем найденные.
🛡 Важно:
Перед удалением рекомендую посмотреть, что именно будет удалено:
find /path/to/search -type d -empty
Так ты убедишься, что ничего лишнего не затронешь 😉
👉@bash_srv2 748
👩💻 Считаем количество файлов в указанной директории
#!/usr/bin/env bash
# Script Name: count_files.sh
# Description: Counts the number of directories, files, and total count in a specified directory,
# with options to filter by extension and set traversal depth.
# Usage: count_files.sh [--directory <dir>] [--depth <depth>] [--extension <ext>] [--help]
# --directory <dir> (optional) - the directory to count files in (default: current directory)
# --depth <depth> (optional) - the maximum depth of directory traversal (default: unlimited)
# --extension <ext> (optional) - only count files with the specified extension
# --help (optional) - display this help message
# Example:
# ./count_files.sh
# ./count_files.sh --directory /path/to/dir --depth 2 --extension txt
set -euo pipefail
show_help() {
cat << EOF
Usage: $0 [OPTIONS]
Options:
-d, --directory DIR The directory to count files in (default: current directory)
-p, --depth DEPTH The maximum depth of directory traversal (default: unlimited)
-e, --extension EXT Only count files with the specified extension
-h, --help Display this help message
Examples:
$0
$0 --directory /path/to/dir --depth 2 --extension txt
EOF
exit 0
}
count_files() {
local dir="$1"
local depth="$2"
local extension="$3"
if [[ ! -d "$dir" ]]; then
echo "Error: Directory '$dir' does not exist."
exit 1
fi
echo -e "\nCounting files in directory: $dir"
[[ -n "$depth" ]] && echo "Depth: $depth"
[[ -n "$extension" ]] && echo "Filtering by extension: .$extension"
local find_cmd=(find "$dir")
[[ -n "$depth" ]] && find_cmd+=(-maxdepth "$depth")
[[ -n "$extension" ]] && find_cmd+=(-name "*.$extension")
find_cmd+=(-type f)
local num_files
num_files=$( "${find_cmd[@]}" | wc -l )
local num_dirs
num_dirs=$( find "$dir" ${depth:+-maxdepth "$depth"} -type d | wc -l )
local total_count=$((num_dirs + num_files))
echo "Number of directories: $num_dirs"
echo "Number of files: $num_files"
echo "Total count: $total_count"
}
main() {
local dir="$(pwd)"
local depth=""
local extension=""
# Parse options
options=$(getopt -o d:p:e:h --long directory:,depth:,extension:,help -n "$0" -- "$@")
eval set -- "$options"
while true; do
case "$1" in
-d|--directory)
dir="$2"
shift 2
;;
-p|--depth)
depth="$2"
shift 2
;;
-e|--extension)
extension="$2"
shift 2
;;
-h|--help)
show_help
;;
--)
shift
break
;;
*)
echo "Invalid option: $1"
show_help
;;
esac
done
count_files "$dir" "$depth" "$extension"
}
main "$@"
👉@bash_srv2 748
Основы работы с терминалом и BASH
Основные команды терминала. Первый скрипт на BASH.
Основы BASH | Условия
Основы Bash | Циклы
Основы BASH | for, let, trap
Основы BASH | Функции, рекурсия, модули, массивы
Основы терминала | GNU awk
Основы BASH | expect, who, mesg, autoexpect
🖤 Автор: bugsandfeatures
👉@bash_srv
2 748
🚀 Быстрый просмотр размера всех подкаталогов
Если нужно быстро узнать, какие директории в текущем каталоге занимают больше всего места — этот однострочник тебе поможет:
du -h --max-depth=1 | sort -hr
📌 Разбор:
- du -h --max-depth=1 — показывает размер каждого подкаталога (в человекочитаемом формате, только на 1 уровень вглубь).
- sort -hr — сортирует результат по размеру в обратном порядке (от большего к меньшему).
👀 Полезно, когда:
- Хочешь быстро найти, где “утекает” место.
- Проверяешь домашние директории пользователей.
- Мониторишь var, log или tmp на переполнение.
🔧 Пример использования:
cd /var && du -h --max-depth=1 | sort -hr
💡 Добавь алиас в .bashrc, чтобы использовать как команду:
alias dusort='du -h --max-depth=1 | sort -hr'
👉@bash_srv2 748
🎯 Примеры типовых операций в bash-скриптах
Собрал для вас полезные кусочки Bash-кода, которые часто нужны при написании скриптов: арифметика, проверки, FTP, Telnet, циклы и т.д. 👇
📌 Арифметика и цикл по количеству раз:
#!/bin/bash
A="10"
B="5"
C=`expr $A + $B`
printf "A=10 B=5 C=expr \$A + \$B C=%d \n" "$C"
# Цикл по числам от 0 до 14 (в 16-ричном формате)
I=0
while [ $I -lt 15 ]
do
printf "0x%02x " "$I"
I=`expr $I + 1`
done
echo
📌 Проверки файлов:
#!/bin/bash
# Создаем файл
touch test1
# Проверка существования файла
if [ -f test1 ]; then
echo "файл test1 существует"
fi
# Проверка отсутствия файла
if ! [ -f test2 ]; then
echo "файл test2 не существует"
fi
# Краткая шпаргалка:
# -d file — директория
# -f file — обычный файл
# -L file — символьная ссылка
# -r/-w/-x — права: чтение/запись/выполнение
# -s file — файл существует и не пустой
# f1 -nt f2 — f1 новее, чем f2
# f1 -ot f2 — f1 старше, чем f2
📌 Работа с FTP (без интерактива):
#!/bin/bash
ADDRESS=192.168.1.150
USER=root
PASSWORD=root
ftp -n -p $ADDRESS <<EoF
user $USER $PASSWORD
cd /usr/bin
put my_cool_program
quit
EoF
exit 0
📌 Работа с Telnet:
#!/bin/bash
(
sleep 1
echo "root"
echo "cd /tmp"
echo "ls"
sleep 1
echo "quit"
) | telnet 192.168.1.150
⚠️ Если требуется пароль — добавь ещё echo "mypassword" сразу после echo "root"
📌 Цикл по множеству значений:
#!/bin/bash
for A in раз два три четыре пять
do
echo "$A,"
done
echo "вышел заяц погулять"
🔐 Не забудь дать права на исполнение скрипта:
chmod a+x script.sh
👉@bash_srv2 748
Трюки терминала Bash
Полезные комбинации клавиш (хоткеи) и небольшие хитрости, которые сделают Вашу работу в Linux более эффективной.
Горячие клавиши" Bash с Ctrl
Ctrl + n — то же самое, что и стрелка вниз.
Ctrl + p — то же самое, что и стрелка вверх.
Ctrl + r — поиск по предыдущим командам из истории команд (history). Продолжайте нажимать Ctrl + r, чтобы искать дальше. Ctrl + Shift + r — поиск в другую сторону.
Ctrl + s — остановить вывод в терминал.
Ctrl + q — восстановить вывод в терминал после Ctrl + s.
Ctrl + a — перейти к началу строки (аналог клавиши Home).
Ctrl + e — перейти к концу строки (аналог клавиши End).
Ctrl + d — если вы ввели что-то, то Ctrl + d удаляет символ под курсором. В противном случае означает конец ввода и завершает текущую сессию Bash.
Ctrl + k — удалить весь текст от курсора до конца строки.
Ctrl + x + backspace — удалить весь текст от начала строки до курсора.
Ctrl + t — переставить символ до курсора на символ под курсором. Нажмите Esc + t для перестановки двух слов до курсора.
Ctrl + w — удалить слово до курсора; затем Ctrl + y, чтобы вставить его.
Ctrl + u — удалить строку перед курсором; Ctrl + y для вставки его.
Ctrl + _ — отменить ввод.
Ctrl + l — очищает окно терминала. То же самое, что и clear.
Ctrl + x + Ctrl + e — запускает редактор, определённый в переменной $EDITOR, для ввода команды. Полезно для многострочных команд.
Изменить заглавные на строчные и наоборот
Esc + u — преобразовать буквы от курсора до конца строки в заглавные буквы.
Esc + l — преобразовать буквы от курсора до конца строки в нижний регистр.
Esc + c — заменить букву под курсором на заглавную.
Запустить предыдущую команду ещё раз
Запустить команду из истории по номеру (например, 53)
!53
!! — запуск последней команды.
sudo !! — запустить предыдущую команду с sudo.
Запускает последнюю команду и меняет какой-то параметр. Например, меняем "aaa" на "bbb":
# Последняя команда: echo 'aaa'
$ ^aaa^bbb
$ echo 'bbb'
bbb
Важно: предыдущая команда заменит только первое вхождение "aaa". Если вы хотите заменить все вхождения, используйте :&:
^aaa^bbb^:&
# или
!!:gs/aaa/bbb/
Запустить последнюю команду, которая начинается с...
Например, до этого в истории команд была команда cat filename:
!cat
# или
!c
— запускает cat filename ещё раз.
Указание файлов по шаблону в Bash
/etc/pa*wd → /etc/passwd — символ * означает "несколько любых символов".
/b?n/?at → /bin/cat — символ ? означает "один любой символ".
ls -l [a-z]* — вывести список файлов, содержащих только буквы латинского алфавита. В квадратных скобках [] перечисляются символы, которые будут искаться. А символ * после [] означает "хоть сколько раз".
ls {*.sh,*.py} — вывести все .sh и .py файлы. {} используется для группировки нескольких шаблонов по принципу "или".
Полезные переменные окружения Bash
Короткие переменные:
$0 — оболочка командной строки или путь до запускаемого файла.
$1, $2, $3, ... — аргументы запуска скрипта.
$# — число аргументов, переданных в скрипт из терминала.
$? — код завершения последней команды.
$- — текущие опции, установленные для оболочки.
$$ — идентификатор текущего процесса.
$! — идентификатор процесса, завершённого последним.
Более длинные, но тоже полезные переменные:
$DESKTOP_SESSION — текущий менеджер дисплеев.
$EDITOR — редактор текста по умолчанию.
$LANG — используемый системой язык.
$PATH — список директорий, в которых будут искаться исполняемые файлы.
$PWD — текущая директория.
$SHELL — текущая оболочка командной строки.
$USER — имя текущего пользователя.
$HOSTNAME — имя текущего хоста (компьютера).
👉 @bash_srv2 748
🖥 Базовая шпаргалка по Bash (CLI)
📂 Работа с файлами и каталогами
ls -l # Подробный список файлов
ls -a # Показать скрытые файлы
cd /path/to/dir # Перейти в каталог
pwd # Показать текущий каталог
mkdir new_dir # Создать каталог
rm file.txt # Удалить файл
rm -rf dir/ # Удалить каталог с файлами
cp file1 file2 # Копировать файл
mv file1 file2 # Переместить/переименовать файл
🔍 Просмотр содержимого файлов
cat file.txt # Вывести весь файл
less file.txt # Просмотр файла постранично
head -n 10 file.txt # Первые 10 строк
tail -n 10 file.txt # Последние 10 строк
tail -f log.txt # Смотреть файл в реальном времени
📌 Поиск
find /dir -name "*.log" # Найти файлы по имени
grep "pattern" file.txt # Найти строку в файле
grep -r "error" /var/log # Рекурсивный поиск
ps aux | grep nginx # Найти процесс
📜 Управление процессами
top # Мониторинг процессов
htop # Улучшенный top (установите: apt install htop)
kill -9 PID # Убить процесс
pkill -9 nginx # Убить все процессы по имени
nohup script.sh & # Запустить в фоне
jobs # Показать фоновые задачи
fg %1 # Вернуть процесс в передний план
🌐 Сеть
ip a # Показать IP-адреса
netstat -tulnp # Список портов и процессов
ss -tulnp # Альтернатива netstat
ping 8.8.8.8 # Проверить соединение
curl -I google.com # Проверить заголовки сайта
wget URL # Скачать файл
📋 Управление пользователями
whoami # Кто я?
who # Кто в системе?
id user # Информация о пользователе
passwd # Сменить пароль
useradd user # Создать пользователя
usermod -aG sudo user # Добавить в sudo
deluser user # Удалить пользователя
📜 Полезные команды
history # История команд
clear # Очистить терминал
alias ll='ls -lah' # Создать алиас
df -h # Место на дисках
du -sh * # Размер каталогов
💡 Запомни:
- man <команда> — открыть справку по команде
- Ctrl+C — остановить выполнение
- Ctrl+Z — приостановить выполнение
📌 Сохраните эту шпаргалку и используйте для быстрого доступа! 🚀
👉 @bash_srv
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
