gladilov.org.ru gladilov.org.ua

34 заметки с тегом

маленькие хитрости

Хаки и трюки, подсмотренные на просторах Интернета или «выстраданные» мною самим.



Напильник для Tiny Tiny RSS

 Как я недавно писал тут, после переезда на VDS’ку на сервере из-за недостатка памяти стала отваливаться сессия screen’а, в которой крутится демон опроса и наполнения БД новостей Tiny Tiny RSS. Для контроля того, что screen-сессия и процесс демона опроса и агрегирования новостей запущены, я написал скриптик на похапе, который опрашивает состояние этих процессов и отображает на WEB-странице. Показать

Возможны 22 вариантов:

  1. Скрин запущен, демон запущен: Показать
  1. Скрин запущен, демон выпал: Показать
  1. Скрин отвалился, демон вместе с ним: Показать
  1. Четвёртый вариант я не привожу, так как демона не в скрине я никогда не запускаю.

Однако мне достаточно быстро надоело открывать новую вкладку со страницей статистики каждый раз, когда у меня возникало подозрение о том, что скрин/демон отвалился. Поэтому я интегрировал индикаторы работы прямо на страницу Tiny Tiny RSS.

Ищу две картинки индикаторов  ON и  OFF, создаю файл скрипта опроса (допустим, readerstates.php) в том каталоге, где развёрнут TT RSS, с таким содержимым:

<?php $screen=exec("ps aux | grep -e 'SCREEN -dmS reade[r]'");
$daemon=exec("ps aux | grep -e 'php <путь к скрипту демона>/update_daemon2.ph[p]'");
$scrn_t=$dmn_t='не запущен';
$scrn=$dmn='off';if($screen){$scrn='on';$scrn_t='запущен';}
if($daemon){$dmn='on';$dmn_t='запущен';}?>
<img src='/... путь к картинке .../<?php echo$dmn;?>.png' title='Демон <?php echo$dmn_t;?>' />
<img src='/... путь к картинке .../<?php echo$scrn;?>.png' title='SCREEN <?php echo$scrn_t;?>' />

Затем прописываю require в файле index.php:

<?php
    foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_TOOLBAR_BUTTON) as $p) {
        echo $p->hook_toolbar_button();
    }
    require_once "readerstates.php";
?>

После этого все вышеописанные ситуации выглядят у меня на странице так:

  1. Скрин запущен, демон работает: Показать
  1. Скрин запущен, демон нет: Показать
  1. Скрин отвалился, демон тоже: Показать
28 июля   HTML   досуг   маленькие хитрости   мну   сисадминство   скрипт   софт

Автозапуск команды в screen’е

После переезда моего  сайта на VDS’ку шум раздолбанного вентилятора Asus EEE PC 710 перестал меня беспокоить, но теперь периодически вываливается screen-сессия, в которой крутится демон опроса и наполнения БД новостей TTRSS (чаще всего демон отваливался с ошибкой 12 «недостаточно памяти», но иногда и сам процесс скрина отъезжал).

Показать

Для повторного запуска я сначала стартовал сам скрин

screen -S reader

нажимал Enter и уже в нём запускал демона:

php <путь к скрипту демона>/update_daemon2.php

Теперь, если я вижу, что сессия скрина пропала, то стартую её заново и в ней автоматом запускаю демона:

screen -dmS reader sh && screen -S reader -X stuff "php <путь к скрипту демона>/update_daemon2.php^M"

Осталось написать демона, который будет контролировать работу запущенного демона.

Но об этом позже...

18 июля   BASH   досуг   маленькие хитрости   ОС   сисадминство   скрипт   софт

Получение списка устройств в сети

Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.

Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.

Показать

<?php
// задаю необходимые переменные
$home_iface='eth0'; // интерфейс, посредством которого система включена в домашнюю сеть
$lan='192.168.120.0/24'; // определитель домашней сети (или её гостевого сегмента)
$temp_file='/tmp/dev.tmp'; // путь к временному файлу
// функция анализа и вывода MAC'а на странице
function DrawDevice() { ... }
// получаю MAC интерфейса $home_iface
$home_mac=exec("sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'");
// отображаю его на странице
DrawDevice(trim($home_mac));
// удаляю временный файл, если он есть
if(file_exists($temp_file))exec("rm -f {$temp_file}");
// сканирую сетевой диапазон $lan
exec("fping {$lan} -age -r 1 >/dev/null 2>/dev/null");
// вычленяю устройства с ответившими MAC'амм
// и записываю во временный файл,
// можно писать в базу данных для получения динамики
exec("ip n | grep 'lladdr' | awk '{print $5}' > {$temp_file}",$h);
// получаю список ответивших MAC'ов из временного файла
$h=file_get_contents($temp_file);
// и удаляю его
if(file_exists($temp_file))exec("rm -f {$temp_file}");
$mac=array();
// убираю из списка символы новой строки
$mac=explode("\n",$h);
// в цикле вывожу MAC'и
foreach($mac as$host){DrawDevice($host);}
?>

    Требования:
  • 1. в системе должен быть установлен пакет fping (или любой другой с аналогичной функциональностью, например nmap);
  • 2. пользователь, от которого запущен WEB-сервер, обычно www-data, можно проверить командой
    ps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1
    должен иметь возможность выполнения команды ifconfig от имени суперпользователя (sudo ifconfig) или запускать эту утилиту непостредственно по пути её расположения, обычно /sbin/ifconfig, можно проверить командой 
    whereis ifconfig

Статья написана для Блога «Умного дома».

14 июля   BASH   досуг   маленькие хитрости   ОС   сеть   сисадминство   скрипт   софт

Хитрости BASH и тонкости его настройки

BASH (bourne again shell) — командная среда, используемая по умолчанию во многих современных Linux-дистрибутивах. Если используется ОС из семейства Linux, то, скорее всего, используется и bash. Ниже приведены команды, опции настройки и разные трюки, придающие пользователю терминала более комфортную среду для работы (в BASH).

Показать

Настройка автодополнения и поиска в ~/.inputrc

Для одинарного нажатия Tab при автодополнении в ~/.inputrc (или в /etc/inputrc для всех пользователей)

set show-all-if-ambiguous On


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

"\e[A": history-search-backward
"\e[B": history-search-forward

Тонкости настройки ~/.bashrc

Для записи истории команд сразу, а не только при выходе из шела, необходимо добавить

shopt -s histappend
export PROMPT_COMMAND="history -a"


Для запрета записи дубликатов команд в историю

export HISTCONTROL="ignoredups"


Можно запретить логирование определённых команд

export HISTIGNORE="ls:[bf]g:exit"

Список исключений — через двоеточие, можно использовать шаблоны.


Эвристическое исправление ошибок а именах директорий

shopt -s cdspell


Звуковой сигнал при запуске оболочки

export PROMPT_COMMAND="echo -ne '\a'"

можно использовать по разнному, например — включить мигание окна KiTTY.


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

shopt -s cmdhist


Если вписать

export HISTTIMEFORMAT='%d %h %Y %H:%M:%S '

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


Использование регистронезависимых масок файлов

shopt -s nocaseglob

Тогда, к примеру

ls *.jpg

выведет не только *.jpg, но и *.JPG.

Хитрости BASH

Возврат в предыдущую директорию

cd -


При нажатии ESC и сразу за этим . (в терминологии *nix — Meta .) в строку подставится последний использованный объект. Например, если первой строкой набрано

ls /home/smbdy/logs

во второй наберите

rm ESC .

получите

rm /home/smbdy/logs


Реализация ввода пользовательского пароля с проверкой:

echo -n "Пользователь: "
read username
echo -n "Пароль: "
read -s password
echo -en "\nПовторите пароль: "
read -s password2 && echo -e "\n"
if [ "$password" != "$password2" ]; then
    echo -e "Пароли не совпадают.\nЗавершение работы." && exit 1
fi
echo -n "Всё верно, $username. Продолжаем." && echo -e "\n"


Копирование config.cfg в config.cfg-old

cp config.cfg{,-old}


Узнать, какой шел запущен

echo $0


Строка вида ^строка1^строка2 запустит предыдущую команду с заменой строки1 на строку2

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz


Переименование файла в такой-же, но с префиксом

mv long-file-name.txt prefix-!#^

Например, команда

mv file-with-long-name-typed-with-tab-completion.txt old-!#^

переименует ’file-with-long-name-typed-with-tab-completion.txt’ в файл с именем ’old-file-with-long-name-typed-with-tab-completion.txt’.


Функция быстрого переименования расширений

renamer() {
   local fn
   for fn in *."$1"; do
     mv "$fn" "${fn%.*}"."$2"
   done
}

Пример: renamer doc txt — переименует все доки в txt’шники в текущем каталоге.


Если определить функцию command_not_found_handle (), то можно обрабатывать ситуацию «команда не найдена». До выдачи сообщения о не обнаруженной команде bash поместит в $1 введенную строку и выполнит код этой функции. При этом, если функция возвращает код завершения 127, то сообщение о ненайденной команде будет выведено на экран.


Для добавления алиаса с автоприменением определяем новый алиас в ~/.bash_aliases

alias editalias=’edit ~/.bash_aliases && source ~/.bash_aliases’


Имейте в виду, что для работы алиасов из этого файла он должен быть явно включён в вашем ~/.bashrc:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases




2018   BASH   интересное   маленькие хитрости   ОС   сисадминство   скрипт   софт

Запись и воспроизведение команд в консоли

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

Однако существует интересный способ, как делать «видеозапись команд» в консоли без лишних телодвижений (я не говорю обо всяких доставляемых ttyrec, termrec & ipbt). Выполните в терминале, к примеру, следующие команды:

Показать

script -t 2> timing -a ttyoutput
pwd
cd /
pwd
cd -
pwd
exit

После команды exit запись с терминала прервётся и с помощью команды

scriptreplay timing ttyoutput

можно воспроизвести записанные действия и ответы системы. Для выхода можно использовать комбинацию клавиш Ctrl + D в обычном шеле или набрать exit или logout в csh (если переменная ignoreeof не задана — то Ctrl + D тоже сработает).

Для вывода списка вводимых команд без проигрывания всех действий с установленными временными интервалами достаточно ввести команду

awk '/@/' ttyoutput

А чтобы получить полный список вводимых команд и ответы интерпретатора:

awk '/./' ttyoutput

Можно даже интерактивно передавать вводмые команды, например — с помощью ключа

‒f (‒‒flush)

один пользователь вводит команды в терминал

mkfifo ttyoutput2; script -f ttyoutput2

другой — наблюдает за операциями в реальном времени с помощью

cat ttyoutput2

Сетевой обмен между удалёнными машинами можно организовать с помощью утилиты netcat.

P. S. Команды script и scriptreplay входят в пакет util-linux, поставляемый вместе с операционной системой (по крайней мере в Linux, хотя впервые утилита script появилась в системе 3.0BSD), поэтому они доступны сразу после установки системы.

P. P. S. Альтернативы — уже упоминавшиеся termrec, ipbt, ttyrec/ttyplay — имеет сходный функционал, есть утилита ttycast, осуществляющая широковещательную передачу команд терминального сеанса в реальном времени.
Также существуют такие утилиты:
TermRecord@github — пишет в html и воспроизводит в браузере.

pip install TermRecord
TermRecord -o /path/to/output_html


asciinema.org — свбодная утилита с открытым исходным кодом для записи сеансовых команд и выкладывания их в сеть.

curl -sL https://asciinema.org/install | sh
asciinema rec


showterm.io — похож на asciinema, но оперирует только с текстом.

gem install showterm
showterm
# or if you have not installed showterm, you can run the standalone
bash <(curl record.showterm.io)


monitor — утилита, перехватывающая ввод/вывод терминала и отправляющая на сайт commands.com.

curl commands.io/install-monitor-(ubuntu|macosx|redhat)
monitor -u myusername

2018   маленькие хитрости   ОС   сисадминство   скрипт   софт

Напильник для Эгеи, часть 2

      Устроил для блога ревизию — все длинные статьи спрятал под спойлер, ведь ката в Эгее нет в принципе, разработчик объяснил причину этого в своей статье.

Реализацию спойлера подсмотрел у других, у себя реализовал следующим образом:

Показать

В файле /user/extras/header-pre.tmpl.php прописал следующие строки:

<script type="text/javascript" src="/blog/user/extras/spoiler-hider.js"></script>
<link rel="stylesheet" href="/blog/user/extras/spoiler-hider.css">


spoiler-hider.js:

// Спойлеры для Эгеи
$(function(){
    $('.spoiler-controller').click(function(){
        var aClasses = this.className.split(/\s+/);
        for (var i in aClasses) {
            if (aClasses[i] == 'spoiler-controller' || aClasses[i] == 'spoiler-shown') {
                aClasses.splice(i, 1);
            }
        }
        if ($(this).hasClass('spoiler-shown')) {
            this.innerHTML = this.innerHTML.replace('Скрыть', 'Показать');
            $(this).removeClass('spoiler-shown');
        } else {
            this.innerHTML = this.innerHTML.replace('Показать', 'Скрыть');
            $(this).addClass('spoiler-shown');
        }
        for (i in aClasses) {
            if (!aClasses[i]) continue;
            var jContainer = $('.'+aClasses[i]).not('.spoiler-controller');
            jContainer.slideToggle();
        }
    });
});

spoiler-hider.css

.spoiler-controller { border-bottom: 1px dashed black; cursor: pointer; }
.spoiler-controller:hover { color: #b30; border-color: #b30; }
.spoiler { display: none; }

Теперь в нужном месте страницы пишу код

<p><b class="spoiler-controller pop-up_camper_<уникальный идентификатор>">Показать</b></p>
<section class="spoiler pop-up_camper_<уникальный идентификатор>"><p></p>

а в конце текста (и спойлера)

</section>


Также изменил размер заголовка блога, указав в /themes/plain/styles/main.css

.title h1 {...; font-size: 24px ;...}


Изменил подсвечивание кода (по этой статье) с помощью highlight.js:

<link rel="stylesheet" href="//yandex.st/highlightjs/7.3/styles/github.min.css">
<script src="//yandex.st/highlightjs/7.3/styles/github.min.css"></script>
<script>
	hljs.tabReplace = '    ';
	hljs.initHighlightingOnLoad();
</script>

hljs.tabReplace нужен для того, чтобы табуляции в коде заменялись на пробелы. highlight.js сам определяет на каком языке написан код, но можно явно указывать язык, добавляя class к тегу pre.


2018   HTML   досуг   маленькие хитрости   сисадминство   софт

IP-адреса для использования в документации

Оказывается, есть специальный RFC5737, описывающий 3 блока IP-адресов, зарезервиорованных для примеров, использования в описаниях спецификаций и в документации. Эти блоки суть 192.0.2.0/24 (TEST-NET-1), 198.51.100.0/24 (TEST-NET-2), 203.0.113.0/24 (TEST-NET-3).

Так же указывается, что раньше для этого использовался блок 128.66.0.0/16, однако, в виду того, что он не упомянут в списке богонов в RFC3330 — его можно использовать как обычно, но с определённой осторожностью.

Права народная мудрость: Век живи — век учись (а дураком помрёшь) 

2018   интересное   интернет   маленькие хитрости   сеть   сисадминство

Получение (списка) сетей, в которых есть IP узла


Навеяно при изучении фаерволов...

Сайты в сети Интернет не всегда хостятся на одном узле, тем более если это система разветвлённых общемировых порталов типа поисковика Google, магазина Amazon или система доставки видеоконтента Netflix. Поэтому для определённого сайта не всегда достаточно знать его доменное имя. Например, для создания правила переадресации в iptables, ipfw и прочих фаерволах нужно указать IP-адрес(а) узла назначения. Для этого я придумал такую функцию-однострочник (для удобства чтения поделена на две строки):

Показать

gethostnets() { host -t a $1 | awk 'NF>1{print $NF}' | while read -r line; do echo $(whois -a $line | grep inetnum | tr -d ' ' \
| cut -f2 -d':' | awk '{system("ipcalc -rn "$1" | grep -v deaggregate | sort -t/ -n -k2 | tail -n 1")}'); done }

Допустим, нужно поменять маршрут к узлу mail.ru. В командной строке пишем gethostnets mail.ru и функция вернёт список сетей, в которых есть IP-адрес мэилрушного сайта:

$ gethostnets mail.ru
94.100.176.0/21
217.69.140.0/23
217.69.140.0/23
94.100.176.0/21
$

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

Не уверен, нужно ли делать пошаговый разбор скрипта, если кому-то нужно понять логику его работы — напишите комментарий или письмом в мою почту. Сделаю заметку-дополнение к статье.

P. S. Понял, что правильнее и аккуратнее будет искать и анализировать автономные системы, связанные с IP целевого узла. Так и провайдера можно узнать точнее. Но это тема для другой заметки...

2018   BASH   досуг   интернет   маленькие хитрости   сеть   сисадминство   скрипт   софт

SVG-код вместо картинки

Вместо того, чтобы франить на ФС мелкий файл с простой картинкой (типа индикатор онлайн/офлайн) можно просто в тег img передавать svg-код этой картинки. Например HTML-код

<img src="data:image/svg+xml,<?xml version="1.0"?><svg height="8px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="8" fill="red"></svg>" />
&nbsp;
<img src="data:image/svg+xml,<?xml version="1.0"?><svg height="8px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="8" fill="gold"></svg>" />
&nbsp;
<img src="data:image/svg+xml,<?xml version="1.0"?><svg height="8px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg"><circle cx="10" cy="10" r="8" fill="green"></svg>" />

выведет такие три точки:    (сделал форматирование по строкам для удобства и «читаемости», хе-хе). При размере кластера 4К это может быть существенно...

P. S. Наверное, этим все уже давно пользуются, но до меня только дошла выгода этого метода.

2018   HTML   интернет   маленькие хитрости   сеть

Установка и настройка Nginx + PHP в режиме FastCGI [Debian 9]

Начал новую линейку заметок по теме обучения на системного администратора. Учусь не я, а моя жена, хотя и я тоже многое оттуда воспринял (на самом деле нет ;-). Это не конспекты лекций, не пошаговые руководства, а просто заметки на память, чтобы ей легче было повторять пройденный материал. Помечаться будут тегом ’учёба’ и в начале страницы будет стоять маленький логотипчик . В квадратных скобках указывается ОС, в которой производились настройки/тесты/манипуляции.

Итак, первая заметка.

Показать


 Поставить  nginx и  PHP.

sudo apt-get install nginx php-fpm

В файле */etc/nginx/nginx.conf* убрать коментарий в строке

multi_accept on

и дописать index.php в определении индексных файлов

index index.php index.html index.htm index.nginx-debian.html;

В файле */etc/nginx/sites-available/default* изменить путь к индексному файлу

root /var/www/html/site1

и разрешить FPM, убрав коментарий

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

Также запретить доступ к файлам, имя которых начинается с префикса .ht

location ~ /\.ht {
deny all;
}

Создать индексный файл сайта

sudo mkdir -p /var/www/html/site1
sudo touch /var/www/html/site1/index.php
sudo echo "&lt;?php phpinfo(); ?&gt;" > /var/www/html/site1/index.php

В файле */etc/php/7.0/fpm/php.ini* исправить значения в строках

memory_limit = 256M
default_socket_timeout = 360

и раскомментировать строки

;user_agent="PHP"
;cgi.fix_pathinfo=1

Отключить уязвимость, поставив значение 0:

cgi.fix_pathinfo=0

Затем перегружаем nginx (любым способом)

systemctl reload nginx
nginx -s reload


Задача решена

2018   маленькие хитрости   ОС   сеть   сисадминство   софт   учёба
Ранее Ctrl + ↓
Наверх