В Linux можно на ходу уменьшать или увеличивать количество используемой оперативной памяти. Единственное условие - если уменьшаете активную оперативную память, она должна быть свободна. Покажу на примерах.
Для начала воспользуемся командой lsmem для просмотра информации об использовании оперативной памяти. Команда, кстати, полезная. Рекомендую запомнить и использовать. С её помощью можно быстро посмотреть полную информацию об оперативе сервера:
Команда показывает в том числе блоки оперативной памяти, на которые её разбивает ядро. Вот с этими блоками и можно работать. Видим, что у нас 32 блока по 128M, а всего 4G памяти и вся она активна. Отключим 1G c помощью chmem.
или отключим 8 произвольных блоков:
Утилита пройдётся по всем блокам памяти. Те, что могут быть освобождены, она отключит. Процесс может занимать много времени, так как утилита будет пытаться перемещать информацию по памяти, чтобы высвободить заданный объём.
Проверяем, что получилось:
Возвращаем всё как было:
Вряд ли вам часто может быть нужна эта возможность. Но иногда может пригодиться, так что стоит знать о ней. Например, в некоторых системах виртуализации, добавленная на ходу память добавляется как offline и её нужно вручную активировать.
Ещё вариант, если вы точно знаете диапазон битой памяти. Вы можете отключить содержащий её блок с помощью chmem и какое-то время сервер ещё поработает.
#linux #terminal
Для начала воспользуемся командой lsmem для просмотра информации об использовании оперативной памяти. Команда, кстати, полезная. Рекомендую запомнить и использовать. С её помощью можно быстро посмотреть полную информацию об оперативе сервера:
# lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000f7ffffff 3.9G online yes 0-30
0x0000000100000000-0x0000000107ffffff 128M online yes 32
Memory block size: 128M
Total online memory: 4G
Total offline memory: 0B
Команда показывает в том числе блоки оперативной памяти, на которые её разбивает ядро. Вот с этими блоками и можно работать. Видим, что у нас 32 блока по 128M, а всего 4G памяти и вся она активна. Отключим 1G c помощью chmem.
# chmem -d 1G
или отключим 8 произвольных блоков:
# chmem -d -b 22-29
Утилита пройдётся по всем блокам памяти. Те, что могут быть освобождены, она отключит. Процесс может занимать много времени, так как утилита будет пытаться перемещать информацию по памяти, чтобы высвободить заданный объём.
Проверяем, что получилось:
# lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000afffffff 2.8G online yes 0-21
0x00000000b0000000-0x00000000efffffff 1G offline 22-29
0x00000000f0000000-0x00000000f7ffffff 128M online yes 30
0x0000000100000000-0x0000000107ffffff 128M online yes 32
Memory block size: 128M
Total online memory: 3G
Total offline memory: 1G
Возвращаем всё как было:
# chmem -e 1G
Вряд ли вам часто может быть нужна эта возможность. Но иногда может пригодиться, так что стоит знать о ней. Например, в некоторых системах виртуализации, добавленная на ходу память добавляется как offline и её нужно вручную активировать.
Ещё вариант, если вы точно знаете диапазон битой памяти. Вы можете отключить содержащий её блок с помощью chmem и какое-то время сервер ещё поработает.
#linux #terminal
👨💻 Многие, наверное, знают, что у меня рабочий ноутбук на операционной системе Windows 11. Я не раз об этом упоминал. Одно время были мысли перейти на Linux, но после того, как Microsoft сделали WSL2 на своей системе, надобность в отдельном Linux отпала. Меня полностью устраивает связка Windows 11 + Ubuntu в WSL2. Плюс, некоторые виртуалки тут же в HyperV запускаются.
Убунтой я пользуюсь активно и постоянно. Симбиоз реально удобный получается. Не нужны никакие компромиссы. Я получаю все плюсы обоих систем на одной машине. Сегодня решил поделиться с вами своими алиасами в Ubuntu, которыми пользуюсь постоянно. Это один из примеров того, зачем нужен Linux в Windows.
Сама Ubuntu у меня запускается через Windows Terminal. Профиль с ней установлен по умолчанию. Первый запуск буквально пару секунд занимает и у тебя тут же консоль Linux. Теперь про алиасы:
🔹
Это стандартный алиас, который есть во многих системах, но не всех. Некоторые путают его и считают отдельной утилитой. Я тоже так думал сначала, пока не попал в систему, где этого алиаса не было. Упомянул о нём, чтобы лишний раз напомнить, что это алиас к ls.
🔹
Показывает Топ 20 самых больших файлов в директории. Очень удобно директорию Downloads чистить.
🔹
Мне нравится вывод du именно в таком виде. 10 самых больших директорий, где на первом месте указан суммарный объём текущей, в которой ты находишься. А ниже 9 самых больших в ней. При этом в итоговом списке показаны полные пути. Примерно так:
🔹
Удобно быстро посмотреть свой IP адрес. С учётом того, что постоянно используются различные VPN, в том числе с заменой дефолтного шлюза, часто пользуюсь.
🔹
Это не алиас, а функция, так как приходится передавать параметр, но используется так же, как алиас. С помощью этой функции и сервиса ifconfig.co смотрю информацию по любому ip адресу. Примерно так:
Постоянно пользуюсь этой функцией, так как часто бывает нужно быстро проверить какой-то IP адрес.
🔹
Это почти то же самое, только выводит информацию о стране. Часто бывает нужно именно страну увидеть, так что сделал для этого отдельный алиас.
В принципе, это всё. Больше ничего не прижилось. Напомню, для тех, кто забыл. Алиасы и функции добавляются в файл
Если у вас есть что-то ещё полезное, чем постоянно пользуетесь, поделитесь в комментариях.
#linux #terminal
Убунтой я пользуюсь активно и постоянно. Симбиоз реально удобный получается. Не нужны никакие компромиссы. Я получаю все плюсы обоих систем на одной машине. Сегодня решил поделиться с вами своими алиасами в Ubuntu, которыми пользуюсь постоянно. Это один из примеров того, зачем нужен Linux в Windows.
Сама Ubuntu у меня запускается через Windows Terminal. Профиль с ней установлен по умолчанию. Первый запуск буквально пару секунд занимает и у тебя тут же консоль Linux. Теперь про алиасы:
🔹
alias ll='ls -alF'
Это стандартный алиас, который есть во многих системах, но не всех. Некоторые путают его и считают отдельной утилитой. Я тоже так думал сначала, пока не попал в систему, где этого алиаса не было. Упомянул о нём, чтобы лишний раз напомнить, что это алиас к ls.
🔹
alias bfiles='ls --human-readable --size -1 -S --classify | head -n 20'
Показывает Топ 20 самых больших файлов в директории. Очень удобно директорию Downloads чистить.
🔹
alias dusage='du -ah --max-depth=1 $(pwd) | sort -rh | head -n 10'
Мне нравится вывод du именно в таком виде. 10 самых больших директорий, где на первом месте указан суммарный объём текущей, в которой ты находишься. А ниже 9 самых больших в ней. При этом в итоговом списке показаны полные пути. Примерно так:
# dusage
58G /mnt/c/Users/Zerox/YandexDisk
28G /mnt/c/Users/Zerox/YandexDisk/share
8.9G /mnt/c/Users/Zerox/YandexDisk/manuals
4.5G /mnt/c/Users/Zerox/YandexDisk/work
4.2G /mnt/c/Users/Zerox/YandexDisk/!Сайты
4.0G /mnt/c/Users/Zerox/YandexDisk/docs
3.5G /mnt/c/Users/Zerox/YandexDisk/Загрузки
2.0G /mnt/c/Users/Zerox/YandexDisk/tmp
1.5G /mnt/c/Users/Zerox/YandexDisk/books
886M /mnt/c/Users/Zerox/YandexDisk/soft
🔹
alias myip='curl ifconfig.co'
Удобно быстро посмотреть свой IP адрес. С учётом того, что постоянно используются различные VPN, в том числе с заменой дефолтного шлюза, часто пользуюсь.
🔹
function ipa {
curl -s https://ifconfig.co/json?ip=$1 | jq 'del(.user_agent)'
}
Это не алиас, а функция, так как приходится передавать параметр, но используется так же, как алиас. С помощью этой функции и сервиса ifconfig.co смотрю информацию по любому ip адресу. Примерно так:
# ipa 77.88.8.1
{
"ip": "77.88.8.1",
"ip_decimal": 1297614849,
"country": "Russia",
"country_iso": "RU",
"country_eu": false,
"latitude": 55.7386,
"longitude": 37.6068,
"time_zone": "Europe/Moscow",
"asn": "AS13238",
"asn_org": "YANDEX LLC",
"hostname": "secondary.dns.yandex.ru"
}
Постоянно пользуюсь этой функцией, так как часто бывает нужно быстро проверить какой-то IP адрес.
🔹
function ipc {
curl -s https://ifconfig.co/json?ip=$1 | jq '.country'
}
Это почти то же самое, только выводит информацию о стране. Часто бывает нужно именно страну увидеть, так что сделал для этого отдельный алиас.
# ipc 77.88.8.1
"Russia"
В принципе, это всё. Больше ничего не прижилось. Напомню, для тех, кто забыл. Алиасы и функции добавляются в файл
.bashrc
, который находится в домашней директории пользователя. Прямо в том виде, как я их показал, можете добавлять к себе. После изменения файла надо его перечитать:# source ~/.bashrc
Если у вас есть что-то ещё полезное, чем постоянно пользуетесь, поделитесь в комментариях.
#linux #terminal
Если вам внезапно захочется запустить кого-нибудь или самому зайти в консоль через web, то предлагаю очень простой и быстрый способ. Воспользуйтесь утилитой ttyd.
Достаточно её скачать из репозитория:
Переименовать и сделать исполняемой:
Запускаем bash через браузер:
В консоли увидите порт, на котором запустилась программа. Откройте этот порт в браузере: http://172.22.221.121:7681 и увидите свою консоль.
Таким образом можно открыть не только bash, но и любую другую программу. Например, можно очень просто и быстро вывести через браузер top:
или mc:
Если запустить ttyd без параметров, то увидите все доступные ключи. Можно указать используемый порт, забиндить на какой-то конкретный интерфейс, настроит basic аутентификацию, задать режим read-only и т.д. Там много интересных возмоностей.
Утилита простая и удобная. Люблю такие. Никаких заморочек с настройкой и установкой. Скорее всего прямо сейчас она вряд ли пригодится, но стоит запомнить, что есть такая возможность. Иногда это может быть полезным. Банально тот же top повесить на всеобщий обзор для каких-то целей отладки. Это быстрее, чем настраивать кому-то доступ по ssh.
#bash #terminal
Достаточно её скачать из репозитория:
# wget https://github.com/tsl0922/ttyd/releases/download/1.7.3/ttyd.i686
Переименовать и сделать исполняемой:
# mv ttyd.i686 /usr/local/bin/ttyd
# chmod +x /usr/local/bin/ttyd
Запускаем bash через браузер:
# ttyd bash
В консоли увидите порт, на котором запустилась программа. Откройте этот порт в браузере: http://172.22.221.121:7681 и увидите свою консоль.
Таким образом можно открыть не только bash, но и любую другую программу. Например, можно очень просто и быстро вывести через браузер top:
# ttyd top
или mc:
# ttyd mc
Если запустить ttyd без параметров, то увидите все доступные ключи. Можно указать используемый порт, забиндить на какой-то конкретный интерфейс, настроит basic аутентификацию, задать режим read-only и т.д. Там много интересных возмоностей.
Утилита простая и удобная. Люблю такие. Никаких заморочек с настройкой и установкой. Скорее всего прямо сейчас она вряд ли пригодится, но стоит запомнить, что есть такая возможность. Иногда это может быть полезным. Банально тот же top повесить на всеобщий обзор для каких-то целей отладки. Это быстрее, чем настраивать кому-то доступ по ssh.
#bash #terminal
Один подписчик поделился полезным сервисом, про который я ранее не слышал:
⇨ https://cmdgenerator.phphe.com.
С его помощью можно подготовить итоговую команду для популярных утилит командной строки Linux с набором параметров. Сделано добротно и удобно. Это такая продвинутая замена man, которая позволяет быстрее сформировать нужные параметры. Единственное, заметил, что некоторые ключи не совпадают с ключами этой утилиты в том же Debian. Не понятно, для какой версии они актуальны. Стоило бы указать.
Что-то похожее я как будто уже видел, но сходу не могу вспомнить. На ум приходит другой сервис, который действует наоборот. Длинную консольную команду разбирает на отдельные части и поясняет, что каждая из них делает:
⇨ https://explainshell.com
Похожие на первый сервисы есть для отдельных утилит. Например, я знаю для find удобную штуку:
⇨ find-command-generator
Он тоже неплохо сделан и может существенно помочь. У find куча параметров, которые невозможно запомнить. Надо либо готовые команды записывать, либо открывать man и искать нужное. Этот помощник может сэкономить время. Для cron ещё полно похожих сервисов.
#bash #terminal
⇨ https://cmdgenerator.phphe.com.
С его помощью можно подготовить итоговую команду для популярных утилит командной строки Linux с набором параметров. Сделано добротно и удобно. Это такая продвинутая замена man, которая позволяет быстрее сформировать нужные параметры. Единственное, заметил, что некоторые ключи не совпадают с ключами этой утилиты в том же Debian. Не понятно, для какой версии они актуальны. Стоило бы указать.
Что-то похожее я как будто уже видел, но сходу не могу вспомнить. На ум приходит другой сервис, который действует наоборот. Длинную консольную команду разбирает на отдельные части и поясняет, что каждая из них делает:
⇨ https://explainshell.com
Похожие на первый сервисы есть для отдельных утилит. Например, я знаю для find удобную штуку:
⇨ find-command-generator
Он тоже неплохо сделан и может существенно помочь. У find куча параметров, которые невозможно запомнить. Надо либо готовые команды записывать, либо открывать man и искать нужное. Этот помощник может сэкономить время. Для cron ещё полно похожих сервисов.
#bash #terminal
🎓 Сегодня пятница, а пятница — это почти выходной, когда уже не хочется заниматься делами. Лучше это время потратить с пользой и заняться самообразованием. А в этом нам может помочь набор TUI программ для обучения в консоли.
⇨ https://github.com/learnbyexample/TUI-apps
Их тут несколько, и я начал с того, что мне показалось наиболее полезным - Linux CLI Text Processing Exercises. Это простенькая оболочка с вопросами на тему обработки текстовых файлов консольными утилитами в Linux. Поставил по инструкции:
Запускаю, первый же вопрос:
❓Display the first 5 lines for the input file ip.txt.
Для меня это просто. Отвечаю:
Ответ правильный и мне предлагают ещё вариант:
С sed часто работаю, но не знал, что с его помощью можно так просто вывести первые 5 строк. Записал сразу себе в шпаргалку.
Следующий вопрос посложнее, но тоже в целом простой:
❓Display except the first 5 lines for the input blocks.txt.
Выводим всё, кроме первых 5-ти строк:
Я ошибся и срезал только 4 строки. Поправился:
Утилита подтвердила, что мой вариант правильный. Честно говоря, я думал, что вряд ли в ней будет вариант с tail, поэтому взял именно его. Но она в виде правильных вариантов предложила как раз с tail и ещё с sed:
Тоже сразу записал в шпаргалку. Решил ещё проверить вариант с awk. Я думал, что именно он и будет предложен, так как первый пришёл в голову:
Тоже помечен, как правильный. Возможно программа проверяет вывод, используя все доступные системные утилиты, так что правильным будет даже тот вариант, что отсутствует в её базе.
Таких заданий тут много. Конкретно в этой программе 68. Проходить увлекательно и полезно, так что рекомендую для самообразования и пополнения своей коллекции bash костылей. Можно в исходниках сразу всё посмотреть, но не рекомендую. Так ничего не запомнится. А если самому подумать, то лучше отложится в голове.
Вот примерчик из того, что будет ближе к концу:
❓From blocks.txt extract only the 3rd block. A line containing %=%= determines the start of a block.
То есть файл разделён на блоки, а разделитель блоков - символы
#обучение #terminal #bash
⇨ https://github.com/learnbyexample/TUI-apps
Их тут несколько, и я начал с того, что мне показалось наиболее полезным - Linux CLI Text Processing Exercises. Это простенькая оболочка с вопросами на тему обработки текстовых файлов консольными утилитами в Linux. Поставил по инструкции:
# python3 -m venv textual_apps
# cd textual_apps
# source bin/activate
# pip install cliexercises
# cliexercises
Запускаю, первый же вопрос:
❓Display the first 5 lines for the input file ip.txt.
Для меня это просто. Отвечаю:
head -n 5 ip.txt
Ответ правильный и мне предлагают ещё вариант:
sed '5q' ip.txt
С sed часто работаю, но не знал, что с его помощью можно так просто вывести первые 5 строк. Записал сразу себе в шпаргалку.
Следующий вопрос посложнее, но тоже в целом простой:
❓Display except the first 5 lines for the input blocks.txt.
Выводим всё, кроме первых 5-ти строк:
tail -n +5 blocks.txt
Я ошибся и срезал только 4 строки. Поправился:
tail -n +6 blocks.txt
Утилита подтвердила, что мой вариант правильный. Честно говоря, я думал, что вряд ли в ней будет вариант с tail, поэтому взял именно его. Но она в виде правильных вариантов предложила как раз с tail и ещё с sed:
sed '1,5d' blocks.txt
Тоже сразу записал в шпаргалку. Решил ещё проверить вариант с awk. Я думал, что именно он и будет предложен, так как первый пришёл в голову:
awk 'NR>5' blocks.txt
Тоже помечен, как правильный. Возможно программа проверяет вывод, используя все доступные системные утилиты, так что правильным будет даже тот вариант, что отсутствует в её базе.
Таких заданий тут много. Конкретно в этой программе 68. Проходить увлекательно и полезно, так что рекомендую для самообразования и пополнения своей коллекции bash костылей. Можно в исходниках сразу всё посмотреть, но не рекомендую. Так ничего не запомнится. А если самому подумать, то лучше отложится в голове.
Вот примерчик из того, что будет ближе к концу:
❓From blocks.txt extract only the 3rd block. A line containing %=%= determines the start of a block.
То есть файл разделён на блоки, а разделитель блоков - символы
%=%=
, надо вывести 3-й блок. Для меня это уже сложно, чтобы что-то сходу придумать. Вот решение:awk '$0 == \"%=%=\"{c++} c==3' blocks.txt
#обучение #terminal #bash
У меня в управлении много различных серверов. Я обычно не заморачивался с типом файловых систем. Выбирал то, что сервер ставит по умолчанию. Для серверов общего назначения особо нет разницы, будет это XFS или EXT4. А выбор обычно из них стоит. RPM дистрибутивы используют по умолчанию XFS, а DEB — EXT4.
Лично для меня имеют значения следующие принципиальные отличия:
1️⃣ XFS можно расширить, но нельзя уменьшить. EXT4 уменьшать можно. На практике это очень редко надо, но разница налицо.
2️⃣ У EXT4 по умолчанию создаётся не очень много inodes. Я нередко упирался в стандартное ограничение. В XFS их по умолчанию очень много, так как используется динамическое выделение. С проблемой нехватки не сталкивался ни разу.
3️⃣ EXT4 по умолчанию резервирует 5% свободного места на диске. Это можно изменить при желании. XFS если что-то и резервирует, то в разы меньше и это не настраивается.
❗️У меня была заметка про отличия ext4 и xfs. Можете почитать, кому интересно. Рассказать я хотел не об этом. Нередко нужно узнать, какая файловая система используется, особенно, когда закончилось свободное место. Для этого использую команду mount без ключей:
Она вываливает трудночитаемую лапшу в терминал, где трудно быстро найти корневой или какой-то другой раздел. Конкретный раздел ещё можно грепнуть, а вот корень никак. Я всё думал, как же сделать, чтобы было удобно. Просмотрел все ключи mount или возможности обработки вывода. Оказалось, нужно было подойти с другой стороны. У утилиты
И не надо мучать mount. У df вывод отформатирован, сразу всё видно.
#bash #terminal
Лично для меня имеют значения следующие принципиальные отличия:
1️⃣ XFS можно расширить, но нельзя уменьшить. EXT4 уменьшать можно. На практике это очень редко надо, но разница налицо.
2️⃣ У EXT4 по умолчанию создаётся не очень много inodes. Я нередко упирался в стандартное ограничение. В XFS их по умолчанию очень много, так как используется динамическое выделение. С проблемой нехватки не сталкивался ни разу.
3️⃣ EXT4 по умолчанию резервирует 5% свободного места на диске. Это можно изменить при желании. XFS если что-то и резервирует, то в разы меньше и это не настраивается.
❗️У меня была заметка про отличия ext4 и xfs. Можете почитать, кому интересно. Рассказать я хотел не об этом. Нередко нужно узнать, какая файловая система используется, особенно, когда закончилось свободное место. Для этого использую команду mount без ключей:
# mount
Она вываливает трудночитаемую лапшу в терминал, где трудно быстро найти корневой или какой-то другой раздел. Конкретный раздел ещё можно грепнуть, а вот корень никак. Я всё думал, как же сделать, чтобы было удобно. Просмотрел все ключи mount или возможности обработки вывода. Оказалось, нужно было подойти с другой стороны. У утилиты
df
есть нужный ключ:# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
udev devtmpfs 1988408 0 1988408 0% /dev
tmpfs tmpfs 401244 392 400852 1% /run
/dev/sda2 ext4 19948144 2548048 16361456 14% /
tmpfs tmpfs 2006220 0 2006220 0% /dev/shm
tmpfs tmpfs 5120 0 5120 0% /run/lock
/dev/sda1 vfat 523244 5928 517316 2% /boot/efi
tmpfs tmpfs 401244 0 401244 0% /run/user/0
И не надо мучать mount. У df вывод отформатирован, сразу всё видно.
#bash #terminal
В комментариях к заметке, где я рассказывал про неудобочитаемый вывод mount один человек посоветовал утилиту column, про которую я раньше вообще не слышал и не видел, чтобы ей пользовались. Не зря говорят: "Век живи, век учись". Ведение канала и сайта очень развивает. Иногда, когда пишу новый текст по трудной теме, чувствую, как шестерёнки в голове скрипят и приходится напрягаться. Это реально развивает мозг и поддерживает его в тонусе.
Возвращаясь к column. Эта простая утилита делает одну вещь: выстраивает данные в удобочитаемые таблицы, используя различные разделители. В общем случае разделителем считается пробел, но его через ключ можно переназначить.
Структурируем вывод mount:
Получается очень аккуратно и читаемо. Ничего придумывать не надо, чтобы преобразовать вывод.
А вот пример column, но с заменой разделителя на двоеточие:
Получается удобочитаемое представление. Из него можно без особых проблем вывести любой столбец через awk. Как по мне, так это самый простой способ, который сразу приходит в голову и не надо думать, как тут лучше выделить какую-то фразу. Выводим только имена пользователей:
Каждый пользователь в отдельной строке. Удобно сформировать массив и передать куда-то на обработку.
Утилита полезная и удобная. Главное теперь про неё не забыть, чтобы применить в нужный момент.
#bash #terminal
Возвращаясь к column. Эта простая утилита делает одну вещь: выстраивает данные в удобочитаемые таблицы, используя различные разделители. В общем случае разделителем считается пробел, но его через ключ можно переназначить.
Структурируем вывод mount:
# mount | column -t
Получается очень аккуратно и читаемо. Ничего придумывать не надо, чтобы преобразовать вывод.
А вот пример column, но с заменой разделителя на двоеточие:
# column -s ":" -t /etc/passwd
Получается удобочитаемое представление. Из него можно без особых проблем вывести любой столбец через awk. Как по мне, так это самый простой способ, который сразу приходит в голову и не надо думать, как тут лучше выделить какую-то фразу. Выводим только имена пользователей:
# column -s ":" -t /etc/passwd | awk '{print $1}'
Каждый пользователь в отдельной строке. Удобно сформировать массив и передать куда-то на обработку.
Утилита полезная и удобная. Главное теперь про неё не забыть, чтобы применить в нужный момент.
#bash #terminal
Вы знали, что curl умеет отправлять почту через внешние smtp серверы? Я в целом знаю, что curl умеет всё, что только можно придумать про передачу данных, но конкретно вопрос не прорабатывал, хотя вскользь уже упоминал об этом, но в рамках решения другой задачи, поэтому особо не погружался в тему. Поэтому для отправки почты из консоли всё время ставлю какую-то дополнительную утилиту, типа mailx. На самом деле это не обязательно. Сейчас покажу, как отправлять почту через curl, не светя пароль в консоли.
Сразу ссылка на документацию. Оправляем почту полностью через ключи curl:
Содержимое mail.txt примерно следующее:
Причём с помощью curl очень удобно управлять адресом отправителя. В mail.txt его любой указать можно, а не тот, от которого идёт отправка. Впрочем, как и другие заголовки.
Не очень хорошая идея светить почтовый пароль в консоли. Можно его спрятать в
Каждый сервер на новой строке. Удобно, если используется отправка через несколько разных серверов. В соответствии с указанным smtp сервером берутся настройки учётной записи из файла
Так как мы используем ключ
Если используется шифрованное соединение и порт 465, то достаточно просто указать адрес сервера в виде
Для того, чтобы явно указать HELO / EHLO при отправке, добавьте его через слеш после адреса сервера. Примерно так:
#terminal #curl
Сразу ссылка на документацию. Оправляем почту полностью через ключи curl:
# curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --user 'root@server.ru:password123' --upload-file ~/mail.txt
Содержимое mail.txt примерно следующее:
From: "Vladimir" <root@server.ru>
To: "User" <user@gmail.com>
Subject: Mail from curl
Hello! How are you?
Причём с помощью curl очень удобно управлять адресом отправителя. В mail.txt его любой указать можно, а не тот, от которого идёт отправка. Впрочем, как и другие заголовки.
Не очень хорошая идея светить почтовый пароль в консоли. Можно его спрятать в
.netrc
файл. Для этого его надо создать в домашней директории пользователя ~/.netrc
. Содержание такое:machine mail.server.ru login root@server.ru password password123
machine mail.server02.ru login user@server02.ru password password12345
Каждый сервер на новой строке. Удобно, если используется отправка через несколько разных серверов. В соответствии с указанным smtp сервером берутся настройки учётной записи из файла
.netrc
. Команда на отправку с использованием .netrc
будет такая:# curl -v --url "smtp://mail.server.ru:25" --mail-from "root@server.ru" --mail-rcpt "user@gmail.com" --netrc --upload-file ~/mail.txt
Так как мы используем ключ
-v
, в консоли видим весь лог общения с почтовым сервером, что может быть удобно для отладки. Если не указывать никаких ключей для TLS, то будет использоваться нешифрованное соединение. Если нужно только шифрованное, то можно добавить ключ --ssl-reqd
, а если хотите чтобы при поддержке сервером шифрование использовалось, а если поддержки нет, то нет, тогда добавьте ключ --ssl
. Если используется шифрованное соединение и порт 465, то достаточно просто указать адрес сервера в виде
smtps://mail.server.ru
. Отдельно указывать порт и ключи для ssl не обязательно. Для того, чтобы явно указать HELO / EHLO при отправке, добавьте его через слеш после адреса сервера. Примерно так:
smtp://mail.server.ru/client_helo.server.ru
#terminal #curl
Когда готовил материал по отправке email сообщений через curl, подумал, он же наверное и читать умеет. И не ошибся. Curl реально умеет читать, и не только, почту по imap. Это открывает очень широкие возможности по мониторингу почтовых серверов с помощью утилиты.
Меня не раз спрашивали, как удобнее всего настроить мониторинг почтовых сообщений в ящике, чтобы приходили уведомления при получении письма определённого содержания. Я обычно советовал либо на самом почтовом сервере прямо в ящике анализировать текст писем, если это возможно. Либо использовать какие-то программы типа fetchmail, imapsync или обычные почтовые клиенты. И уже в них как-то анализировать письма.
Но с curl всё получается намного проще. Она много чего умеет. Расскажу по порядку. Сразу важная сноска, которая сильно затормозила меня в этом вопросе. Когда будете пробовать, возьмите свежую версию curl. Более старые некоторые команды для imap не поддерживают. Я сначала наткнулся на это в старом сервере Centos 7. Потом уже перешёл на современный Debian и там всё получилось.
Сразу перенесём логин с паролем в отдельный файл
Проверяем количество сообщений в imap папке INBOX:
Получили число 405. Посмотрим, сколько из них непрочитанных:
147 непрочитанных сообщений. Думаю, идею вы поняли. С помощью curl можно напрямую передавать серверу команды imap.
Смотрим список директорий в ящике:
Или просто:
Ищем в ящике письма с темой test:
или так:
Сообщения от определённого адресата:
Получили UIDs писем. Смотрим содержание письма с конкретным UID. Для этого надо добавить ключ
или так:
И так далее. Письмо после проверки можно пометить прочтённым, переместить в другую директорию, удалить. Чтобы осмысленно дёргать imap сервер, достаточно посмотреть описание протокола. Информация по нему легко находится в поиске.
Команды imap рассмотрены в упоминаемом недавно курсе по сетям от Созыкина Андрея. Вот конкретный урок: ▶️ Протокол IMAP. Вообще, было интересно во всём этом разобраться. Если надо будет настроить мониторинг очередного почтового сервера, попробую что-то применить с помощью curl.
Первое, что приходит в голову в плане мониторинга - отправлять письмо с меткой времени в теле, а потом забирать его и анализировать эту метку. Если метка старая, значит письма не ходят. Это надёжнее, чем просто проверять статус служб и доступность портов. Тут и smtp, и imap сервер проверяются. И реализуется полностью с помощью curl и zabbix.
#curl #terminal
Меня не раз спрашивали, как удобнее всего настроить мониторинг почтовых сообщений в ящике, чтобы приходили уведомления при получении письма определённого содержания. Я обычно советовал либо на самом почтовом сервере прямо в ящике анализировать текст писем, если это возможно. Либо использовать какие-то программы типа fetchmail, imapsync или обычные почтовые клиенты. И уже в них как-то анализировать письма.
Но с curl всё получается намного проще. Она много чего умеет. Расскажу по порядку. Сразу важная сноска, которая сильно затормозила меня в этом вопросе. Когда будете пробовать, возьмите свежую версию curl. Более старые некоторые команды для imap не поддерживают. Я сначала наткнулся на это в старом сервере Centos 7. Потом уже перешёл на современный Debian и там всё получилось.
Сразу перенесём логин с паролем в отдельный файл
~/.netrc
:machine mail.server.tld login username password supersecretpw
Проверяем количество сообщений в imap папке INBOX:
# curl "imap:/mail.server.tld" -n -X 'STATUS INBOX (MESSAGES)'
* STATUS INBOX (MESSAGES 405)
Получили число 405. Посмотрим, сколько из них непрочитанных:
# curl "imap://mail.server.tld" -n -X 'STATUS INBOX (UNSEEN)'
* STATUS INBOX (UNSEEN 147)
147 непрочитанных сообщений. Думаю, идею вы поняли. С помощью curl можно напрямую передавать серверу команды imap.
Смотрим список директорий в ящике:
# curl "imap://mail.server.tld" -n -X 'LIST "" "*"'
* LIST (\HasNoChildren \Marked \Trash) "/" Trash
* LIST (\HasNoChildren \UnMarked \Junk) "/" Junk
* LIST (\HasNoChildren \UnMarked \Drafts) "/" Drafts
* LIST (\HasNoChildren \Sent) "/" Sent
* LIST (\HasChildren) "/" INBOX
Или просто:
# curl "imap://mail.server.tld" -n
Ищем в ящике письма с темой test:
# curl "imap://mail.server.tld/INBOX?SUBJECT%20test" -n
* SEARCH 62 404 405 406
или так:
# curl "imap://mail.server.tld/INBOX" -n -X 'SEARCH HEADER Subject test'
Сообщения от определённого адресата:
# curl "imap://mail.server.tld/INBOX" -n -X 'SEARCH From vladimir@zeroxzed.ru'
* SEARCH 292 404 405 406
Получили UIDs писем. Смотрим содержание письма с конкретным UID. Для этого надо добавить ключ
-v
, так как оно передаётся в отладочной информации, как и все остальные ответы сервера:# curl -v "imap://mail.server.tld/INBOX" -n -X 'FETCH 406 BODY[TEXT]'
или так:
# curl -v "imap://mail.server.tld/INBOX;UID=406/;BODY=TEXT" -n
И так далее. Письмо после проверки можно пометить прочтённым, переместить в другую директорию, удалить. Чтобы осмысленно дёргать imap сервер, достаточно посмотреть описание протокола. Информация по нему легко находится в поиске.
Команды imap рассмотрены в упоминаемом недавно курсе по сетям от Созыкина Андрея. Вот конкретный урок: ▶️ Протокол IMAP. Вообще, было интересно во всём этом разобраться. Если надо будет настроить мониторинг очередного почтового сервера, попробую что-то применить с помощью curl.
Первое, что приходит в голову в плане мониторинга - отправлять письмо с меткой времени в теле, а потом забирать его и анализировать эту метку. Если метка старая, значит письма не ходят. Это надёжнее, чем просто проверять статус служб и доступность портов. Тут и smtp, и imap сервер проверяются. И реализуется полностью с помощью curl и zabbix.
#curl #terminal
Когда на тестовом стенде разворачиваешь что-то кластерное и надо на нескольких хостах выполнить одни и те же действия, внезапно может помочь tmux. У него есть режим синхронизации панелей. С его помощью можно делать одновременно одно и то же на разных хостах.
Работает это так. Ставим tmux:
Запускаем на одном из хостов и открываем несколько панелей. По одной панели на каждый хост. Делается это с помощью комбинации клавиш
После этого в каждой панели нужно подключиться по SSH к нужному хосту. У вас получится несколько панелей, в каждой отдельная консоль от удалённого хоста. Теперь включаем режим синхронизации панелей. Нажимаем опять префикс
Включён режим синхронизации панелей. Теперь всё, что вводится в активную панель, будет автоматически выполняться во всех остальных. Отключить этот режим можно точно так же, как и включали. Просто ещё раз вводим эту же команду.
Если постоянно используете один и тот же стенд, то можно автоматизировать запуск tmux и подключение по SSH, чтобы не делать это каждый раз вручную.
#linux #terminal
Работает это так. Ставим tmux:
# apt install tmux
Запускаем на одном из хостов и открываем несколько панелей. По одной панели на каждый хост. Делается это с помощью комбинации клавиш
CTRL-B
и дальше либо %
, либо "
. Первое - это вертикальное разделение, второе - горизонтальное. Переключаться между панелями с помощью CTRL-B
и стрелочек. В общем, всё стандартно для тех, кто работает с tmux.После этого в каждой панели нужно подключиться по SSH к нужному хосту. У вас получится несколько панелей, в каждой отдельная консоль от удалённого хоста. Теперь включаем режим синхронизации панелей. Нажимаем опять префикс
CTRL-B
и дальше пишем снизу в командной строке tmux::setw synchronize-panes
Включён режим синхронизации панелей. Теперь всё, что вводится в активную панель, будет автоматически выполняться во всех остальных. Отключить этот режим можно точно так же, как и включали. Просто ещё раз вводим эту же команду.
Если постоянно используете один и тот же стенд, то можно автоматизировать запуск tmux и подключение по SSH, чтобы не делать это каждый раз вручную.
#linux #terminal