gladilov.org.ru gladilov.org.ua

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

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

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



Загрузка в графическое окружение или в текстовую консоль

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

Сначала я по скудоумию копал в сторону передачи параметра загрузки INITLEVEL или RUNLEVEL системе. Пробовал в конце строки загрузки ядра linux добавлять строчку text, но это тоже не сработало. После этого я решился спросить у знакомого админа (очень хорошего админа, Макс — спасибо!)... Он в ответ прислал ссылку на инструкцию, которую я не смог найти на просторах инета ))) И сегодня я наконец-то победил задачу, решение оказалось очень простым.

Описываю процесс (проверил в свежеустановленной виртуалке с Debian 9): Показать

Поставил систему в  ВиртуалБоксе. Установил XFCE4. Продублировал запись о загрузке в /boot/grub/grub.conf, полностью скопировав первый блок menuentry (привожу с сокращениями):

menuentry 'Debian GNU/Linux' {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
        echo 'Загружается Linux <версия ядра> …'
        linux /boot/vmlinuz-<версия ядра> root=UUID=<UUID> ro  quiet
        echo 'Загружается начальный виртуальный диск …'
        initrd /boot/initrd.img-<версия ядра>
}

В первом блоке menuentry дополнил название до ’Debian GNU/Linux in text mode’, во втором — до ’Debian GNU/Linux in graphical mode’. Затем в первом блоке в строке загрузки ядра в конце добавил параметр 3, что означает уровень выполнения, в который система прыгает после загрузки. При выборе второго пункта меню система загрузится в обычном режиме, предусматривающем уронь выполнения 5 (графическая консоль), а при загрузке по первому пункту меню (по умолчанию) будет текстовая консоль и уровень выполнения 3.

Загрузочное меню GRUB: Показать

Загрузка в текстовом режиме: Показать

Загрузка в графику: Показать

Затем (так как это тестовая машина) настраиваю автологин и в тексте, и в графике. Для автологина в тексовой консоли в файле /lib/systemd/system/getty@.service прописываю юзера для автологина

ExecStart=-/sbin/agetty --noclear -a <юзер> %I $TERM

Да автовхода в XFCE в файле /etc/lightdm/lightdm.conf указываю

autologin-user=<юзер>
autologin-user-timeout=0

Источники:
Настройка GRUB
Автологин в текстовой консоли
Автологин в XFCE

19 марта   досуг   интересное   маленькие хитрости   ОС   сисадминство

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

      Небольшой отчёт о проделаной работе с Эгеей.

      Март 2018 года:
Пришла пора  книжного раздела. Добавил ко всем заметкам о прочтённых книгах тэг «Моё чтиво», так как тэг «Книги» использую, в том числе, для статей об известных авторах или их произведениях. Все обложки прочтённых книг перенёс к себе на сервер (раньше тэги IMG смотрели на картинки на разных сайтах) и причесал их к стандартному размеру 105×150 точек. К каждому такому изображению применил класс «bookimg», так описав его в файле user/extras/header-pre.tmpl.php:

Показать

.bookimg {
    width:106px;
    height:150px;
    vertical-align:middle;
    border:1px solid grey;
}

Для заголовочных картинок там же описал классы «main_left_img» и «main_right_img»:

.main_left_img {
    float:left;
    margin-right:10px;
}
.main_right_img {
    float:right;
    margin-left:10px;
}

      Май 2018 года:
Приделал к блогу реКАПЧУ для отсекания сообшений от ботов.

      Октябрь 2018 года:
В конце октября настроил в системе своп-файл для борьбы с частыми вылетами демона агрегатора новостей. Эксперимент можно считать успешным, так как с тех пор не было ни одного аварийного завершения демона.
Статистика и динамика в графиках: Показать

(данные графиков зафиксированы на 06.01.2019 г.)

Размер свопа Используемая память
Выполняемые процессы Load average
Размер базы агрегатора

      Январь 2019 года:
Привинтил к Эгее lightbox2 для показа скринов разных ОСей. Для этого в файле user/extras/header-pre.tmpl.php добавил записи:

<link href="/lightbox2/css/lightbox.css" rel="stylesheet" type="text/css">
<script src='/lightbox2/js/lightbox-plus-jquery.min.js'></script>

а в постах пишу такой код:

<font size="2"><a class="lightbox2" data-lightbox="<уникальный ID>" href="/img/osdetect/ОСь.png"><img src="/img/install/os/ось.png" style="vertical-align:middle;" />&nbsp;ОСь<br /><img src="/img/osdetect/preview/ОСь.png" style="vertical-align:middle;" /></a></font>

Уникальный ID нужен для исключения создания галереи из нескольких картнок.

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

Элегантная форк-бомба


ВНИМАНИЕ!
Не запускайте эту команду, чтобы «проверить» её, так как у вашего компьютера скорее всего произойдёт сбой, влекущий за собой принудительную перезагрузку системы.

Текст бомбы:

:(){ :|:& };:

Что она делает:
 :() — объявление функции с именем :
 {:|: &} — в теле функции описан запуск её же и отправка вывода снова в функцию : (в фоне)
 ; — разделитель команд, как и &&.
 : — первый запуск функции :

Источник

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

Добавление swap-файла в системе Debian

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

Создал пустой файл /swapfile размером 2 Гб:

dd if=/dev/zero of=/swapfile bs=1M count=2048

Установил ему права:

chmod 600 /swapfile

Отформатировал этот файл как своп:

mkswap /swapfile

Добавил файл подкачки в систему:

swapon /swapfile

В файле /etc/fstab добавил строку:

/swapfile     swap     swap     defaults     0     0

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

Источники:
https://wiki.debian.org/Swap
https://www.tecmint.com/create-a-linux-swap-file/
http://blog.sedicomm.com/2017/07/26/kak-sozdat-linux-swap-fajl/

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

Срыв покровов. Продолжение

Продолжение рассказа об особенностях монтирования файловых систем.

В дополнение темы монтирования двух разных ФС в одну точку монтирования имею заявить следующее:

как явствует из манов ([1], [2]), при монтировании файлов используется механизм монтирования через loop-устройство. То есть, сначала устанавливается привязка петлевого устройства /dev/loopX к монтируемому файлу, затем это устройство монтируется на точку монтирования.

Если петлевое устройство явно не указано (как у меня при проведении эксперимента), тогда mount попытается найти свободный loop-device и использовать его. Поэтому, если бы я при монтировании файлов A.img и B.img в одну точку монтирования выполнил команду losetup и cat /etc/mtab, то увидел бы нечто вроде этого: Показать

root@debian:/home/soul# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /home/soul/A.img
/dev/loop1         0      0         1  0 /home/soul/B.img
root@debian:/home/soul# cat /etc/mtab 
rootfs / rootfs rw 0 0
. . .
/dev/loop0 /mnt/A ext2 rw,relatime 0 0
/dev/loop1 /mnt/A minix rw,relatime 0 0
root@debian:/home/soul#

Как по мне, cамый оптимальный вариант решения (подсмотрен тут) — это создать линейный RAID из двух петлевых устройств, привязанных к своим файлам, и смонтировать его в нужную точку монтирования (требует установленного пакета mdadm): Показать

root@debian:/home/soul# losetup /dev/loop0 A.img
root@debian:/home/soul# losetup /dev/loop1 B.img
root@debian:/home/soul# mdadm --build /dev/md0 --level=linear --raid-devices=2 /dev/loop0 /dev/loop1
root@debian:/home/soul# mount /dev/md0 /mnt
root@debian:/home/soul#

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

Срыв покровов

Рассказ об особенностях монтирования файловых систем.

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

Сегодня, найдя свободное время, я попробовал это выяснить опытным путём в  ВиртуалБоксовой машине с установленным  Дебианом, о чём отчитываюсь: Показать

– Создал директории /mnt/A и /mnt/B и файлы A.img и B.img (размером по 10 Мб), отформатировав их в разные файловые системы (ext2 и minix): Показать

soul@debian:~$ sudo -s
root@debian:/home/soul# fallocate -l 10M A.img
root@debian:/home/soul# fallocate -l 10M B.img
root@debian:/home/soul# ls /mnt
root@debian:/home/soul# mkdir /mnt/A
root@debian:/home/soul# mkdir /mnt/B
root@debian:/home/soul# mkfs.ext2 A.img
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 10240 1k blocks and 2560 inodes
Filesystem UUID: 866d1e35-dad7-466a-990a-411601395777
Superblock backups stored on blocks:
        8193

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

root@debian:/home/soul# mkfs.minix B.img
3424 inodes
10240 blocks
Firstdatazone=112 (112)
Zonesize=1024
Maxsize=268966912

root@debian:/home/soul#

– Смонтировал их в разные директории (A.img в /mnt/A, B.img в /mnt/B): Показать

root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/B
root@debian:/home/soul#

– Отмонтировал B.img от /mnt/B и примонтировал к /mnt/A, создал каталог /mnt/A/test1: Показать

root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul# mount -o loop B.img /mnt/A
root@debian:/home/soul# mkdir /mnt/A/test1
root@debian:/home/soul# ls /mnt/A
test1
root@debian:/home/soul#

– Перемонтировал A.img и B.img и примонтировал их к разным директориям, посмотрел результат создания каталога: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# ls /mnt/B
test1
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul#

– Повторил эксперимент в другой последовательности: Показать

root@debian:/home/soul# mount -o loop B.img /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# ls /mnt/A
lost+found
root@debian:/home/soul# mkdir /mnt/A/test2
root@debian:/home/soul#

– Отмонтировал оба файла, примонтировал их опять к разным директориям и посмотрел результат второго этапа: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# mount -o loop A.img /mnt/A
root@debian:/home/soul# mount -o loop B.img /mnt/B
root@debian:/home/soul# ls /mnt/A
lost+found  test2
root@debian:/home/soul# ls /mnt/B
test1
root@debian:/home/soul#

– Отмонтировал всё, удалил ненужные файлы и каталоги: Показать

root@debian:/home/soul# umount /mnt/A
root@debian:/home/soul# umount /mnt/B
root@debian:/home/soul# rm A.img
root@debian:/home/soul# rm B.img
root@debian:/home/soul# rmdir /mnt/A
root@debian:/home/soul# rmdir /mnt/B
root@debian:/home/soul# ^D
exit
soul@debian:~$

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

P. S. Здесь речь идёт о стандартных решениях, всякие там LVM, ZFS, btrfs и unionfs не рассматриваются.

Информация о системе: Показать

soul@debian:~$ uname -a
Linux debian 3.16.0-6-amd64 #1 SMP Debian 3.16.56-1 (2018-04-28) x86_64 GNU/Linux
soul@debian:~$ cat /etc/issue.net
Debian GNU/Linux 8
soul@debian:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
soul@debian:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.10 (jessie)
Release:        8.10
Codename:       jessie
soul@debian:~$

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

Напильник для 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. Скрин отвалился, демон тоже: Показать
2018   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"

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

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

2018   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

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

2018   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   интересное   маленькие хитрости   ОС   сисадминство   скрипт   софт
Ранее Ctrl + ↓
Наверх