gladilov.org.ru gladilov.org.ua

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

скрипт

Позднее Ctrl + ↑

Запуск 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

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

Количество 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

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

Количество 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. В источнике приведён однострочник, но я разбил строку на три для удобства и читаемости.

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.

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

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

Скрипт подсчёта размера БД MySQL

Понадобилось мне как-то узнать размер таблиц в MySQL-базе данных. Причём узнать в shell script’е. Поискав в сети, наткнулся на чудесный скриптик.

Показать

Допилив его, стал использовать в MRTG. Привожу полностью, без правок/изменений:

#!/bin/bash
# Calculate the storage space used up by all tables in a given MySQL database
# Ben Dowling - www.coderholic.com
database=$1
username=$2
password=$3

if [ ${#database} -eq 0 ]
then
    echo "Usage: $0 &lt;database&gt; [username [password]]"
    exit
fi

if [ "$password" ]
then
   password="-p$password"
fi

mysql="mysql -u $username $password $database"

$mysql -se "USE $database";

tables=$($mysql -se "SHOW TABLES")

totalData=0
totalIndex=0
totalTables=0

for table in $tables
do
   output=$($mysql -se "SHOW TABLE STATUS LIKE \"$table\"\G")
   data=$(echo "$output" | grep Data_length | awk -F': ' '{print $2}')
   dataMegs=$(echo "scale=2;$data/1048576" | bc)
   index=$(echo "$output" | grep Index_length | awk -F': ' '{print $2}')
   indexMegs=$(echo "scale=2;$index/1048576" | bc)
   total=$(($index+$data))
   totalMegs=$(echo "scale=2;$total/1048576" | bc)
   
   echo "$table Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB"
   
   totalData=$(($totalData+$data))
   totalIndex=$(($totalIndex+$index))
   totalTables=$(($totalTables+1))
done

dataMegs=$(echo "scale=2;$totalData/1048576" | bc)
indexMegs=$(echo "scale=2;$totalIndex/1048576" | bc)
total=$(($totalIndex+$totalData))
totalMegs=$(echo "scale=2;$total/1048576" | bc)

echo "*** $totalTables Tables | Data: ${dataMegs}MB Indexes: ${indexMegs}MB Total: ${totalMegs}MB ***"

Размеры выводятся в мегабайтах. Пример вывода:

soul@etcetera:~$ ./db.sh somedatabase root ********
wp_comments Data: 6.60MB Indexes: .15MB Total: 6.75MB
wp_links Data: 0MB Indexes: 0MB Total: 0MB
wp_options Data: 1.57MB Indexes: .01MB Total: 1.58MB
wp_postmeta Data: .01MB Indexes: .01MB Total: .02MB
wp_posts Data: .57MB Indexes: .02MB Total: .60MB
wp_term_relationships Data: 0MB Indexes: .01MB Total: .02MB
wp_term_taxonomy Data: 0MB Indexes: 0MB Total: 0MB
wp_terms Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_data Data: 0MB Indexes: 0MB Total: 0MB
wp_tla_rss_map Data: 0MB Indexes: 0MB Total: 0MB
wp_usermeta Data: 0MB Indexes: 0MB Total: 0MB
wp_users Data: 0MB Indexes: 0MB Total: 0MB
*** 12 Tables | Data: 8.78MB Indexes: .25MB Total: 9.03MB ***

Наверх