{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог ни о чём, заметки с тегом: скрипт",
    "home_page_url": "https:\/\/gladilov.org.ru\/blog\/tags\/script\/",
    "feed_url": "https:\/\/gladilov.org.ru\/blog\/tags\/script\/json\/",
    "icon": false,
    "author": {
        "name": "Павел Гладилов",
        "url": "https:\/\/gladilov.org.ru\/blog\/",
        "avatar": false
    },
    "items": [
        {
            "id": "1271",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/gimp-context-menu\/",
            "title": "Добавление контекстного меню GIMP’а",
            "content_html": "<p>Поставил GIMP (в <img style=\"vertical-align:middle!important;\" src=\"\/img\/install\/os\/windows.png\" \/> Шindoшs), захотел сделать для файлов изображений контекстное меню «Редактировать в GIMP». Для этого создал <img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/reg.png\" \/> reg-файл с таким содержимым (путь к бинарнику редактора нужно исправить на актуальный):<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>Windows Registry Editor Version 5.00\r\n[HKEY_CLASSES_ROOT\\SystemFileAssociations\\image\\shell\\EditWithGIMP]\r\n@=&quot;Редактировать в &amp;GIMP&quot;\r\n[HKEY_CLASSES_ROOT\\SystemFileAssociations\\image\\shell\\EditWithGIMP\\command]\r\n@=&quot;\\&quot;C:\\\\Program Files\\\\GIMP 2\\\\bin\\\\gimp-2.10.exe\\&quot; \\&quot;%1\\&quot;&quot;<\/code><\/pre><\/pre>\n<p><\/font>После выполнения reg-файла контекстное меню появляется.<\/p>\n<p><img src=\"\/blog\/pictures\/gimp-edit.jpg\" \/><\/p>\n",
            "date_published": "2020-04-28T14:15:48+03:00",
            "date_modified": "2020-04-28T21:21:13+03:00",
            "_date_published_rfc2822": "Tue, 28 Apr 2020 14:15:48 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "1271",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "671",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/elegant-fork-bomb\/",
            "title": "Элегантная форк-бомба",
            "content_html": "<table><tbody><tr height=\"100\"><td style=\"width:100px;background:url(\/blog\/pictures\/header\/alert100.png) center center no-repeat;width:100px;height:100px;\"><\/td><td width=\"20\"><\/td><td><p><br \/><b>ВНИМАНИЕ!<br \/>Не запускайте эту команду, чтобы «проверить» её, так как у вашего компьютера скорее всего произойдёт сбой, влекущий за собой принудительную перезагрузку системы.<\/b><\/p>\n<\/td><\/tr><\/tbody><\/table><p>Текст бомбы:<font size=\"7\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>:(){ :|:&amp; };:<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p>Что она делает:<br \/>\n<b><font style=\"background-color:powderblue;\"> :() <\/font><\/b>— объявление функции с именем <b>:<\/b><br \/>\n<b><font style=\"background-color:powderblue;\"> {:|: &} <\/font><\/b>— в теле функции описан запуск её же и отправка вывода снова в функцию <b>:<\/b> (в фоне)<br \/>\n<b><font style=\"background-color:powderblue;\"> ; <\/font><\/b>— разделитель команд, как и <b>&&<\/b>.<br \/>\n<b><font style=\"background-color:powderblue;\"> : <\/font><\/b>— первый запуск функции <b>:<\/b><\/p>\n<p><font size=\"2\"><a href=\"https:\/\/askubuntu.com\/questions\/159491\/why-did-the-command-make-my-system-lag-so-badly-i-had-to-reboot\">Источник<\/a><\/font><\/p>\n",
            "date_published": "2018-12-06T10:41:02+03:00",
            "date_modified": "2018-12-06T10:40:57+03:00",
            "_date_published_rfc2822": "Thu, 06 Dec 2018 10:41:02 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "671",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "446",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/file-for-ttrss\/",
            "title": "Напильник для Tiny Tiny RSS",
            "content_html": "<p><img src=\"\/blog\/pictures\/file-ttrss\/ttrss-file.jpg\" class=\"main_left_img\" \/> Как я недавно писал <a href=\"\/blog\/all\/auto-executing-command-in-screen\/\">тут<\/a>, после переезда на VDS’ку на сервере из-за недостатка памяти стала отваливаться сессия screen’а, в которой крутится демон опроса и наполнения БД новостей Tiny Tiny RSS. Для контроля того, что screen-сессия и процесс демона опроса и агрегирования новостей запущены, я написал скриптик на похапе, который опрашивает состояние этих процессов и отображает на WEB-странице. <b class=\"spoiler-controller pop-up_camper_28_07_18\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18\"><\/p>\n<p><\/p>\n<p>Возможны 2<sup>2<\/sup> вариантов:<\/p>\n<ol start=\"1\">\n<li>Скрин запущен, демон запущен: <b class=\"spoiler-controller pop-up_camper_28_07_18-onon\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-onon\"><img src=\"\/blog\/pictures\/file-ttrss\/on-on.jpg\" \/><\/section><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Скрин запущен, демон выпал: <b class=\"spoiler-controller pop-up_camper_28_07_18-offon\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-offon\"><img src=\"\/blog\/pictures\/file-ttrss\/off-on.jpg\" \/><\/section><\/li>\n<\/ol>\n<ol start=\"3\">\n<li>Скрин отвалился, демон вместе с ним: <b class=\"spoiler-controller pop-up_camper_28_07_18-offoff\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-offoff\"><img src=\"\/blog\/pictures\/file-ttrss\/off-off.jpg\" \/><\/section><\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Четвёртый вариант я не привожу, так как демона не в скрине я никогда не запускаю.<\/li>\n<\/ol>\n<p>Однако мне достаточно быстро надоело открывать новую вкладку со страницей статистики каждый раз, когда у меня возникало подозрение о том, что скрин\/демон отвалился. Поэтому я интегрировал индикаторы работы прямо на страницу Tiny Tiny RSS.<\/p>\n<p>Ищу две картинки индикаторов <img src=\"\/blog\/pictures\/file-ttrss\/on.png\" style=\"vertical-align:middle;\" \/> ON и <img src=\"\/blog\/pictures\/file-ttrss\/off.png\" style=\"vertical-align:middle;\" \/> OFF, создаю файл скрипта опроса (допустим, readerstates.php) в том каталоге, где развёрнут TT RSS, с таким содержимым:<br \/>\n<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>&lt;?php $screen=exec(&quot;ps aux | grep -e 'SCREEN -dmS reade[r]'&quot;);\r\n$daemon=exec(&quot;ps aux | grep -e 'php &lt;путь к скрипту демона&gt;\/update_daemon2.ph[p]'&quot;);\r\n$scrn_t=$dmn_t='не запущен';\r\n$scrn=$dmn='off';if($screen){$scrn='on';$scrn_t='запущен';}\r\nif($daemon){$dmn='on';$dmn_t='запущен';}?&gt;\r\n&lt;img src='\/... путь к картинке ...\/&lt;?php echo$dmn;?&gt;.png' title='Демон &lt;?php echo$dmn_t;?&gt;' \/&gt;\r\n&lt;img src='\/... путь к картинке ...\/&lt;?php echo$scrn;?&gt;.png' title='SCREEN &lt;?php echo$scrn_t;?&gt;' \/&gt;<\/code><\/pre><\/pre>\n<p><\/font>Затем прописываю require в файле <b>index.php<\/b>:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>&lt;?php\r\n    foreach (PluginHost::getInstance()-&gt;get_hooks(PluginHost::HOOK_TOOLBAR_BUTTON) as $p) {\r\n        echo $p-&gt;hook_toolbar_button();\r\n    }\r\n    require_once &quot;readerstates.php&quot;;\r\n?&gt;<\/code><\/pre><\/pre>\n<p><\/font>После этого все вышеописанные ситуации выглядят у меня на странице так:<\/p>\n<ol start=\"1\">\n<li>Скрин запущен, демон работает: <b class=\"spoiler-controller pop-up_camper_28_07_18-ronon\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-ronon\"><img src=\"\/blog\/pictures\/file-ttrss\/r-on-on.jpg\" \/><\/section><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Скрин запущен, демон нет: <b class=\"spoiler-controller pop-up_camper_28_07_18-roffon\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-roffon\"><img src=\"\/blog\/pictures\/file-ttrss\/r-off-on.jpg\" \/><\/section><\/li>\n<\/ol>\n<ol start=\"3\">\n<li>Скрин отвалился, демон тоже: <b class=\"spoiler-controller pop-up_camper_28_07_18-roffoff\">Показать<\/b><section class=\"spoiler pop-up_camper_28_07_18-roffoff\"><img src=\"\/blog\/pictures\/file-ttrss\/r-off-off.jpg\" \/><\/section><\/section><\/li>\n<\/ol>\n",
            "date_published": "2018-07-28T00:24:19+03:00",
            "date_modified": "2018-07-28T00:22:51+03:00",
            "_date_published_rfc2822": "Sat, 28 Jul 2018 00:24:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "446",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "429",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/auto-executing-command-in-screen\/",
            "title": "Автозапуск команды в screen’е",
            "content_html": "<style>\r\nkbd {\r\nborder:1px solid gray;\r\nfont-size:0.8em;\r\nbox-shadow:1px 0 1px 0 #eee, 0 2px 0 2px #ccc, 0 2px 0 3px #444;\r\n-webkit-border-radius:3px;\r\n-moz-border-radius:3px;\r\nborder-radius:3px;\r\nmargin:2px 3px;\r\npadding:1px 5px;\r\n}\r\n<\/style>\n<p>После переезда моего <a href=\"\/\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/favicon.png\" \/> сайта<\/a> на VDS’ку шум раздолбанного вентилятора Asus EEE PC 710 перестал меня беспокоить, но теперь периодически вываливается screen-сессия, в которой крутится демон опроса и наполнения БД новостей TTRSS (чаще всего демон отваливался с ошибкой 12 «недостаточно памяти», но иногда и сам процесс скрина отъезжал).<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_18_07_18-2\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_18_07_18-2\"><\/p>\n<p><\/p>\n<p>Для повторного запуска я сначала стартовал сам скрин<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>screen -S reader<\/code><\/pre><\/pre>\n<p><\/font>нажимал <kbd>Enter<\/kbd> и уже в нём запускал демона:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>php &lt;путь к скрипту демона&gt;\/update_daemon2.php<\/code><\/pre><\/pre>\n<p><\/font>Теперь, если я вижу, что сессия скрина пропала, то стартую её заново и в ней автоматом запускаю демона:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>screen -dmS reader sh &amp;&amp; screen -S reader -X stuff &quot;php &lt;путь к скрипту демона&gt;\/update_daemon2.php^M&quot;<\/code><\/pre><\/pre>\n<p><\/font>Осталось написать демона, который будет контролировать работу запущенного демона. <img style=\"vertical-align:middle!important;\" src=\"\/blog\/pictures\/smile.jpg\" \/><\/p>\n<p>Но об этом позже...<\/p>\n",
            "date_published": "2018-07-18T17:07:47+03:00",
            "date_modified": "2018-07-18T20:00:42+03:00",
            "_date_published_rfc2822": "Wed, 18 Jul 2018 17:07:47 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "429",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "417",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/script-for-getting-devices-in-home-network\/",
            "title": "Получение списка устройств в сети",
            "content_html": "<p><img src=\"\/blog\/pictures\/home-net.jpg\" class=\"main_right_img\" \/>Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.<\/p>\n<p>Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл\/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_13_07_18-3\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_13_07_18-3\"><\/p>\n<p><\/p>\n<p><font size=\"3\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>&lt;?php\r\n\/\/ задаю необходимые переменные\r\n$home_iface='eth0'; \/\/ интерфейс, посредством которого система включена в домашнюю сеть\r\n$lan='192.168.120.0\/24'; \/\/ определитель домашней сети (или её гостевого сегмента)\r\n$temp_file='\/tmp\/dev.tmp'; \/\/ путь к временному файлу\r\n\/\/ функция анализа и вывода MAC'а на странице\r\nfunction DrawDevice() { ... }\r\n\/\/ получаю MAC интерфейса $home_iface\r\n$home_mac=exec(&quot;sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'&quot;);\r\n\/\/ отображаю его на странице\r\nDrawDevice(trim($home_mac));\r\n\/\/ удаляю временный файл, если он есть\r\nif(file_exists($temp_file))exec(&quot;rm -f {$temp_file}&quot;);\r\n\/\/ сканирую сетевой диапазон $lan\r\nexec(&quot;fping {$lan} -age -r 1 &gt;\/dev\/null 2&gt;\/dev\/null&quot;);\r\n\/\/ вычленяю устройства с ответившими MAC'амм\r\n\/\/ и записываю во временный файл,\r\n\/\/ можно писать в базу данных для получения динамики\r\nexec(&quot;ip n | grep 'lladdr' | awk '{print $5}' &gt; {$temp_file}&quot;,$h);\r\n\/\/ получаю список ответивших MAC'ов из временного файла\r\n$h=file_get_contents($temp_file);\r\n\/\/ и удаляю его\r\nif(file_exists($temp_file))exec(&quot;rm -f {$temp_file}&quot;);\r\n$mac=array();\r\n\/\/ убираю из списка символы новой строки\r\n$mac=explode(&quot;\\n&quot;,$h);\r\n\/\/ в цикле вывожу MAC'и\r\nforeach($mac as$host){DrawDevice($host);}\r\n?&gt;<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p><font size=\"2\"><\/p>\n<ul><u>Требования:<\/u>\r\n<li>1. в системе должен быть установлен пакет <b>fping<\/b> (или любой другой с аналогичной функциональностью, например <b>nmap<\/b>);<\/li>\r\n<li>2. пользователь, от которого запущен WEB-сервер, обычно <b>www-data<\/b>, можно проверить командой<pre class=\"e2-text-code\"><code>ps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1<\/code><\/pre>должен иметь возможность выполнения команды <b>ifconfig<\/b> от имени суперпользователя (<b>sudo ifconfig<\/b>) или запускать эту утилиту непостредственно по пути её расположения, обычно <b>\/sbin\/ifconfig<\/b>, можно проверить командой <pre class=\"e2-text-code\"><code>whereis ifconfig<\/code><\/pre><\/li><\/ul>\n<p>Статья написана для <a href=\"https:\/\/ab-log.ru\/smart-house\/wireless\/unifi-presence-sensor\">Блога «Умного дома»<\/a>.<\/font><\/section><\/p>\n",
            "date_published": "2018-07-14T12:09:28+03:00",
            "date_modified": "2018-07-15T09:40:16+03:00",
            "_date_published_rfc2822": "Sat, 14 Jul 2018 12:09:28 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "417",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "306",
            "url": "https:\/\/gladilov.org.ru\/blog\/",
            "title": "Запуск обновлятора фидов TTRSS в режиме демона",
            "content_html": "<p><a href=\"https:\/\/www.bram.us\/2013\/11\/11\/run-a-php-script-as-a-servicedaemon-using-start-stop-daemon\/\">https:\/\/www.bram.us\/2013\/11\/11\/run-a-php-script-as-a-servicedaemon-using-start-stop-daemon\/<\/a><br \/>\n<a href=\"https:\/\/github.com\/biapy\/howto.biapy.com\/blob\/master\/web-applications\/tiny-tiny-rss\/tt-rss.init-d\">https:\/\/github.com\/biapy\/howto.biapy.com\/blob\/master\/web-applications\/tiny-tiny-rss\/tt-rss.init-d<\/a><br \/>\n<a href=\"https:\/\/gist.github.com\/seraphyn\/c7bb8c88a164bf1210fa\">https:\/\/gist.github.com\/seraphyn\/c7bb8c88a164bf1210fa<\/a><\/p>\n",
            "date_published": "2018-03-28T09:40:19+03:00",
            "date_modified": "2018-03-28T09:44:31+03:00",
            "_date_published_rfc2822": "Wed, 28 Mar 2018 09:40:19 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "306",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "239",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/stealths-of-bash\/",
            "title": "Хитрости BASH и тонкости его настройки",
            "content_html": "<script>function play(){var audio=document.getElementById(\"audio\");audio.play();}<\/script>\n<style>.thin{margin:0px;padding:0px;}\r\nkbd{border:1px solid gray;font-size:0.8em;box-shadow:1px 0 1px 0 #eee, 0 2px 0 2px #ccc, 0 2px 0 3px #444;\r\n-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;margin:2px 3px;padding:1px 5px;}<\/style>\n<p><img src=\"\/blog\/pictures\/stealths-of-bash.jpg\" style=\"float:left;margin-right:10px;\" \/><b>BASH<\/b> (bourne again shell) — командная среда, используемая по умолчанию во многих современных Linux-дистрибутивах. Если используется ОС из семейства Linux, то, скорее всего, используется и bash. Ниже приведены команды, опции настройки и разные трюки, придающие пользователю терминала более комфортную среду для работы (в BASH).<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_01_03_18\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_01_03_18\"><\/p>\n<p><\/p>\n<table width=\"100%\"><tbody><tr><td style=\"border-top:2px solid #333;\"><h2>Настройка автодополнения и поиска в <b>~\/.inputrc<\/b><\/h2>\n<\/td><\/tr><\/tbody><\/table><p>Для одинарного нажатия <kbd>Tab<\/kbd> при автодополнении в <b>~\/.inputrc<\/b> (или в <b>\/etc\/inputrc<\/b> для всех пользователей)<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>set show-all-if-ambiguous On<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Вывод по клавишам <kbd>&uarr;<\/kbd> и <kbd>&darr;<\/kbd> из истории только тех команд, которые начинаются с уже набранных букв<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>&quot;\\e[A&quot;: history-search-backward\r\n&quot;\\e[B&quot;: history-search-forward<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<table width=\"100%\"><tbody><tr><td style=\"border-top:2px solid #333;\"><h2>Тонкости настройки <b>~\/.bashrc<\/b><\/h2>\n<\/td><\/tr><\/tbody><\/table><p>Для записи истории команд сразу, а не только при выходе из шела, необходимо добавить<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>shopt -s histappend\r\nexport PROMPT_COMMAND=&quot;history -a&quot;<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Для запрета записи дубликатов команд в историю<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>export HISTCONTROL=&quot;ignoredups&quot;<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Можно запретить логирование определённых команд<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>export HISTIGNORE=&quot;ls:[bf]g:exit&quot;<\/code><\/pre><\/pre>\n<p><\/font>Список исключений — через двоеточие, можно использовать шаблоны.<\/p>\n<hr \/>\n<p>Эвристическое исправление ошибок а именах директорий<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>shopt -s cdspell<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Звуковой сигнал при запуске оболочки<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>export PROMPT_COMMAND=&quot;echo -ne '\\a'&quot;<\/code><\/pre><\/pre>\n<p><\/font>можно использовать по разнному, например — включить мигание окна KiTTY.<\/p>\n<hr \/>\n<p>Для того, чтобы не разрывать многострочные команды, используется<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>shopt -s cmdhist<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Если вписать<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>export HISTTIMEFORMAT='%d %h %Y %H:%M:%S '<\/code><\/pre><\/pre>\n<p><\/font>то в истории будут записаны дата и время выполнения команды.<\/p>\n<hr \/>\n<p>Использование регистронезависимых масок файлов<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>shopt -s nocaseglob<\/code><\/pre><\/pre>\n<p><\/font>Тогда, к примеру<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>ls *.jpg<\/code><\/pre><\/pre>\n<p><\/font>выведет не только *.jpg, но и *.JPG.<\/p>\n<table width=\"100%\"><tbody><tr><td style=\"border-top:2px solid #333;\"><h2>Хитрости BASH<\/h2>\n<\/td><\/tr><\/tbody><\/table><p>Возврат в предыдущую директорию<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>cd -<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>При нажатии <kbd>ESC<\/kbd> и сразу за этим <kbd>.<\/kbd> (в терминологии *nix — <kbd>Meta<\/kbd> <kbd>.<\/kbd>) в строку подставится последний использованный объект. Например, если первой строкой набрано<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>ls \/home\/smbdy\/logs<\/code><\/pre><\/pre>\n<p><\/font>во второй наберите<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>rm ESC .<\/code><\/pre><\/pre>\n<p><\/font>получите<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>rm \/home\/smbdy\/logs<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Реализация ввода пользовательского пароля с проверкой:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>echo -n &quot;Пользователь: &quot;\r\nread username\r\necho -n &quot;Пароль: &quot;\r\nread -s password\r\necho -en &quot;\\nПовторите пароль: &quot;\r\nread -s password2 &amp;&amp; echo -e &quot;\\n&quot;\r\nif [ &quot;$password&quot; != &quot;$password2&quot; ]; then\r\n    echo -e &quot;Пароли не совпадают.\\nЗавершение работы.&quot; &amp;&amp; exit 1\r\nfi\r\necho -n &quot;Всё верно, $username. Продолжаем.&quot; &amp;&amp; echo -e &quot;\\n&quot;<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Копирование config.cfg в config.cfg-old<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>cp config.cfg{,-old}<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Узнать, какой шел запущен<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>echo $0<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Строка вида ^<b>строка1<\/b>^<b>строка2<\/b> запустит предыдущую команду с заменой <b>строки1<\/b> на <b>строку2<\/b><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>$ ehco foo bar baz\r\nbash: ehco: command not found\r\n$ ^ehco^echo\r\nfoo bar baz<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<hr \/>\n<p>Переименование файла в такой-же, но с префиксом<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>mv long-file-name.txt prefix-!#^<\/code><\/pre><\/pre>\n<p><\/font>Например, команда<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>mv file-with-long-name-typed-with-tab-completion.txt old-!#^<\/code><\/pre><\/pre>\n<p><\/font>переименует ’<b>file-with-long-name-typed-with-tab-completion.txt<\/b>’ в файл с именем ’<b>old-file-with-long-name-typed-with-tab-completion.txt<\/b>’.<\/p>\n<hr \/>\n<p>Функция быстрого переименования расширений<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>renamer() {\r\n   local fn\r\n   for fn in *.&quot;$1&quot;; do\r\n     mv &quot;$fn&quot; &quot;${fn%.*}&quot;.&quot;$2&quot;\r\n   done\r\n}<\/code><\/pre><\/pre>\n<p><\/font>Пример: <b>renamer doc txt<\/b> — переименует все доки в txt’шники в текущем каталоге.<\/p>\n<hr \/>\n<p>Если определить функцию <b>command_not_found_handle ()<\/b>, то можно обрабатывать ситуацию «команда не найдена». До выдачи сообщения о не обнаруженной команде bash поместит в $1 введенную строку и выполнит код этой функции. При этом, если функция возвращает код завершения 127, то сообщение о ненайденной команде будет выведено на экран.<\/p>\n<hr \/>\n<p>Для добавления алиаса с автоприменением определяем новый алиас в <b>~\/.bash_aliases<\/b><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>alias editalias=’edit ~\/.bash_aliases &amp;&amp; source ~\/.bash_aliases’<\/code><\/pre><\/pre>\n<p><\/font><br \/>\nИмейте в виду, что для работы алиасов из этого файла он должен быть явно включён в вашем <b>~\/.bashrc<\/b>:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>[ -f ~\/.bash_aliases ] &amp;&amp; source ~\/.bash_aliases<\/code><\/pre><\/pre>\n<p><\/font><center><audio id=\"audio\" src=\"\/blog\/pictures\/header\/thatsallfolks.mp3\" ><\/audio><\/p>\n<table width=\"100%\" border=0 style=\"thin\"><tbody><tr style=\"thin\"><td align=\"center\" style=\"thin\"><p><hr width=\"100%\"><\/p>\n<\/td><td width=\"90\" height=\"48\" style=\"thin\"><p><img src=\"\/blog\/pictures\/header\/thatsallfolks.png\" title=\"Парам-парам-пам!\" onclick=\"play()\"><\/p>\n<\/td><td align=\"center\" style=\"thin\"><p><hr width=\"100%\"><\/p>\n<\/td><\/tr><\/tbody><\/table><p><\/center><br \/>\n<\/section><\/p>\n",
            "date_published": "2018-03-01T11:00:07+03:00",
            "date_modified": "2018-03-01T12:15:10+03:00",
            "_date_published_rfc2822": "Thu, 01 Mar 2018 11:00:07 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "239",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "237",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/record-and-replay-terminal-commands\/",
            "title": "Запись и воспроизведение команд в консоли",
            "content_html": "<style>\r\nkbd {\r\nborder:1px solid gray;\r\nfont-size:0.8em;\r\nbox-shadow:1px 0 1px 0 #eee, 0 2px 0 2px #ccc, 0 2px 0 3px #444;\r\n-webkit-border-radius:3px;\r\n-moz-border-radius:3px;\r\nborder-radius:3px;\r\nmargin:2px 3px;\r\npadding:1px 5px;\r\n}\r\n<\/style>\n<p><img src=\"\/blog\/pictures\/terminalrecord.png\" class=\"main_left_img\" \/>Иногда требуется записать все, что вы вводите в терминале, для того чтобы самому запомнить, что и как делали или передать кому-то другому для анализа или обучения, или просто записать терминальную сессию вместо записи видео с захватом экрана. Все привыкли пользоватся скриншотами и записью видео с экрана. Есть даже мануалы, как делать скрины в голой консоли.<\/p>\n<p>Однако существует интересный способ, как делать «видеозапись команд» в консоли без лишних телодвижений (я не говорю обо всяких доставляемых ttyrec, termrec & ipbt). Выполните в терминале, к примеру, следующие команды:<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_27_02_18\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_27_02_18\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>script -t 2&gt; timing -a ttyoutput\r\npwd\r\ncd \/\r\npwd\r\ncd -\r\npwd\r\nexit<\/code><\/pre><\/pre>\n<p><\/font>После команды <b>exit<\/b> запись с терминала прервётся и с помощью команды<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>scriptreplay timing ttyoutput<\/code><\/pre><\/pre>\n<p><\/font>можно воспроизвести записанные действия и ответы системы. Для выхода можно использовать комбинацию клавиш <kbd>Ctrl<\/kbd> + <kbd>D<\/kbd> в обычном шеле или набрать <b>exit<\/b> или <b>logout<\/b> в csh (если переменная <b>ignoreeof<\/b> не задана — то <kbd>Ctrl<\/kbd> + <kbd>D<\/kbd> тоже сработает).<\/p>\n<p>Для вывода списка вводимых команд без проигрывания всех действий с установленными временными интервалами достаточно ввести команду<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>awk '\/@\/' ttyoutput<\/code><\/pre><\/pre>\n<p><\/font>А чтобы получить полный список вводимых команд и ответы интерпретатора:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>awk '\/.\/' ttyoutput<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p>Можно даже интерактивно передавать вводмые команды, например — с помощью ключа<\/p>\n<pre class=\"e2-text-code\">&#x2012;f (&#x2012;&#x2012;flush)<\/pre>\n<p>один пользователь вводит команды в терминал<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>mkfifo ttyoutput2; script -f ttyoutput2<\/code><\/pre><\/pre>\n<p><\/font>другой — наблюдает за операциями в реальном времени с помощью<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>cat ttyoutput2<\/code><\/pre><\/pre>\n<p><\/font>Сетевой обмен между удалёнными машинами можно организовать с помощью утилиты <b>netcat<\/b>.<\/p>\n<p>P. S. Команды script и scriptreplay входят в пакет util-linux, поставляемый вместе с операционной системой (по крайней мере в Linux, хотя впервые утилита script появилась в системе 3.0BSD), поэтому они доступны сразу после установки системы.<\/p>\n<p>P. P. S. Альтернативы — уже упоминавшиеся <b><a href=\"https:\/\/github.com\/kilobyte\/termrec\">termrec<\/a><\/b>, <b><a href=\"https:\/\/www.chiark.greenend.org.uk\/~sgtatham\/ipbt\/\">ipbt<\/a><\/b>, <b><a href=\"http:\/\/0xcc.net\/ttyrec\/\">ttyrec\/ttyplay<\/a><\/b> — имеет сходный функционал, есть утилита <b><a href=\"https:\/\/www.npmjs.com\/package\/ttycast\">ttycast<\/a><\/b>, осуществляющая широковещательную передачу команд терминального сеанса в реальном времени.<br \/>\nТакже существуют такие утилиты:<br \/>\n<b><a href=\"https:\/\/github.com\/theonewolf\/TermRecord\">TermRecord@github<\/a><\/b> — пишет в html и воспроизводит в браузере.<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>pip install TermRecord\r\nTermRecord -o \/path\/to\/output_html<\/code><\/pre><\/pre>\n<p><\/font><br \/>\n<b><a href=\"https:\/\/asciinema.org\/\">asciinema.org<\/a><\/b> — свбодная утилита с открытым исходным кодом для записи сеансовых команд и выкладывания их в сеть.<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>curl -sL https:\/\/asciinema.org\/install | sh\r\nasciinema rec<\/code><\/pre><\/pre>\n<p><\/font><br \/>\n<b><a href=\"http:\/\/showterm.io\/\">showterm.io<\/a><\/b> — похож на asciinema, но оперирует только с текстом.<br \/>\n<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>gem install showterm\r\nshowterm\r\n# or if you have not installed showterm, you can run the standalone\r\nbash &lt;(curl record.showterm.io)<\/code><\/pre><\/pre>\n<p><\/font><br \/>\n<b><a href=\"https:\/\/github.com\/dtannen\/monitor\">monitor<\/a><\/b> — утилита, перехватывающая ввод\/вывод терминала и отправляющая на сайт commands.com.<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>curl commands.io\/install-monitor-(ubuntu|macosx|redhat)\r\nmonitor -u myusername<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n",
            "date_published": "2018-02-27T00:27:06+03:00",
            "date_modified": "2018-03-14T12:46:06+03:00",
            "_date_published_rfc2822": "Tue, 27 Feb 2018 00:27:06 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "237",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "216",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/getting-networks-with-node-ip\/",
            "title": "Получение (списка) сетей, в которых есть IP узла",
            "content_html": "<link href='\/notebook\/notebook.css' rel='stylesheet' type='text\/css'>\r\n<br \/>\r\n<table>\r\n<tbody>\r\n<tr>\r\n<td>\r\n<table class='notebook' width=\"230\" height=\"198\">\r\n<tbody>\r\n<tr>\r\n<td class='notebook lu'><\/td>\r\n<td class='notebook cu'><\/td>\r\n<td class='notebook ru'><\/td>\r\n<\/tr>\r\n<tr>\r\n<td class='notebook lc'><\/td>\r\n<td class='notebook cc_site_blocked'><\/td>\r\n<td class='notebook rc'><\/td>\r\n<\/tr>\r\n<tr>\r\n<td class='notebook ld'><\/td>\r\n<td class='notebook cd'><\/td>\r\n<td class='notebook rd'><\/td>\r\n<\/tr>\r\n<tr>\r\n<td colspan=\"3\" class='notebook d' width=\"230\" height=\"67\">\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/td>\r\n<td>\r\n<font size=\"2\">Навеяно при изучении фаерволов...<\/font><br \/><br \/>Сайты в сети Интернет не всегда хостятся на одном узле, тем более если это система разветвлённых общемировых порталов типа поисковика Google, магазина Amazon или система доставки видеоконтента Netflix. Поэтому для определённого сайта не всегда достаточно знать его доменное имя. Например, для создания правила переадресации в iptables, ipfw и прочих фаерволах нужно указать IP-адрес(а) узла назначения. Для этого я придумал такую функцию-однострочник (для удобства чтения поделена на две строки):\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<p><b class=\"spoiler-controller pop-up_camper_08_02_18\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_08_02_18\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>gethostnets() { host -t a $1 | awk 'NF&gt;1{print $NF}' | while read -r line; do echo $(whois -a $line | grep inetnum | tr -d ' ' \\\r\n| cut -f2 -d':' | awk '{system(&quot;ipcalc -rn &quot;$1&quot; | grep -v deaggregate | sort -t\/ -n -k2 | tail -n 1&quot;)}'); done }<\/code><\/pre><\/pre>\n<p><\/font>Допустим, нужно поменять маршрут к узлу <b>mail.ru<\/b>. В командной строке пишем <b>gethostnets mail.ru<\/b> и функция вернёт список сетей, в которых есть IP-адрес мэилрушного сайта:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>$ gethostnets mail.ru\r\n94.100.176.0\/21\r\n217.69.140.0\/23\r\n217.69.140.0\/23\r\n94.100.176.0\/21\r\n$<\/code><\/pre><\/pre>\n<p><\/font>Для работы необходим установленный пакет <b>ipcalc<\/b>. Не знаю, насколько этот однострочник будет полезен, но его реализация дала мне пищу для ума, писал и отлаживал я его несколько дней. <img alt=\"\" src=\"\/blog\/pictures\/smile.jpg\" style=\"vertical-align:middle;\"><\/p>\n<p>Не уверен, нужно ли делать пошаговый разбор скрипта, если кому-то нужно понять логику его работы — напишите комментарий или письмом в мою почту. Сделаю заметку-дополнение к статье.<\/p>\n<p>P. S. Понял, что правильнее и аккуратнее будет искать и анализировать автономные системы, связанные с IP целевого узла. Так и провайдера можно узнать точнее. Но это тема для другой заметки...<\/section><\/p>\n",
            "date_published": "2018-02-08T16:12:24+03:00",
            "date_modified": "2018-03-14T12:57:21+03:00",
            "_date_published_rfc2822": "Thu, 08 Feb 2018 16:12:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "216",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "170",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/send-mail-when-sessions-on-port-greater-than-treshold\/",
            "title": "Отправка сообщения на почту, когда количестве запросов на порт превысит предел",
            "content_html": "<p>Пишем скрипт, содержащий код:<\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>#!\/usr\/bin\/env bash\r\nMAILTO=somebody@example.com\r\nWATCHPORT=80\r\nTRESHOLD=500\r\nNUMCONN=`netstat -antpu4 | grep :$WATCHPORT | wc -l`\r\nif [[ $NUMCONN -ge $TRESHOLD ]]; then\r\nDATE=`date`\r\nMAILBODY=&quot;Datestamp: $DATE\\nServer port $WATCHPORT usage overload!\\nCurrent port $WATCHPORT connections: $NUMCONN.&quot;\r\necho -e $MAILBODY | mail -s &quot;Server port $WATCHPORT usage overload!&quot; $MAILTO\r\nfi<\/code><\/pre><\/pre>\n<p>Скрипт циклически запускаем с помощью cron’а, например — каждую минуту:<\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>* * * * * \/path\/to\/script.sh<\/code><\/pre><\/pre>\n",
            "date_published": "2018-01-03T17:08:04+03:00",
            "date_modified": "2018-02-08T20:16:23+03:00",
            "_date_published_rfc2822": "Wed, 03 Jan 2018 17:08:04 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "170",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3249,
    "_e2_ua_string": "E2 (v3249; Aegea)"
}