http://mitroko.com
:: Тренировки sh/bash'иста...

0) Intro...

Вот, ты снарядил свой модный старенький ноутбук довольно старым, но проверенным дистрибутивом GNU/Linux.
Все неплохо, но надо иногда ,чтобы флешка подключалась автоматически или компакт-диски, сервисы оповещали о своей случайной кончине или менялся пароль на отбалдовый каждый раз...

Ну, согласись, каждый раз это делать вручную - неудобно и, как говаривал мой старый приятель, - неэффективно!

А еще было бы неплохо просто набраться базовых знаний и примеров скриптов автоматизации.

Все начинается с маленьких шагов.
И маны, и доки, и инфы - все это, конечно, потом надо будет как-минимум просмотреть, ну, ради уважения, хотя бы.

Я не пытаюсь изобрести велосипед, - я, просто, рассказываю, как он устроен. Техники.

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

Я пользуюсь sudo. Освой! Пригодится.

А сейчас начнем с простого...

1) Назначение переменных.

Самое простое применение - дополнение файла .bashrc в домашней директории. Например, чтобы пути поиска бинарных файлов включали в себя, также, и sbin директории:

По-умолчанию, во многих дистрибутивах переменной PATH назначается /bin:/usr/bin:/usr/local/bin

Двоеточием разделены отдельные пути.

Теперь дополним переменную.

Чтобы ей воспользоваться, обратимся к ней - $PATH

Итак, ставим ":" и продолжаем своими путями:

set PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin

Ну, вот, вроде бы просто все...

2) Исполнение.

Попробуем проконтролировать звук на запуске.

У некоторых дистрибутивов, например, как у моего, ползунок PCM почему-то в самом начале работы на нуле каждый раз.
Вдаваться в подробности, что бы это могло значить - я не стал - неэффективно!

Обладая пониманием, что автозапуск во многих старых дистрибутивах - это /etc/rc.local я добавляю туда:

aumix -v100 -w100 -c100

Согласись - несложно и в результате, красивая мелочь!

Зачем я это написал?
Дело все в том, что /etc/rc.local - это тоже, в своем смысле, скрипт. Все комманды, которые ты напишешь в своем скрипте ты сможешь перенести туда и обратно!

3) Монтируем флеш-накопитель.

Что касается монтирования флешек - о это просто песня!

Да! Ты можешь поставить программу! Программу, которая будет монтировать флешки и размонтировать их...
Ты будешь ее искать, настраивать и терять время.
И, все-равно, проиграешь!
Это - неэффективно! И скрипты ты писать научишься не так быстро!

Давай окунемся в реальность.
Сунь флешку в usb порт.
Теперь прочитай последние сообщения ядра:

$ dmesg

или

$ sudo cat /var/log/messages

Немного многовато масла маслянного...

Читаем хвост - последние 40 строчек.

$ sudo cat /var/log/messages | tail -n 40

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

Теперь, давай прикинем!
Сунул ты флешку - журнал подрос в сообщениях.
Вынул - тоже самое.

А в сообщениях ты можешь найти, какое устройство подключили.
Вот, что вижу я, когда включаю USB-устройство:

scsi2 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 4
usb-storage: waiting for device to settle before scanning
drivers/usb/core/inode.c: creating file '004'
usb 1-1: New USB device found, idVendor=067b, idProduct=2528
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: USB Flash Drive
usb 1-1: Manufacturer: USB 2.0
usb 1-1: SerialNumber: 000709078CE6B4ABAB62
hub 1-0:1.0: state 7 ports 2 chg 0000 evt 0002
scsi 2:0:0:0: Direct-Access     USB 2.0  USB Flash Drive  1.00 PQ: 0 ANSI: 2
sd 2:0:0:0: [sda] 7929856 512-byte hardware sectors (4060 MB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 03 00 00 00
sd 2:0:0:0: [sda] Assuming drive cache: write through
sd 2:0:0:0: [sda] 7929856 512-byte hardware sectors (4060 MB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 03 00 00 00
sd 2:0:0:0: [sda] Assuming drive cache: write through
 sda: sda1
sd 2:0:0:0: [sda] Attached SCSI removable disk
sd 2:0:0:0: Attached scsi generic sg0 type 0
usb-storage: device scan complete

О чем нам может это сказать?
О том, что подключенное устройство, привязано к виртуальному устройству sda (/dev/sda).
Определился тип устройства, его параметры (размер слайсов файловой системы, их количество, режим защиты от записи итд)

Хм. Конечно, можно каждый раз самому читать, что пишется в журнал при подключении, потом, основываясь на полученных данных, монтировать устройства, но - это неэффективно!

Пусть это делает скрипт.
Да! Полностью автоматизировать все не удастся (вдруг устройство будет связано с виртуальным устройством uba, как, например это делает knoppix) пока, но это только пока!

Наши первые строчки в скрипте:

#!/bin/sh

Это строчка очень похожа на комментарий, но в отличие от остальных оных, она в самом начале и содержит символ "восклицательный знак".
Это признак того, что все далее - полный путь к интерпретатору. Указан - sh. Стандартный шелл.
А мог быть и bash. Смотри сам, что тебе нужно.
У каждого интерпретатора свой "язык" и скрипты одного могут, но не обязаны работать под руководством другого.

Теперь попробуем "проанализировать" сообщения журнала, когда usb-флеш диск вставлен.

$ sudo cat /var/log/messages

Для того, чтобы отфильтровать нужное нам,мы будем использовать команду grep.
Например, чтобы найти все строчки в данном файле, содержащие слово "Вася", надо дать команду:

$ sudo cat /var/log/messages | grep Вася

А если ты не уверен, как пишут "Вася" (с большой или маленькой буквы), не отчаиваясь вводим:

$ sudo cat /var/log/messages | grep [Вв]ася

Слово "Вася" записано странным образом?
Это регулярное выражение.
Подробнее в манах, конечно. Но, при этом отфильтруются и "Вася" и "вася"

Продолжение...







This site is better to surf with Mozilla Firefox.

Mozilla Firefox Project