gladilov.org.ru gladilov.org.ua

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

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

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



Позднее Ctrl + ↑

Количество 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   интернет   маленькие хитрости   сеть   сисадминство

Памятка для настройки DebWrt

 Давным-давно появилась у меня железка D-Link DIR-300/A2,  вот такая. Так как на ней есть разъём USB, то я поставил туда прошивку DebWrt, продукт противоестественного скрещивания Debian и OpenWrt

С тех пор на винте лежит текстовый файл, описывающий основные команды настройки этой ОС. Публикую здесь как памятку для себя (с моими комментариями), ну а если сей опус кому-либо когда-либо как-либо чем-то пригодится — я буду только рад!

Показать

cd /etc/network
rm interfaces // это симлинк на interfaces.firstboot
cp interfaces.firstboot interfaces
vi interfaces // настраиваем сетевые интерфейсы как нам нужно
// следующие команды необходимы для настройки доступа в интернет без перезагрузки устройства
// (после доступ будет реализован путём выдачи IP по DHCP от шлюза во внешнюю сеть)
ip a a $IP/$MASK dev $IF && echo '8.8.8.8' > /etc/resolv.conf && ip r a via $GW
// для обновления репозитория со squeeze до wheezy
cp /etc/apt/sources.list /etc/apt/sources.list.old
echo 'deb http://ftp.debian.org/debian wheezy main' > /etc/apt/sources.list
gpg --keyserver pgpkeys.mit.edu --recv-key F120156012B83718 && gpg -a --export F120156012B83718 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 010908312D230C5F && gpg -a --export 010908312D230C5F | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key CBF8D6FD518E17E1 && gpg -a --export CBF8D6FD518E17E1 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010 && gpg -a --export 7638D0442B90D010 | apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 8B48AD6246925553 && gpg -a --export 8B48AD6246925553 | apt-key add -
// опционально
gpg --keyserver pgpkeys.mit.edu --recv-key 6FB2A1C265FFB764 && gpg -a --export 6FB2A1C265FFB764 | apt-key add -
aptitude update
aptitude upgrade
adduser $USER
echo '$USER ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers
// обновление системы, можно и aptitude upgrade/aptitude dist-upgrade впендюрить, если время позволяет
aptitude update
// установка нужных пакетов
aptitude install mc sudo locales bash-completion ntpdate openssh-server screen wpasupplicant
// установка опциональных пакетов
aptitude install most nload htop ccze telnet wavemon tcpdump fping nmap ipcalc console-cyrillic
// установка совсем уж опциональных пакетов
aptitude install apache2 php5 mysql-server mysql-client
// настройка локали, шрифтов, таймзоны
dpkg-reconfigure locales
dpkg-reconfigure console-cyrillic // если поставлен
dpkg-reconfigure tzdata

Далее следует настройка переменных и алиасов в ~/.bashrc и ~/.profile (а равно и в /root/.bashrc и /root/.profile).

Если кого заинтересовала эта прошивка — вот  ссылка на мою инструкцию по перепрошивке девайса (DIR-320/A*, версия прошивки — 10.03).

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

Скрипт подсчёта размера БД 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 ***

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

Настройка 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

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

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).

2014   D-Link   железо   маленькие хитрости   роутер   сеть   сисадминство

Решение проблемы «???????????? no permissions» в adb

Для теста решил поставить Android SDK на свою машину (у меня смартфон с ОС Андроид), но после установки и докачивания компонентов команда

./adb devices

вывела следующий текст:

List of devices attached
????????????    no permissions

Показать

Оказалось, что в моей системе не было правильно настроенных правил демона udev для этого устройства. Для решения проблемы необходимо знать USB-ID производителя и устройства (VendorID и ProductID), ну и конечно имя пользователя, под которым регистрируетесь в системе.
Я создал файл-правило udev с именем /etc/udev/rules.d/51-android.rules и с таким содержимым:

SUBSYSTEM=="usb", ATTRS{idVendor}=="VendorID", ATTRS{idProduct}=="ProductID", MODE="0666", OWNER="UserLogin"

Затем перегрузил демон udev:

sudo /etc/init.d/udev reload

После этого вывод команды

./adb devices

должен вывести что-то вроде:

List of devices attached
DeviceID    device

Бывает, что уже при настроенных правилах udev всё равно не работает, тогда помогает выполнение команд:

sudo ./adb kill-server
sudo ./adb start-server
./adb devices

После перезапуска сервера ADB мой смартфон определился нормально.

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

Права на файлы apache

Вчера намудрил с правами файлов моих сайтов, что только не делал для восстановления, и sticki-бит ставил, и менял владельца/группу, и ставил флаг +x.
Сегодня командой

find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \;

вернул всё взад ;-)

2013   Linux   WEB-серверы   маленькие хитрости   сисадминство   софт
Наверх