gladilov.org.ru gladilov.org.ua

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

сеть

Позднее Ctrl + ↑

Монтирование директории с удалённого хоста по SSH*

(* точнее — по SFTP, надстройкой над протоколом SSH)

Требуется установленный пакет sshfs. В общем виде команда выглядит так:

sshfs user@remotehost:/path/to/directory /local/path -p port

Показать

Реализация:

sudo modprobe fuse
mkdir ~/music
sshfs insect@192.168.1.234:/home/insect/music ~/music

Размонтировать так:

sudo umount ~/music

или (для ранних версий) так:

sudo fusermount -u ~/music

Автоматический запуск screen при входе по SSH

Для работы скрипта требуются установленные в системе пакеты dialog и screen.

Показать

В конец ~/.bashrc дописать:

if [ "$SSH_TTY" ]; then
  if [ ! "$STY" ] ; then
    CHOICE=`~/SCREEN/choose`
    if [ "$CHOICE" ]; then exec screen -dr $CHOICE; fi
  fi
fi

При логине по ssh-протоколу откроется меню с выбором работы в существующих сессиях screen’а или возможностью остаться в консоли ssh-клиента. Если запущенных сессий screen’а нет — меню не откроется.

Содержимое файла ~/SCREEN/choose:

#!/usr/bin/env bash
i=0
declare -ax SCREENS
SOCKETS=`find /var/run/screen/S-$(whoami) -type p 2>/dev/null`
if [ -z "$SOCKETS" ]; then exit 0; fi
for S in $SOCKETS; do ((i=$i+1)); S=`basename $S`; SCREENS[$i]=`screen -ls | grep $S | perl -e '$s=<>; $s =~ s/^\\t(.*)\s/$1/; $s =~ s/\s/_/g; print $s'`; done
MENU=""
for ((j=1; j<=$i; j=$j+1)); do MENU="$MENU $j ${SCREENS[$j]}"; done
MENU="$MENU $j Отменить"
WHICH=`dialog --stdout --menu Select: 0 0 0 $MENU`
if [ "$WHICH" != "$j" ]; then echo ${SCREENS[$WHICH]} | sed -e 's/_(.*)$//'; fi

Заставляем работать старую версию Skype для Linux





Всё, о чем так долго говорили большевики, свершилось! Линукс под скайп всьо!!! Тьфу ты, то есть скайп под Линук всьо!.. Но есть довольно грязный хак: поменять строку с версией в самом бинарнике отжившего скайпа.

Показать

Если Скайп установлен из DEB-пакета для Debian:

echo -n 8 | dd of=/usr/bin/skype bs=1 seek=23370360 conv=notrunc

Хак любой весии:

sed -i 's/4\.3\.0\.37/8\.3\.0\.37/' /usr/bin/skype

В генте путь поменять на /opt/bin/skype, или более универсальный способ:

sed -i 's/4\.3\.0\.37/8\.3\.0\.37/' $(which skype)

Отседова

Простейший portknock’ер

Простейший portknock’ер, работающий по icmp.

Показать

iptables -A INPUT -p icmp --icmp-type 8 -m length --length 153 -m recent --name portknock --rsource --set -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 154 -m recent --name portknock --rsource --update --hitcount 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 155 -m recent --name portknock --rsource --update --hitcount 2 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --seconds 10 --name portknock --rsource --rcheck --hitcount 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP


Для открытия порта SSH необходимо пустить три определённых пинга на адрес целевой системы:

ping -s 125 -c 1 [адрес]
ping -s 126 -c 1 [адрес]
ping -s 127 -c 1 [адрес]


Пользователям системы Microsoft ® Шindoшs ™ придётся использовать такой синтаксис:

ping -l 125 -n 1 [адрес]
ping -l 126 -n 1 [адрес]
ping -l 127 -n 1 [адрес]

Скрипт подсчёта количества автономных систем

Количество ASN’ок, зареганных в мире, можно получить так:

wget -q http://www.cidr-report.org/as2.0/ -O - \
| sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1 \
| grep "Number of ASes in routing system" | cut -f1 -d"&"

Показать

Небольшой разбор.
Командой

wget -q http://www.cidr-report.org/as2.0/ -O -

получаем в консоль (ключ -O -) страницу с сайта www.cidr-report.org (нужная нам строка будет в тексте страницы представлена приблизительно таким текстом: <tr><td align=right><tt>59222&nbsp;&nbsp;</tt></td><td>Number of ASes in routing system</td></tr>), затем по конвейеру с помощью построчного редактора sed и простейшего регулярного выражения (см. постскриптум)

sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1

очищаем текст от HTML-тегов, потом командой

grep "Number of ASes in routing system"

печатаем только строку, содержащую текст «Number of ASes in routing system». Вывод получается приблизительно такой: 59222&nbsp;&nbsp;Number of ASes in routing system
Заключительной командой

cut -f1 -d"&"

из полученной строки печатаются только символы до первого знака «&».

Quod erat faciendum.


P. S. Регулярка

s/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g

заменяет (действие s, substitute) фрагменты, содержащие условие
(строка [\<][\/]?[a-zA-Z0-9\=\«\-\#\.\& ]+[\/]?[\>] между первым и вторым слешами)
на пустую строку (пустая строка определяется отсутствием символов между вторым и третьим слешами //) во всём тексте (флаг g, global — теперь условие сработает везде). Под условие подпадают все подстроки, ограниченные символами < или </ в начале и > или /> в конце и (обязательно) содержащиеся между ними буквы от a до z и от A до Z, цифры от 0 до 9, символы = (равно), " (двойную кавычку), (минус), # (октоторп), . (точку), & (амперсанд) или   (пробел) в любой последовательности. Строки, удовлетворяющие этому регэкспу:
<html>
<head>
<title>ASNs</title>

<link href="../common.css" type="text/css" rel="stylesheet" />
</head>
<body>
<table>
<tbody>
<tr>
<td align="left">Autonomous Sysmem Number</td>
<td align="center">
<img src="../image.png" />
</td>
</tr>
</tbody>
</table>
</body>
</html>
Из примера видно, что регулярка срабатывает на строках вида <тег>...</тег> и <тег ... />, а строки вида <тег .../... /> пропускает. Вообще говоря, этот regexp сработает и на такие строки: </ 1 />, < 2 />, </ 3 >, < 4 >. Если регулярное выражение заменить на

s/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\&\/ ]+[\/]?[\>]//g

(добавить \/ в квадратных скобках с плюсом), то срабатывать оно будет и на строки вида <тег .../... />,
т. е. строки определения стиля страницы и вывода изображения в таблице заменятся на пустые (удалятся).
P. P. S. Цветовое выделение добавлено для лучшей читаемости (и понимаемости) регулярного выражения.

Получение внешнего IP скриптом на BASH’е

Привожу BASH-скрипт получения своего внешнего IP
(использует сервис http://checkip.dyndns.org/dyndns.checkip.html).

wget -q http://checkip.dyndns.org/dyndns.checkip.html -O - | sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1 | cut -d':' -f2 | sed 's/^[ ]*//' -

Показать

Опишу работу скрипта.

С помощью кода

wget -q http://checkip.dyndns.org/dyndns.checkip.html -O -

скрипт получает строку вида

<html><head><title>Current IP Check</title></head><body<Current IP Address: 217.69.139.200</body></html>

на свой вывод, о чём указывает ключ "-O -". Полученный текст с помощью кода

sed -r 's/[\<][\/]?[a-zA-Z0-9\=\"\-\#\.\& ]+[\/]?[\>]//g' $1

очищается от HTML-тегов (значение свойства $1 изменяется при каждом успешном обнаружении заключенного в знаки / .. / шаблона. Шаблон описывает замену любого текста, обрамлённого знаками < (или </) ... > (или />) и содержащего (или нет ) символы a-z, A-Z, цифры от 0 до 9, знаки = (равно), " (двойная кавычка), (минус), # (диез), . (точка), & (амперсанд) и пробел в любом порядке, влючая неограниченное число повторов).

Затем из очищенного таким образом текста вида

Current IP CheckCurrent IP Address: 217.69.139.200

с помощью оператора

cut -d':' -f2

вычленяется вторая часть строки после деления её по символу : (двоеточие). Получаем

217.69.139.200

(с пробелом в начале строки). Его отсекаем командой

sed 's/^[ ]*//' -

убирающей пробел именно в начале строки. Результат

217.69.139.200

Развоплощение поддоменов

Постепенно развоплощаю кучу поддоменов (вида sun.gladilov.org.ru, checklist.gladilov.org.ru, weather.gladilov.org.ru, exchrate.gladilov.org.ru и тэ дэ и тэ пэ). Если ВНЕЗАПНО не нашёлся нужный поддомен типа

^(http|https)://XXX.gladilov.org.[ru|ua]/

то страница с нужной инфой вероятнее всего лежит по адресу

^(http|https)://gladilov.org.[ru|ua]/XXX/

А совершенно точно адрес новой страницы можно узнать на  главной странице сайта.

Показать

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

Настройка NUT в режиме master + slave

Приобретя ИБП Powercom BNT-1000AP Schuko, поставил себе задачу обеспечить гарантированное питание и корректное завершение работы на важных системах. Имелся в виду мой компьютер (естессно!) и роутер D-Link DIR-320/A2E с установленным там DebWRT (носит гордое имя hive, о нём я уже писал).

Показать

Так как ИБП я выбирал с буквой P в конце названия модели, то он имеет порт для связи с компьютером. В моём случае это был USB-порт (RS-232 и другую экзотику уже в них и не используют давно). В комплекте с ИБП прилагался кабель USB(A)male — USB(B)female. Но им я дотянулся только до компьютера.

На компе поставил пакет NUT (Network UPS Tools). Он состоит из сервера upsd, клиента upsmon и вспомогательных программ:

  • upsc — программа общения с сервером вручную
  • upsdrvctl — программа запуска драйвера ИБП вручную
  • upscmd — программа посылки команд в ИБП вручную
  • upssched — скрипт обработки событий от ИБП

Серверный процесс upsd поддерживает связь с ИБП и отвечает на запросы клиентов.
Клиентский процесс upsmon отвечает за своевременное обнаружение проблем с питанием и принятие необходимых решений.

Поскольку к одному ИБП может быть подключено несколько устройств, то клиентов тоже может быть много. Среди многих клиентов выделен один, запущенный на машине с подключённым ИБП, он называется master, остальные клиенты называются slave. Клиент master сообщает при необходимости slave-клиентам о том, что им надо отключиться и завершить работу машин, на которых они работают. Это обычно происходит перед выключением ИБП из-за пониженного заряда батареи.

В моём случае конфигурация свелась к ебле с созданием файла /dev/ttyUSB0 настройке линка через USB-кабель и редактированию конфигурационных файлов:

  • /etc/nut/nut.conf — указывает тип работы nut
MODE=standalone
UPSD_OPTIONS="-u root"
UPSMON_OPTIONS="-u root"
  • /etc/nut/ups.conf — конфигурация драйвера и способа подключения к ИБП
user=root
[bnt-1000]
driver=usbhid-ups
port=auto
productid=0004
desc="Powercom BNT-100AP Schuko"
  • /etc/nut/upsd.conf — конфигурация сервера
LISTEN 127.0.0.1 3493
LISTEN [адрес в моей домашней IP-сети] 3493

Можно просто указать

LISTEN 0.0.0.0 3493

для того, чтобы сервер слушал запросы на всех интерфейсах.

  • /etc/nut/upsd.user — описание клиентов и пользователей
[soul]
password=<пароль>
action=SET
instcmds=ALL
upsmon=master
[hive]
password=<пароль>
upsmon=slave
  • /etc/nut/upsmon.conf — конфигурация клиента, строка соединения с сервером
RUN_AS_USER root
MONITOR bnt-1000@localhost 1 soul <пароль> master

Также

chown -R nut. /var/run/nut/

На сервере hive настройка была более тривиальной и свелась к установке пакетов nut и nut-cgi и редактированию файла /etc/nut/upsmon.conf:

MONITOR bnt-1000@soul 1 soul <пароль> slave

После этого процесс upsmon на сервере hive смог общаться с процессом upsd на моей машине soul.

Итоговая схема выглядит так:

Стандартный вывод nut-cgi меня не очень устроил:

поэтому я нарисовал свой сайтик с бэкджеком и шлю визуализацией данных от ИБП:

Ссылки:
http://www.ignix.ru/book/freebsd/daemon/network_ups_tools
https://sites.google.com/site/plan0metr/home/nut
http://www.linux.kiev.ua/materials/How-to-use-UPS-with-nut.html

DIR-320. Обратное питание по USB

У меня дома есть маршрутизатор D-Link DIR-320/A2E с изменённой прошивкой (сначала я скомпилировал для него OpenWRT по мануалу от dipcore (архивная ссылка), затем мне понадобился на этом роутере php, т. к. я его ещё и как сервер использую, и теперь на нём живёт практически полноценный Debian с шахматами и поэтессами).

Показать

Выглядит это так:

Приведу необходимые пояснения (на схеме и по тексту):

К стенке  стола привинчены два маршрутизатора, D-Link DIR-615/B2G и D-Link DIR-320/A2E. DIR-615 со штатной прошивкой служит шлюзом в сеть провайдера и интернет. DIR-320 с дебианом на борту связан со шлюзом по беспроводной сети и работает домашним DNS-, NTP-, принт-, файл-сервером эт цетера. На этом-же устройстве настроен apache с несколькими сайтами. Для обеспечения загрузки ОС используется накопитель USB-флеш LG UB2GVMNPB объёмом 2 ГБ, включённый в активный 10-портовый USB-хаб CBR CH 310. Для питания роутера с дебианом использовался стандартный блок питания D-Link номиналом 5 В 2,5 А. Для USB-хаба — его родной БП 5 В 2 А.
Вчера возникла необходимость перегрузить дебиан-маршрутизатор по питанию — поставил на нём vsftpd для складирования изображений с камеры на локальный FTP, но привинченный phpAlbum.net подвис, пытаясь вычитать со всех фоток EXIF-данные сразу. В сетевой удлинитель у меня было воткнуто 3 блока питания — для DIR-615, для DIR-320 и для USB-хаба. Вытащил соответствующий БП, смотрю — роутер остался включённым. Я слегка охренел. Вставил его БП обратно, вытащил другой (USB-хаб). (DIR-320 остался работать).

Ладно, вставил на место, вытащил третий (от DIR-615). Результат не поменялся. При всех выключенных БП он наконец-то погас. Я попробовал включить только его БП, роутер стал загружаться, но без доступа к хабу и, соответственно, к флехе с системой он бы не загрузился. Я вытащил его питание (роутер погас), включил питание USB-хаба и увидел, что DIR-320 опять загружается! Теперь у меня такая итоговая схема соединения железок:

И маршрутизатор вполне себе функционирует нормально:

Принцип прямого соединения внешнего питания с цепью +5 В питания USB-хоста мне уже знаком, но то, что это реализовали в DIR-320 — для меня было открытием. Подобную ситуацию нагуглил только в одном месте — на cxem.net.

Кстати, при такой схеме подключения есть опасность повреждения контроллера USB при отключении хоста от сети и включенном питании хаба (хотя изменение скважности у импульстого БП никто не отменял). У этой железки устраняется удалением элемента с обозначением 000 возле гнезда питания при снятой задней крышке хаба. Для работы без внешнего питания потребуется установить на это место диод Шоттки.

P. S. Справедливости ради нужно сказать, что мне пришлось вернуть старую схему питания устройств, т. к. питания от USB-хаба оказалось недостаточно (роутер перезагружался при load average больше 0,5).

Веселый переезд

Сегодня со мной связался знакомый, который оказывал мне услугу по поддержке доменных имён у моих проектов, и сообщил, что в течение полутора дней он планирует отказаться от VPS-хостинга, на котором стоит DNS-сервер.

Показать

Я сохранил информацию об именах, заказал услугу NS у хостера моих доменов и начал «процедуру переноса NS», которая заключается в том,что я прописывал canonical name каждого субдомена в панель управления NS хостера. В доменном имени gladilov.org.ua у меня 84 поддомена, т. к. значительное количество проектов веду, много храню в виде наработок, и ещё больше в планах. Например, из реализованных —  погода в Симферополе,  сайт о Солнце,  сайт по роутерам,  православная календарная страничка,  сервер точного времени,  Jabber-сервер,  подборка флагов стран и т. д.
Перевод NS к хостеру, не скрою, делал в спешке, поэтому, когда у меня постепенно начали пропадать все мои поддомены (включая и этот — blog.gladilov.org.ru / blog.gladilov.org.ua), то не сильно и удивился...
Начал разбираться и выяснил, что в результате переноса я получил 84 имени вида sun.gladilov.org.ua.gladilov.org.ua, mail.gladilov.org.ua.gladilov.org.ua, install.gladilov.org.ua.gladilov.org.ua и т. д.
В консоли проверил — точно, sun.gladilov.org.ua.gladilov.org.ua резолвится и пингуется, dig даёт о нём информацию.
Я в спешке вместо имён поддоменов (sun, weather etc.) везде повводил полное имя (sun.gladilov.org.ua, weather.gladilov.org.ua). NS-сервер хостера честно и отработал на основании указанных мною данных, прилепил к введённым поддоменам основной домен и анонсировал полученные имена.

В общем — визуальная улика о моей ошибке:

Сейчас уже всё исправил, теперь буду более внимательным.

Ранее Ctrl + ↓
Наверх