gladilov.org.ru gladilov.org.ua

107 заметок с тегом

сисадминство

Всякие системные и просто нужные компьютерные фичи. Настройка софта, иногда восстановление железа, и прочее, что входит в сферы интересов от эникейшика до «full stack admin’а». В придачу — симулятор системного администратора.



Позднее Ctrl + ↑

Автоматический запуск 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

Запуск Apache с IP в качестве имени сервера

Должен быть доступен ifconfig (в Debian 9 по умолчанию не установлен пакет net-tools), конфиг-файл апача лежит по пути /etc/apache/httpd.conf.

Показать

#!/usr/bin/env bash
APACHECONFFILE=/etc/apache/httpd.conf
if test $(id -u) != 0
    then echo "You must be root to run this script! Aborting."
    exit 1
fi
if ! type /sbin/ifconfig>/dev/null 2>&1
    then echo "ifconfig required but not installed! Aborting."
    exit 1
fi
LC_ALL=C
export LC_ALL
ALL=$(ifconfig -a | sed -n 's/^\([^ ]\+\):.*/\1/p' | paste -sd ' ')
IF=""
for if in $ALL; do
    test "$if" == "ppp0" -a "$IF" == "" && IF=$if
done
for if in $ALL; do
    test "$if" == "ippp0" -a "$IF" == "" && IF=$if
done
for if in $ALL; do
    test "${if/#eth*/eth}" == "eth" -a "$IF" == "" && IF=$if
done
for if in $ALL; do
    test "${if/#enp*/enp}" == "enp" -a "$IF" == "" && IF=$if
done
for if in $ALL; do
    test "${if/#wlan*/wlan}" == "wlan" -a "$IF" == "" && IF=$if
done
test "$IF" == "" && IF=lo
echo Using $IF
IP=$(ifconfig $IF|awk '/inet/{print $2}'|cut -d: -f2)
SERVERNAME=$(awk '/^ServerName/{print $2}' $APACHECONFFILE)
echo ServerName changed from $SERVERNAME to $IP
perl -pi -e "s/(^ServerName).*/\1 $IP/" $APACHECONFFILE
/etc/init.d/apache reload

Заставляем работать старую версию 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)

Отседова

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

Простейший 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 [адрес]

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

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

Количество 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. Цветовое выделение добавлено для лучшей читаемости (и понимаемости) регулярного выражения.

Регулярка для проверки IPv4

Проверить на корректность IP четвёртой версии можно таким регулярным выражением

/ ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) /g

Проверить работоспособность можно здесь.

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

Количество Linux и Windows систем в локальной сети

Количество Linux- и Windows-хостов в сети можно с помощью следующих команд:

$ sudo nmap -F -O 192.168.1.1-255 | grep "Running: " > /tmp/os; \
echo "$(cat /tmp/os | grep Linux | wc -l) Linux device(s)"; \
echo "$(cat /tmp/os | grep Windows | wc -l) Window(s) devices"

Вместо 192.168.1.1-255 нужно подставить параметры своей сети. Для выполнения требуется установленный в системе пакет nmap и пользователь должен иметь возможность получать привилегии рута.

P. S. В источнике приведён однострочник, но я разбил строку на три для удобства и читаемости.

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

Установка xfce4 в BSD-системах

Всё время забываю, как установить и настроить гуй в BSD-системах. Процесс такой...
Ставим пакеты xfce4-session, xfdesktop, xfwm4:

$ sudo pkg_add -v xfce4-session xfdesktop xfwm4

Пакет вытянет вместе с собой GTK, Glib, cairo, d-bus, некоторые компоненты среды и все необходимое для их работы (кроме X.Org, он идет в комплекте базовой системы).

Показать

Добавляем Xfce в автозагрузку:

$ echo 'LC_CTYPE="ru_RU.UTF-8"' > ~/.xinitrc
$ echo 'setxkbmap "us,ru" ",winkeys" "grp:caps_toggle" &' >> ~/.xinitrc
$ echo 'exec xfce4-session' >> ~/.xinitrc
$ ln -s ~/.xinitrc ~/.xsession
$ startx

Для графического входа в систем ставится менеджер входа SLIM:

$ sudo pkg_add -v slim

Автозапуск SLIM при старте системы реализуется добавлением в /etc/rc.local строки:

[ -x /etc/rc.d/slim ] && /etc/rc.d/slim start

Для автологина добавляем в /etc/slim.conf строки:

default_user [имя_юзера]
auto_login yes



P. S. Хотя в DragonFly BSD 5.0.0 установил так (с небольшими извратами, см. ниже):

$ sudo pkg install xorg xfce slim slim-themes

и в /etc/rc.conf дописал

dbus_enable="YES"
hald_enable="YES"
slim_enable="YES"

а в .xinitrc

exec startxfce4

(ставил по этому мануалу).

Извраты были такие:

$ sudo dbus-uuidgen > /var/lib/dbus/machine-id

чтобы иксы стартовали без ошибок, а в /etc/rc.conf дописал

moused_enable="YES"
moused_nondefault_enable="YES"
hald_enable="YES"
dbus_enable="YES"

и выполнил

$ sudo /etc/rc.d/moused start

Эти извраты подсмотрел здесь и здесь.

2017   BSD   маленькие хитрости   сисадминство   софт

Cкрипт определения провайдера сотовой связи

Привожу BASH-скрипт получения оператора номера сотового
(используется сервис http://rosreestr.subnets.ru).

Показать

Допустим, мы хотим получить информацию о мобильном номере +7 900 555-55-50 (или 8 900 555-55-50)... При выполнении команды

curl -s "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550" | sed -e 's/<[^>]*>//gm' | sed '/^$/d' | tr -d '\t'

получим в консоли вывод

900
260823
5555550
5555550
1
ООО &quot;СИМ ТЕЛЕКОМ&quot;
5418
Москва и Московская область
1880

где:
900 — DEF-код (мобильные номера всегда начинаются с цифры 9)
260823 — ID диапазона номеров с данным DEF-кодом в реестре Российской системы и плана нумерации
5555550 — начальный номер диапазона номеров
5555550 — конечный номер диапазона номеров
1 — Общая номерная ёмкость в данном диапазоне
ООО "СИМ ТЕЛЕКОМ" — наименование оператора, обслуживающего мобильный номер
5418 — ID оператора
Москва и Московская область — наименование региона, в котором оператор обслуживает мобильный номер
1880 — ID региона в реестре Российской системы и плана нумерации

Разоблачение фокуса...

Командой

curl -s "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550"

в вывод консоли сервис возвращает ответ в формате XML:

<?xml version="1.0" encoding="utf-8"?>
<response>
<row>
        <code>900</code>
        <codeID>260823</codeID>
        <from>5555550</from>
        <to>5555550</to>
        <capacity>1</capacity>
        <operator>ООО &quot;СИМ ТЕЛЕКОМ&quot;</operator>
        <operatorID>5418</operatorID>
        <region>Москва и Московская область</region>
        <regionID>1880</regionID>
</row></response>

Команда

sed -e 's/<[^>]*>//gm'

по конвейеру убирает все подстроки, заключённые в угловые скобки < ... >

900
        260823
        5555550
        5555550
        1
        ООО &quot;СИМ ТЕЛЕКОМ&quot;
        5418
        Москва и Московская область
        1880

Затем с помощью команды

sed '/^$/d'

удаляются пустые сроки, оставшиеся после удаления <тегов>:

900
        260823
        5555550
        5555550
        1
        ООО 'СИМ ТЕЛЕКОМ'
        5418
        Москва и Московская область
        1880

а команда

tr -d '\t'

убирает символы табуляции в получившемся выводе

900
260823
5555550
5555550
1
ООО 'СИМ ТЕЛЕКОМ'
5418
Москва и Московская область
1880

N. B.: Скрипту нужен установленный пакет curl, можно заменить wget’ом:

wget -q -O - "http://rosreestr.subnets.ru/?get=num&format=xml&num=9005555550" | sed -e 's/<[^>]*>//gm' | sed '/^$/d' | tr -d '\t'

N. B.: В принципе, можно получать вывод не в формате XML, при опускании в урле параметра

&format=xml

сервис выдаёт plain text.

В планах написать веб-версию, использующую данный сервис.

Слизано с Хабра.

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

Получение внешнего 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

2017   BASH   Linux   интернет   маленькие хитрости   сеть   сисадминство
Ранее Ctrl + ↓
Наверх