Форма обратной связи для WordPress, без плагина. Защита от спама и полевые испытания ASCII-каптчи

Или еще раз возвращаясь к напечатанному. Сегодня поговорим о защите от спама.
В первоначально описанном способе копия был баг (промотайте в конец), из-за которого можно было легко и непринужденно загадить ящик получателя спамом, да еще и в автоматическом режиме. Отправить картинки, вирусы, или загадить чужой ящик не получится, но вот закидать «Войной и миром» ящик владельца сайта вполне таки да.
Чтобы уменьшить такую вероятность, добавим в скрипт отправки почты каптчу. Поскольку скрипт, отправляющий почту (mail.php) к компонентам WordPress не относится, то каптчу придется изобретать свою. Лично мне это оказалось даже хорошо, т.к. совсем недавно я писал о создании ASCII-каптчи, копия, и мне прямо-таки жгло показать ее работу в реальном проекте, а не только в учебных примерах. Посему ее и используем для защиты от спама.

Постановка задачи

Переписать скрипт mail.php так, чтобы он смог использовать ASCII-каптчу.

Краткое описание процесса

1. Пользователь в форме обратной связи, вводит сообщение.

2. По нажатию кнопки «Отправить» сообщение передается скрипту mail.php
3. Если сообщение было отправлено из формы, то скрипт генерирует каптчу, HTML-страницу, содержащую параметры сообщения (имя, текст, электронный адрес пользователя), ASCII-изображение каптчи, поле для ввода кода, элементы управления (кнопки) с помощью которых пользователь может ввести код, обновить код подтверждения, отправить код и сообщение.
4. Скрипт также должен обработать возможные ошибки. Если они есть, пользователю выводится соответствующее сообщение и страница с формой ввода сообщения открывается вновь.
5. Если каптча введена неверно, пользователю демонстрируется сообщение об ошибке ввода каптчи, и дается возможность повторить ввод каптчи. Информация в сообщении сохраняется.
6. Если код введен верно и другие ошибки отсутствуют, сообщение передается на заранее указанный в скрипте e-mail.
Далее подробное описание скрипта

А ТЕПЕРЬ, ВНИМАНИЕ, ВОПРОС
Обход этой каптчи:

Реализация не совсем промышленная. Мне хочется, чтобы вы подумали, над тем, как данный способ защиты обойти. Можете воспользоваться своим методом и попытаться заспамить мне почтовый ящик. Кто заспамит — получит минус два вопроса на зачете.
Можно спамить просто так, но желательно, с описанием способа. Я знаю 5.

Комментарии на lj.rossia.org будут открыты для всех, можно анонимно предлагать, как способы обхода, так и способы защиты. Стирать не буду ничего, кроме флуда, спама и личных оскорблений.

Для самых ленивых, кто не удосужился все прочесть. Инструкция по установке.

Форма обратной связи для WordPress, без плагина здесь или здесь

Все делается так же, с той лишь разницей, что обновленный архив скачиваете по ссылке ниже, и не забываете закачать captcha.php в директорию темы, вместе с mail.php.

Ссылки

Смотреть код скрипта на PasteBin
Скачать все одним архивом
Тесты и куски кода

Заметка в PDF

Страница со списком тегов (или рубрик) WordPress

Если перейти в блоге WordPress по ссылке на любой тег, то попадем на страничку, содержащую анонсы постов по данному тегу, адрес странички будет примерно такой:

http://tolik-punkoff.com/tag/manuals/

Где manuals — собственно, выбранный тег, а tag — префикс для URL-адреса меток, который можно настроить в консоли WordPress в разделе Настройки — Постоянные ссылки.

Идея такого формата адреса достаточно очевидна, убираешь из строки адреса выбранный тег и попадаешь в список всех тегов, как например это сделано в ЖЖ или LJR

Вообще-то в профессиональной теме WordPress это дело должно бы работать из коробки, потому что вообще-то плохо, если раздел сайта, который логически существовать должен, не существует. И так думаю не я один, а как выяснилось из логов, и роботы. Правда это оказался робот какого-то мелкого поисковика, не Google или Яндекса, но все равно неприятно.
Так вот, если тема не сильно профессиональная, или разработчик забыл о такой мелочи, то посетитель сайта попадет по такой ссылке на страницу 404.

Исправляем досадную неприятность.

Читать далее…

Скачать заметку в формате PDF

Настройка XDMCP, удаленного подключения к рабочему столу Linux

Не так давно я затрагивал вопрос настройки X11 Forwarding [Копия], что позволяет через ssh запускать отдельные графические приложения на удаленной Linux-машине (сервере). Теперь буду настраивать удаленный доступ к рабочему столу через XDMCP.
XDMCP внешне похож на RDP в Windows, т.е. при подключении пользователю будет предложено ввести логин и пароль в окне входа в систему и на экране отобразится удаленный рабочий стол. Фактически, на удаленной машине в памяти висит Display Manager (GDM, XDM и т.д.) и слушает 177 порт UDP, если от X-сервера с другой машины поступает запрос, Display Manager начинает с ним общаться, принимать оттуда изображение, а туда передавать координаты мыши и нажатия с клавиатуры, рисует окошко входа в систему. Если пользователь предоставил корректные данные для входа в систему, то он сможет работать с удаленным рабочим столом.

Внимание! Не все Display Manager’ы поддерживают работу по протоколу XDMCP. Точно поддерживают XDM, GDM, KDM и LightDM [3], так что проверьте в первую очередь, какой у вас Display Manager, и может ли он работать по XDMCP. Например, на одной из машин, к которой требовался доступ по XDMCP пришлось вместо LXDM ставить GDM.
Внимание! Протокол XDMCP довольно слабо защищен, так что его не рекомендуется использовать через Интернет без дополнительного шифрования. У нас, например, сделан доступ через VPN.

Настройка файервола

Первым делом необходимо открыть на файерволе нужные порты. Обязательно для входящих соединений открывается порт UDP 177. Если соединение планируется из Windows, то необходимо также открыть порты TCP 6000-6005 в обоих направлениях (входящие и исходящие соединения). Для соединения из Gnome вроде как надо открыть также в обоих направлениях порты TCP 16001 и 35091 [2]. На практике я проверял только подключение из Windows.
Команды для настройки файервола:

# XDMCP
echo "Open 177 port UDP (XDMCP) for Avallon AG clients..."
iptables -A INPUT -s x.x.x.x/yy -p udp --dport 177 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/yy -p udp --sport 177 -j ACCEPT

echo "Open 6000:6005 ports (Windows XDMCP) in both directions for AAG clients..."
iptables -A INPUT -s x.x.x.x/yy -p tcp -m multiport --dports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/yy -p tcp -m multiport --sports 6000:6005 -j ACCEPT

iptables -A INPUT -s x.x.x.x/yy -p tcp -m multiport --sports 6000:6005 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/yy -p tcp -m multiport --dports 6000:6005 -j ACCEPT

Вместо x.x.x.x/yy надо подставить адрес компьютера с которого будем связываться с компьютером под Linux, или маску подсети.

Настройка Display Manager’а

У меня был GDM, поэтому приведу его как основной, остальные дам для справки.
Необходимо найти файл custom.conf, в источниках написано, что лежать он должен по адресу /etc/gdm/custom.conf, но на самом деле это зависит от дистрибьютива. В моем случае файл находился здесь: /etc/X11/gdm/custom.conf

В файле, который выглядит, как обычный INI-файл необходимо найти секцию [xdmcp] и вписать туда следующие параметры:

Enable=true
Port=177

Как видите, можно задать альтернативный порт для XDMCP.

Настройка других DM:
Под катом

Внимание! Стоит заметить, что в некоторых случаях конфигурационные файлы могут располагаться в других местах. Если их нет по указанным путям, можно воспользоваться поиском файлов в том же mc

Настройка подключения в Windows

Понадобится уже упомянутый в заметке про X11-Forwarding Xming.
Запускаем XLaunch и устанавливаем конфигурацию.

В первом окне выбираем один из режимов «одного окна», например One window, иначе не даст создать XDMCP сессию, и указываем номер дисплея 0 (обычно 0, если вы специально ничего не переопределяли на сервере, подробнее см. документацию по используемому Display Manager’у):

Описание настройки с иллюстрациями под катом

Если все сделано правильно

То при запуске Xming (через мастер XLaunch или с нужными параметрами) мы увидим окно авторизации в системе:


По клику доступно полноразмерное изображение

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


По клику доступно полноразмерное изображение

Сохранение и использование настроек соединения

Чтобы каждый раз не вписывать и не выбирать вручную все параметры в мастере XLaunch, можно воспользоваться двумя способами:

1. Как ранее говорилось, сохранить конфигурацию в файл *.xlaunch (например xdmcp.xlaunch) и запускать мастер XLaunch, указывая ему с помощью ключа -load файл конфигурации. Мастер XLaunch запустится, но все поля в окнах будут уже предварительно заполнены. Это удобно, если нужно соединяться по XDMCP с несколькими серверами, различающимися только, например, IP-адресом. Можно создать ярлык, в свойствах которого указать параметры к запуску XLaunch:

"C:\Program Files\Xming\XLaunch.exe" -load xdmcp.xlaunch

2. Создать ярлык Xming с нужными параметрами:

"C:\Program Files\Xming\Xming.exe" :0 -clipboard -query 10.10.3.24 -dpi 96

Естественно, вместо 10.10.3.24 нужно подставить свой адрес удаленной машины с XDMCP, а число после -dpi выбрать под свои глаза и монитор.

Источники

1. Удаленный доступ по XDMCP (удаленное подключение к рабочему столу)
2.What Ports Need to be Opened for XDMCP
3.Xdmcp

Копия заметки в PDF

Удаленная перезагрузка сервера под управлением Linux. Перезагрузка Linux без ввода пароля.

На самом деле делалось не для совсем сервера, но тем не менее. Стоит, в общем, на одном заводике в одной из стран СНГ аппарат по переработке пластиковых отходов в пластиковые полезности, управляет им комп с Linux на борту, а компом из будочки рядом управляет оператор с рабочего места с обыкновенной виндой. Комп с Линуксом надо иногда перезагружать, отключать, а в штатном ПО аппарата эту возможность почему-то не встроили. Раньше оператором был довольно умный парень, которому и root-пароль можно было доверить, и ssh, но он уволился, напоследок создав два батника примерно такого содержания:
plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 reboot
plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 poweroff

Бардак сущий, под root ходить для перезагрузки никуда не годится, да еще и хранить рутовый пароль в открытом виде. Можно, конечно, было бы подправить батник, сделав вход под юзерской учеткой, но sudo было криво настроено и все равно оператору бы пришлось для перезагрузки вводить пароль.

Решение

Завести на сервере отдельных пользователей «для отключения» и «для перезагрузки» и настроить все так, чтобы при входе этих пользователей по ssh автоматически выполнялось выключение или перезагрузка, при этом не требовался ввод пароля, создать соответствующие bat-файлы на операторском рабочем месте.

Создание группы

Первым делом понадобится группа для этих пользователей. Самая простая операция. Назовем группу, например powermanager и создадим ее (естественно, здесь и далее все команды, требующие root-доступа делаются из-под учетки root или через sudo).

groupadd powermanager

Настройка sudo, редактирование файла sudoers

В файле /etc/sudoers как раз и описывается, какие пользователи и группы имеют возможность пользоваться утилитой sudo, временно повышая свои права до root, и какие команды им разрешено выполнять без пароля.
Этот файл руками лучше не редактировать, а всегда делать это с помощью команды visudo:

Файл настроек /etc/sudoers всегда следует редактировать с помощью команды visudo. visudo блокирует файл sudoers, сохраняет изменения во временный файл и проверяет, что файл грамматически корректен, перед тем как скопировать его в /etc/sudoers.
Важно:
Крайне важно, чтобы файл sudoers был без синтаксических ошибок! Любая ошибка делает sudo неработоспособным. Всегда редактируйте его только с помощью visudo для предотвращения ошибок.
[1]

I. Улучшаем работу с sudoers

Но есть небольшая проблема, visudo, в качестве вызываемого ей редактора, использует неудобный vi, который без стакана и длительной практики может только «пищать и портить». Слава Ктулху, на компьютере стоял mc, и, соответственно, mcedit, поэтому:

1. Переопределение редактора для visudo при однократном запуске:

EDITOR=mcedit visudo

Уфф, /etc/sudoers открылся в человеческом mcedit.

2. Постоянная замена редактора для visudo
Для этого добавляем в sudoers следующие строки:

Defaults env_reset
Defaults editor=/usr/bin/mcedit, !env_editor

где editor=/usr/bin/mcedit указание, какой редактор использовать
!env_editor — запрет использования редактора, установленного переменными окружения (подробности смотрите по ссылке на детальное описание файла sudoers в конце заметки).

II. Прописываем разрешения для группы powermanager в sudoers

Для разрешения пользоваться командой shutdown без ввода пароля для пользователей группы powermanager, в sudoers следует добавить следующую конструкцию:

%powermanager ALL=NOPASSWD: /sbin/shutdown

Внимание! Для более полного понимания sudoers настоятельно рекомендую ознакомиться со статьей по ссылке в конце заметки!
Внимание! Все пути в файле sudoers должны быть полными

Пример файла sudoers можно посмотреть здесь.

Создание пользователей для перезагрузки и отключения питания

Создание пользователя для удаленной перезагрузки.

1. Создаем пользователя:

useradd -g powermanager -d /home/rebootusr -s /home/rebootusr/reboot.sh rebootusr

где:
-g powermanager группа пользователя (ранее созданная powermanager)
-d /home/rebootusr домашний каталог пользователя
-s /home/rebootusr/reboot.sh — оболочка для пользователя. Обычно здесь прописывается /bin/sh, /bin/bash для интерактивных пользователей, или /bin/false для неинтерактивных, например пользователя FTP, но можно задать и собственный скрипт, команды которого будут выполнены при входе пользователя в систему.

2. Задаем пользователю пароль (иначе не сможем залогиниться по ssh):
passwd rebootusr
3. Создаем домашний каталог:
mkdir /home/rebootusr
4. Меняем владельца каталога на пользователя rebootusr
chown rebootusr:powermanager /home/rebootusr
5. Меняем права доступа на каталог:
chmod 500 /home/rebootusr
6. Создаем в домашнем каталоге скрипт reboot.sh со следующим содержимым:

#!/bin/sh

echo "Rebooting..."
sudo /sbin/shutdown -r now

где
-r — указание программе shutdown выполнить перезагрузку
now — указание временного интервала — немедленно (можно еще выставить число в минутах, тогда перезагрузка произойдет через указанное время)

7. Меняем владельца и права доступа для скрипта reboot.sh

chown rebootusr:powermanager /home/rebootusr/reboot.sh
chmod 500 /home/rebootusr/reboot.sh

Аналогично создаем пользователя для выключения, меняя только имя, пароль, домашний каталог, название скрипта и команды в скрипте.

Содержимое скрипта для отключения питания poweroff.sh:

#!/bin/sh

echo "Power off"
sudo /sbin/shutdown -hP now

Настройка рабочего места оператора

Для Windows понадобится утилита plink, обычно она идет вместе с ssh-клиентом PuTTY. В каталоге с ней создаем два bat-файла следующего содержания.
rebootsrv.bat:
plink -ssh -P 22 -l rebootusr -pw rebootpass 192.168.0.40
pwroffsrv.bat:
plink -ssh -P 22 -l pwroffusr -pw pwroffpass 192.168.0.40

где вместо rebootusr и pwroffusr надо подставить имена пользователей для удаленной перезагрузки и отключения питания соответственно, вместо rebootpass и pwroffpass — заданные пароли, а вместо 192.168.0.40 настоящий адрес удаленного компьютера.

Источники

1. sudo [Копия]
2. Как перезагрузить компьютер без прав root [Копия]

Заметка в PDF

Скрипт для автоматического обновления паролей бесплатного VPN vpnbook.com

Как-то выкладывал конфигурационные файлы для PPTP-VPN от бесплатного VPN-сервиса http://vpnbook.com.
Правда у сервиса есть небольшой недостаток, как и у многих других бесплатных VPN, периодически меняется пароль. Благо, что пароль появляется у них на странице в текстовом виде, без всяких каптч, картинок и яваскрипта, и вполне просто автоматизировать его обновление, чтобы вручную не менять его в конфигурационных файлах после изменения на сайте.

Определение основных переменных

VPNBOOKPAGE="http://www.vpnbook.com/#pptpvpn"
WORKDIR="/tmp/"
HTMLFILE="vpnhtml.txt"
PASSANCOR="Password:"
VPNBOOKPASS=""
FILEPASS=""
PEERSDIR="/etc/ppp/peers/"
PEERSFILES[0]="vpnbook-e214"
PEERSFILES[1]="vpnbook-e217"
PEERSFILES[2]="vpnbook-de233"
PEERSFILES[3]="vpnbook-us1"
PEERSFILES[4]="vpnbook-us2"
PEERSFILES[5]="vpnbook-ca1"

VPNBOOKPAGE — адрес, по которому доступен текущий пароль.
WORKDIR — рабочий каталог, куда будем сохранять полученную с сайта HTML-страницу с паролем
HTMLFILE — имя сохраняемого файла
PASSANCOR — Ключевое слово, по которому будем определять, где именно на странице пароль:

VPNBOOKPASS — тут будем хранить пароль, полученный с сайта
FILEPASS — тут будет пароль, сохраненный в данный момент в конфигурационном файле
PEERSDIR — директория, в которой хранятся конфигурационные файлы для соединения с VPN-серверами vpnbook
PEERSFILES[0]...PEERSFILES[5] — массив с именами конфигурационных файлов

Получение пароля с сайта

I. Сначала, с помощью wget, получим HTML-страницу, содержащую пароль.

echo "GET VPNBOOK PASSWORD v 0.2" #приветствие

rm $WORKDIR$HTMLFILE #удаляем текущий файл
echo "Get vpnbook page..."
wget -P $WORKDIR --default-page=$HTMLFILE --header="Content-type: text/plain" $VPNBOOKPAGE #сохраняем HTML-страницу

ВНИМАНИЕ! Существующий файл с сохраненной HTML-страницей надо обязательно удалить, иначе wget при сохранении страницы добавит к имени дополнительно .1 (.2 .3 и т.д.).

Параметры утилиты wget:
-P $WORKDIR — установка рабочего каталога, указанного в переменной $WORKDIR
--default-page=$HTMLFILE — установка имени файла, под которым в рабочем каталоге будет сохранена полученная с сайта HTML-страница. Имя указывается в переменной $HTMLFILE
--header="Content-type: text/plain" — передаем серверу заголовок, в котором указываем, в каком виде хотим получить страницу (text/plain). Лучше не упускать этот момент, одно время сервер почему-то отдавал без этого заголовка сжатую HTML-страницу, и анализировать ее потом было некузяво.

II. Проверяем, сохранилась ли страница:

if [ ! -f $WORKDIR$HTMLFILE ]; then
    echo "ERROR: Page not saved"
    exit 1
fi

III. Вытаскиваем пароль из сохраненного HTML-файла:

VPNBOOKPASS=`cat $WORKDIR$HTMLFILE|grep "$PASSANCOR"|head -n1|sed -e :a -e 's/<[^>]*>//g;/</N;//ba'|sed 's/.$//'|awk ' {print $2} '`

1. Выводим содержимое файла на stdout командой cat $WORKDIR$HTMLFILE
2. Передаем вывод команде grep, она фильтрует строчку с содержимым, указанным в переменной $PASSANCOR, т.е. строчку, содержащую слово "Password:" и сам пароль. На самом деле команда grep отфильтрует две строки, еще и с виндовыми концами строк:

3. Обрабатываем строчку дальше с помощью команды head -n1 Она получит из вывода команды grep только первую строчку (-n1)

4. Команда sed -e :a -e 's/<[^>]*>//g;/</N;//ba' с вот этим диким регулярным выражением, удалит HTML-теги. Регулярка не моя, я нашел на просторах интернетов.

5. Следующая команда sed 's/.$//' избавит строку от лишнего виндового символа конца строки.

6. Наконец, утилитой awk, которая обрабатывает строки, воспринимая содержимое, как набор полей разделенных разделителем (по умолчанию пробел), вытаскиваем из строки непосредственно сам пароль. awk ' {print $2} '

wra2ezEz

Записываем результат в переменную VPNBOOKPASS, обернув всю команду в обратные кавычки (``)
Далее устанавливается размер массива, хранящего имена файлов настройки (специально так сделал, чтобы если добавится еще один файл конфигурации, количество обрабатываемых файлов обновлялось автоматически): CTR="${#PEERSFILES[*]}"
Далее инициализируется счетчик цикла I="0"

В цикле из массива извлекаются имена файлов, к ним добавляется путь к директории их содержащей, и эти данные передаются функции passwork, которая получает пароль, сохраненный в файле конфигурации, и в случае необходимости его меняет на пароль, полученный с сайта.

until [ "$CTR" -eq "$I" ]; do
    passwork $PEERSDIR${PEERSFILES[I]}
    let "I+=1"
done

Замена пароля в файле конфигурации соединения VPN

Этим в скрипте занимается отдельная функция passwork(), которой в качестве параметра передается полный путь к файлу конфигурации соединения. Вот ее код:

passwork()
{
    echo -n "Checking $1..."
    if [ -e $1 ]; then #file exist
    	COUNT=`cat $1|grep "password" -c`
	if [ $COUNT -eq 1 ]; then # strochek s parolem 1
	    #vitaskivaem password i udalyaem kavichki
	    FILEPASS=`cat $1|grep "password"|awk ' {print $2} '|sed 's/\"//g'`
	    echo -n "password "$FILEPASS
	    
	    if [ "$FILEPASS" = "$VPNBOOKPASS" ]; then #proverka parolya
		echo " not replaced."
	    else
		#backup file
		cp $1 $1".bak"
		echo "...file backuped..."
		sed -i 's/'$FILEPASS'/'$VPNBOOKPASS'/g' $1 #replace password
		echo "...replaced!"
	    fi
	    
	else #>1 ili 0
	    echo  " Peer file format error"
	fi
    else
    
	echo  " $1 not found"
    fi
}

В зарезервированной переменной $1 находится параметр, переданный функции из основной программы, в данном случае путь к файлу конфигурации соединения.
Сначала проверяется, существует ли файл:

...
if [ -e $1 ]; then #file exist
...

Если он существует, продолжаем работу, если нет — выводим сообщение об ошибке и выходим из функции:

...
else
echo " $1 not found"
fi
...

Сам конфигурационный файл выглядит так:

debug
#nodetach
unit 1
remotename ca1.vpnbook.com
ipparam vpnbook-ca1
pty "pptp ca1.vpnbook.com --nolaunchpppd"
name vpnbook
user vpnbook
password "wra2ezEz"
require-mppe-128
refuse-eap
noauth
file /etc/ppp/options.pptp

Далее получаем количество строк, содержащих конфигурационный параметр password. Подсчет нужных строк можно выполнить командой grep с ключом -c

COUNT=`cat $1|grep "password" -c`

Строк с параметром password в конфигурационном файле должно быть строго 1, пароль заключается в кавычки.
Проверяем количество искомых строк:

...
if [ $COUNT -eq 1 ]; then # strochek s parolem 1
...

Если строка найдена, и она одна, то продолжаем работу, иначе выдаем сообщение об ошибке и выходим из функции:

...
else #>1 ili 0
echo " Peer file format error"
fi
...

Извлекаем содержащийся в конфигурационном файле пароль в переменную FILEPASS:

FILEPASS=`cat $1|grep "password"|awk ' {print $2} '|sed 's/\"//g'`

1. Читаем файл с помощью команды cat: cat $1
2. Отфильтровываем строку с паролем: grep "password"
3. Извлекаем пароль (в кавычках) с помощью awk: awk ' {print $2} '
4. С помощью sed удаляем кавычки: sed 's/\"//g'`

Далее сравниваем содержимое переменной FILEPASS, т.е. пароль из обрабатываемого файла конфигурации, с паролем, полученным с сайта vpnbook. Он в переменной VPNBOOKPASS.

...
if [ "$FILEPASS" = "$VPNBOOKPASS" ]; then #proverka parolya

Если пароли идентичны, то выдаем сообщение, что пароль не изменен. Иначе, делаем копию файла конфигурации (cp $1 $1".bak") и заменяем пароль с помощью sed непосредственно в обрабатываемом файле (ключ -i и указание пути к файлу в качестве последнего параметра команды):

sed -i 's/'$FILEPASS'/'$VPNBOOKPASS'/g' $1 #replace password

Попутно выводим сообщения о ходе процесса.

Готовый скрипт

1. На PasteBin
2. Скачать с Mega.NZ

Используемые источники

1. Команда head
2. Однострочные скрипты sed
3. Удаление кавычек с помощью sed
4. Краткое описание awk

[Скачать копии источников в формате PDF]
Заметка в формате PDF

Создание загрузочного образа диска DOS в Slackware Linux

Продолжая тему загрузочных образов.
Расскажу, как сделать загрузочный образ диска DOS в который можно добавить свои программы, загружаемый по сети или с CD-диска. На примере тестового образа, который использовал в одной из предыдущих заметок.
Загрузчик, соответственно, оставлю такой же, какой использовал ранее — SYSLINUX. Вообще SYSLINUX, а точнее memdisk поддерживает кроме ISO загрузку образов дискет и жестких дисков, в т.ч. и сжатых gzip’ом.
С дискетами возникает небольшая проблема — файл образа должен быть строго определенного размера (хотя SYSLINUX поддерживает и нестандартные размеры дискет, но все равно они должны быть строго определенными), в образе дискеты, естественно, не может быть два логических раздела и т.д. Чтобы не заморачиваться с этими ограничениями, буду делать образ жесткого диска, его размер можно определить произвольно, главное, чтоб влез в память машины, на которой его потом будем загружать.

Подготовка системы

1. Устанавливаем простенькую виртуальную машину QEMU, для DOS ее вполне хватит.
2. Устанавливаем multipath tools, для того, чтобы получить доступ к файлам, расположенным в образе диска из Linux (ну если мы хотим добавить в образ какие-нибудь программы). У меня multipath tools были уже установлены, ибо нужны для работы с шифрованными контейнерами truecrypt/tcplay
Я установил необходимые программы с помощью менеджера sbopkg без всяких дополнительных опций при сборке.
3. Если будем работать на удаленной машине через SSH, то настраиваем X11-forwarding
4. Создаем отдельный каталог в котором разместим необходимые образы дисков
5. Скачиваем выдранный из Hiren’s boot CD образ с досовыми утилитами. Или делаем его сами, как я описывал ранее
6. Проверяем, все ли работает, запускаем с досом, выдранным из HBCD:

qemu-system-i386 -cdrom dos.iso -boot d
где:
qemu-system-i386 — программа QEMU для 32-разрядных систем. В 64-разрядной версии Linux необходимо использовать команду qemu-system-x86_64
-cdrom — указываем программе местонахождение ISO-образа диска (тут dos.iso, расположенный в текущем каталоге).
-boot d — указываем программе, что необходимо грузиться с виртуального CDROM’а (из указанного образа диска).

Должно получиться как-то так:


Во втором меню нужно выбрать пункт Next, далее File Managers и Volkov commander
Если Volkov Commander успешно загрузился, то закрываем QEMU и приступаем к созданию образа диска DOS

Создание образа

Первым делом создаем пустой файл (заполненный нолями) нужного размера, например 10 мегабайт. Делается это с помощью стандартной утилиты dd
dd if=/dev/zero of=diskc.img bs=10M count=1
Грузимся опять в QEMU с ISO-образа, но подключив созданный образ диска:
qemu-system-i386 -cdrom dos.iso -hda diskc.img -boot d
Выбираем в загрузочном меню HBCD Volkov Commander
Продолжение со множеством иллюстраций под катом

Готовый образ можно сжать gzip’ом, включить в состав загрузочного ISO-образа или загружать по сети. Пример конфига для ISOLINUX описан здесь

Примеры

Как и что можно таким образом запускать:


Acronis Disk Director for DOS


Acronis True Image for DOS

Скачать

Готовый образ диска
Заметку в формате PDF

Домашний FTP-сервер на Slackware и PureFTPd.

Введение

Когда-то давно поднимал вопрос создания простенького FTP-сервера для домашнего и мелкоофисного использования на Puppy Linux Slacko. Как-то незаметно настало время улучшить и углУбить мануал, и сделать такой же сервер, но на Slackware. Собственно программное обеспечение сервера решено оставить то же — PureFTPd. Ибо уже и какой-никакой опыт в настройке есть, и мануалов в сети много. Тут такая мини-инструкция, больше для себя, где я попытался воедино свести информацию из различных источников. К сожалению, не во всех все подробно описано, посему сперва столкнулся с некоторыми неочевидными глюками, и чтоб не гуглить потом все в разных местах, сам решил свести воедино все свои пометки в рабочем блокноте в данной заметке.
Сразу говорю, вопрос шифрования трафика, FTP через SSL в данной заметке благополучно упущен по причине ненадобности. Для общего доступа из Интернета данный сервер и не планировался, а для того, чтобы не бегать с флешками между десятком-другим компов, хранить бэкапы, дистрибьютивы софта, его как раз должно хватить.
Почему FTP, а не Samba? Не знаю, но FTP мне показался более простым в настройке, плюс универсальней — клиент FTP есть из коробки во всех «больших» ОС, начиная от Windows XP и кончая почти всеми Линуксами и MacOS, плюс FTP-клиент достаточно быстро прикручивается и к мобильным системам. Во всяком случае, подружить Android и iOS с FTP оказалось менее муторно, чем заставить нормально работать мобильные девайсы с расшаренными директориями в Samba на Linux, или с расшаренными папками в Windows.

Важные примечания

ВАЖНО! Перед установкой и настройкой сервера, открываем файл /etc/shells и проверяем в нем наличие строки /bin/false Если ее нет — смело дописываем.
Если данной строки нет, то при настройке могут проявиться всякие странные глюки. Например, на одном из дистрибьютивов пользователя для FTP-сервера удалось создать только с помощью скрипта-обертки adduser, а пользователи, созданные командой useradd, почему-то получали отлуп при входе на FTP, несмотря на верное имя пользователя и пароль (и прочих верных параметрах). Хотя и adduser (хоть и переспрашивая) и useradd (ничего не спрашивая) позволяли отключить пользователю FTP оболочку, задав вместо нее /bin/false. Так и не понял, какую магию добавлял скрипт-обертка, хотя параметры утилиты useradd были идентичными

Примечание. Забегая вперед, скажу, что у PureFTPd есть замечательный механизм виртуальных пользователей. Он позволяет не плодить в системе кучу Linux-пользователей, которым нужно обеспечить доступ к FTP, а вместо этого создать всего одного, из-под которого будет работать сколь угодно виртуальных. Необходимые параметры виртуальным пользователям (имя, пароль, рабочий каталог FTP, объем выделенного дискового пространства, скорость закачки файлов) задаются с помощью утилиты pure-pw, входящей в пакет PureFTPd, ею виртуальные пользователи также добавляются и удаляются.

ВАЖНО! Далее приводится инструкция по минимальной настройке FTP-сервера для дома или малого офиса. Настоятельно рекомендуется ознакомиться с полной версией инструкции к PureFTPd, если вы хотите открыть доступ к нему в Интернет и других общедоступных сетях, а также с инструкцией, как обеспечить работу FTP с шифрованием трафика (FTP через SSL).

Подготовка системы к настройке FTP-сервера

Итак, приступим. Естественно, все делается через консоль под root

1. Проверяем наличие строки /bin/false в файле /etc/shells
2. Устанавливаем PureFTPd. Лично я установил его с помощью sbopkg, без дополнительных параметров при сборке пакета. Все заработало.
3. Создаем группу для пользователей FTP:

groupadd ftpgroup

где:
ftpgroup — название группы для пользователей FTP, можете вместо ftpgroup вписать любое уникальное название группы. Уникальное — значит, такой группы в системе не должно быть.

4. Создаем Linux- (системного, реального) пользователя для FTP. Этому пользователю для пущей безопасности (и корректной работы с виртуальными пользователями FTP) следует отключить командную оболочку и задать несуществующий домашний каталог. Добавляем нового пользователя в систему командой useradd:

useradd -g ftpgroup -d /dev/null -s /bin/false ftpuser

где:
-g ftpgroup — указывается группа пользователя, необходимо вместо ftpgroup подставить ту, которую вы задали для пользователей FTP-сервера.
-d — указание домашнего каталога, данному пользователю он не нужен, посему указываем /dev/null
-s
— указание командной оболочки, используемой данным пользователем. Пользователь сам входить в систему не должен (и не будет для пущей безопасности), посему отключим ему доступ к командной оболочке, указав в данном параметре /bin/false
ftpuser — имя пользователя, можете выбрать любое по зову сердца, почек и печени.

Если что-то сделано неверно, всегда можно удалить пользователя в системе командой userdel имя_пользователя,а группу командой groupdel название_группы. Сведения об этих командах являются общими для всех дистрибьютьвов Линукс, кроме специальных, посему не буду останавливаться на них подробнее.

Настройка PureFTPd

Сам демон FTP-сервера, будучи довольно универсальным для любых Linux- и даже Windows-based операционных систем сделан по принципу максимальной переносимости, посему он не признает as is конфигурационных файлов или конфигурационных каталогов. Для удобства пользователей разработчики (или сборщики) пакетов предусмотрели, что демон будет запускаться не напрямую, а через инициализационный скрипт, различный для конкретной ОС или ее дистрибьютива. Поэтому, если вы пользуетесь инициализационным скриптом, то способ конфигурирования будет различен для, например, Debian/Ubuntu или Slackware. Вы всегда можете обойти эти ограничения, запустив демон напрямую, и передав ему конфигурацию в соответствующих параметрах командной строки. НО в данной заметке такой способ не рассматривается, для управления (запуска, проверки статуса, остановки) демона, используется поставляемый в пакете для Slackware инициализационный скрипт, анализирующий соответствующий конфигурационный файл, разбирающий его и передающий конфигурацию демону.

Скрипт запуска: /etc/rc.d/rc.pure-ftpd
Его параметры: /etc/rc.d/rc.pure-ftpd start запуск FTP-сервера
/etc/rc.d/rc.pure-ftpd stop остановка FTP-сервера
/etc/rc.d/rc.pure-ftpd restart перезапуск FTP-сервера

Файл конфигурации: /etc/pure-ftpd/pure-ftpd.conf

Можно много чего отконфигурировать, подключить базы MySQL или Постгресс, устроить аутентификацию через LDAP, установить квоты, но всего этого я делать не буду, если кому надо — конфигурационные файлы замечательно откомментированы, а подробных мануалов в сети есть. Комментарии в оригинале на буржуйской мове, но там даже ребенок через гугль-транслейт переведет. Я буду делать, повторяюсь, домашний сервер с виртуальными FTP-пользователями.

В файле конфигурации, раскомментируя соответствующие строчки, или заменяя yes на no (или наоборот), настраиваем следующие параметры:

#Не позволять пользователю выходить за пределы домашнего каталога
ChrootEveryone yes

#Отключить режим совместимости с "неправильными клиентами". Мне такие не попадались.
BrokenClientsCompatibility no

#запускать в режиме демона
Daemonize yes

#подробный LOG, можно поставить в no, если все работает, а FTP сильно загаживает логи
VerboseLog yes

#Анонимы дома не нужны (установка в yes включает полностью анонимный доступ к FTP)
AnonymousOnly no

#Отключаем возможность соединяться анонимно
NoAnonymous yes

#ОБЯЗАТЕЛЬНО раскомментируем эту строчку, задаем путь к базе данных виртуальных пользователей (можно путь не задавать, оставив, как есть)
PureDB /etc/pure-ftpd/pureftpd.pdb

#Обязательно комментируем эту строчку (или ставим соответствующее значение в no)
# PAMAuthentication yes

# и эту тоже комментируем, нефиг FTP соваться в системный файл аутентификации - пусть сам рулит виртуальными пользователями, которые специально для FTP
# UnixAuthentication yes

#автоматическое создание домашней директории для пользователя (при первом заходе на сервер)
CreateHomeDir yes

#использовать только IPv4, вряд ли в домашней или сети мелкого офиса нужен IPv6
IPV4Only yes

Готовый конфиг можно скачать здесь . Или посмотреть на PasteBin

Добавление виртуального пользователя

Делается это следующей командой:
pure-pw useradd miguel -u ftpuser -g ftpgroup -d /home/ftp/files
где:
useradd — команда добавления виртуального пользователя
miguel — имя виртуального пользователя, будет использоваться FTP-клиентом для подключения к FTP-серверу. Естественно, можно придумать свое.
-u ftpuserреальный linux-пользователь, под которым будет работать данный виртуальный (см. выше).
-g ftpgroup — группа пользователей FTP-сервера (см. выше)
-d /home/ftp/files — директория для создаваемого виртуального пользователя. Если параметр CreateHomeDir в конфигурационном файле сервера не закомментирован и установлен в yes, то директория будет создана автоматически при первом входе данного пользователя через FTP-клиент.

После выполнения команды будет предложено ввести пароль для виртуального пользователя.

Можно создать неограниченное количество виртуальных пользователей, работающих из под одного реального с разными каталогами. Если установлен в yes параметр ChrootEveryone, то виртуальные пользователи не смогут перейти в каталоги других виртуальных пользователей, соответственно, мы можем наделать персональных директорий в FTP хоть для каждого устройства/конкретного пользователя, меняя только имена, пароли и домашние каталоги.

Примечание: Когда нужно дать доступ к одному и тому же каталогу нескольким пользователям, то просто в команде создания пользователя, после параметра -d указывается одинаковый путь.

ВАЖНО! После любых изменений (добавления, удаления, смены пароля, и т.д.) виртуальных пользователей, необходимо выполнить команду обновления/создания базы виртуальных пользователей:

pure-pw mkdb

Создание пользователя только для чтения

Иногда полезно иметь пользователя, способного только читать что-либо с FTP-сервера, но не имеющего возможности на него что-нибудь писать. Представим себе такую гипотетическую ситуацию, есть Миша, который завел себе домашний FTP-сервер, на нем виртуального пользователя под именем miguel, но к нему домой приходит множество друзей с ноутбуками, планшетами и прочими устройствами. На FTP-сервере хранятся фотографии Миши, но он не хочет, чтобы друзья пририсовали ему усы на этих фото. Как же быть?

1. Предположим, что пользователь для чтения-записи (в нашем случае miguel) уже создан, и он уже совершил вход и загрузку хотя бы одного файла через FTP-клиент, соответственно каталог создан, и права на него уже установлены в 755, иначе потом вручную придется переставлять права.
2. Создаем второго реального пользователя в группе ftpgroup:

useradd -g ftpgroup -d /dev/null -s /etc ftpuserread

3. Создаем виртуального пользователя, имеющего права только на чтение общего каталога с пользователем ftpuser (и соответственно, с виртуальным пользователем miguel, работающим в реальной системе из под соответствующего реального пользователя):

pure-pw useradd friends -u ftpuserread -g ftpgroup -d /home/ftp/files

4. После изменения виртуальных пользователей не забудьте выполнить команду

pure-pw mkdb

В процессе создания пользователя friends можно задать для него пустой пароль, тогда получится псевдо-анонимный доступ. Друзьям можно дать имя пользователя, и они на FTP-сервер смогут войти без пароля (введя в своих FTP-клиентах пустую строку), а враги, гады, ведьма-соседка и рептилоиды из SCP будут долго подбирать имя пользователя, или же гоняться за всей вашей компанией с паяльниками. 🙂

Смена пароля для виртуального пользователя FTP

Для смены пароля используем следующую последовательность команд:

pure-pw passwd miquel
pure-pw mkdb

где:
pure-pw passwd miquel — команда смены пароля, вместо miquel необходимо подставить имя нужного виртуального пользователя FTP, пароль будет предложено вести, символы не отображаются.
pure-pw mkdb — обновляем базу данных.

Другие часто используемые команды

pure-pw list — список виртуальных пользователей
pure-pw show username — подробная информация о пользователе, вместо username подставить существующее имя виртуального пользователя
pure-pw userdel username — удаление виртуального пользователя, вместо username подставить существующее имя виртуального пользователя

Краткую инструкцию по командам можно получить, запустив утилиту управления пользователями (pure-pw) с ключом --help

После каждой операции с виртуальными пользователями не забываем выполнить команду обновления базы:
pure-pw mkdb

Источники

1. Установка и настройка Pure-FTPD (Pure FTP) [Копия в PDF]
2. Официальный мануал PureFTPd
3. Slackbook
4. Не помню.

Скачать эту заметку в формате PDF

Как сделать загрузочный ISO-образ CD диска в Linux

Конечно, CD и DVD диски потихоньку выходят из обращения, но иногда еще нужны.
Сделать загрузочный образ диска в Linux очень просто.

1. В удобном месте создаем директорию iso_root, в ней будут лежать все файлы, которые хотим поместить на загрузочный диск.
2. Копируем в директорию iso_root нужные файлы.
3. Скачиваем загрузчик. Я воспользовался ISOLINUX из пакета загрузчиков SYSLINUX. Можно скачать нужную версию загрузчика вручную на https://www.kernel.org/pub/linux/utils/boot/syslinux, и распаковать полученный архив во временную папку, а можно воспользоваться готовым скриптом:

#!/bin/bash

SYSLINUXNAME="syslinux-4.02"
SYSLINUXADDR="https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/$SYSLINUXNAME.tar.gz"
WORKDIR="/tmp"

cd $WORKDIR
wget $SYSLINUXADDR
tar -xf "$SYSLINUXNAME.tar.gz"
cd "$SYSLINUXNAME/"

Скрипт скачает нужную версию SYSLINUX (я использовал 4.02) в директорию /tmp и распакует архив в каталог /tmp/syslinux-4.02.
Весь загрузчик нам не понадобится, поэтому скопируем в директорию iso_root только нужные файлы:
isolinux.bin — собственно, загрузчик ISOLINUX
menu.c32 (или vesamenu.c32) — файл, отображающий меню загрузочного диска, vesamenu.c32 если мы хотим сделать красивое графическое загрузочное меню
chain.c32 — утилита, передающая управление другим загрузчикам, например, загрузчику, расположенному на жестком диске.
reboot.c32 — утилита, перезагружающая компьютер, нужна, если мы хотим предусмотреть возможность перезагрузки из меню загрузочного диска.
memdisk — программа, распаковывающая в память образы (в т.ч. и сжатые архиватором gzip) жестких дисков, дискет.
Примечание: загрузчик SYSLINUX — операционная система в миниатюре, а файлы *.c32 — исполняемые загрузчиком программы.

4. Конфигурируем загрузчик и загрузочное меню. Загрузчик ISOLINUX ищет в том каталоге, в котором расположен, конфигурационный файл isolinux.cfg, содержащий описание меню и конфигурацию загрузки.
Для примера я создал тестовый образ диска при заргузке с которого можно передать загрузку на первый жесткий диск компьютера, перезагрузить его или загрузить образ дискеты с DOS (позже расскажу для чего его делал и как). Содержимое конфигурационного файла isolinux.cfg таково:

ui menu.c32
PROMPT 0


menu title Test disk

label bootlocal
	menu label Boot From Hard Drive
	kernel chain.c32
	append hd0 0
	timeout 1000

label dos
	menu label Minimal DOS system
	kernel memdisk
	initrd dos/dos.gz
	append harddisk

label reboot
	menu label Reboot Computer
	kernel reboot.c32


Команда ui menu.c32 вызывает обработчик меню, menu title устанавливает его заголовок, далее идут описания пунктов загрузочного меню.
С label <имя> начинается описание пункта меню, menu label задает текст, выводимый в качестве пункта загрузочного меню. Команда kernel дает команду загрузить ядро Linux или другое поддерживаемое ядро (в нашем случае memdisk) или команду c32, вместо команды kernel можно использовать команду linux, если загружать ядро Linux или C32, если загружать специальную команду SYSLINUX. Команда initrd позволяет подгрузить образ начального диска Linux [ССЫЛКА] или образ диска или CD, загружаемый memdisk‘ом. Команда append передает ядру или команде дополнительные параметры. Команда timeout устанавливает время, после которого будет автоматически выбран в случае бездействия пользователя соответствующий пункт меню. Число после timeout задает время. За 1 единицу принята 0,1 с (соответственно, указанная в меню 1000 — 100 секунд).

5. Выходим из каталога iso_root на уровень выше и cоздаем ISO-образ. ISO-образ создается программой mkisofs
mkisofs -o disk.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R -V LABEL iso_root
где:
-o — задает имя образа диска (в примере disk.iso)
-b — имя загрузчика
— задает имя загрузочного каталога, файл создается автоматически, формально не нужен, но лучше оставить.
-no-emul-bootОпределяет, что используемый образ загрузки для создания загрузочного диска является образом без эмуляции. Система будет загружать и исполнять этот образ, не выполняя никаких операций по эмуляции диска. [1]
-boot-load-size количество_секторовОпределяет номер «виртуальных» (по 512 байт) секторов для загрузки в режиме без эмуляции. По умолчанию загружается весь файл загрузки целиком. Некоторые BIOS могут воспринимать их с ошибкой, если их количество не будет кратно 4. (ИМХО, лучше 4 и оставить)
-J — создает записи каталогов Joliet (см. мануал по ссылке в конце заметки, чтобы узнать, надо ли оно вам, но обычно рекомендуют указывать этот параметр).
-V метка — задает метку тома
После параметров указывается имя каталога с содержимым CD-диска (iso_root в примере).

Вот как выглядит меню диска, если с него загрузиться

Если надо создать несколько образов, процесс можно автоматизировать нехитрым скриптом. Метку тома можно указать в качестве первого параметра скрипта, иначе будет установлена метка bootable
На Pastebin
Скачать с Mega.nz

Готовый тестовый образ можно скачать отсюда

Используемые источники

1. Перевод man mkisofs
2. ISOLINUX
3. SYSLINUX MEMDISK

Запускающий скрипт для tinyproxy

Ставил я не так давно простой и легкий прокси-сервер tinyproxy, и с удивлением не обнаружил в комплекте запускающего (инициализационного) скрипта.
Что это за зверь такой, если кто не знает. Ко многим демонам в Linux в комплекте идет инициализационный скрипт, позволяющий демона запустить, «убить» или перезапустить из консоли командой вида daemonname start (stop, restart) без необходимости вручную отлавливать идентификатор процесса, убивать его командой kill и проверять, завершен ли процесс (или наоборот, стартовал ли он). К squid, например, такой скрипт идет, называется (в Slackware) rc.squid и лежит в /etc/rc.d, а к tinyproxy в комплекте не шло, но написать его оказалось не так и сложно.
Итак, скрипт будет получать из командной строки единственный параметр с командой:
start — запускать прокси-сервер
stop — останавливать его
restart — перезапускать (останавливать, а после остановки запускать)
status — отображать, запущен или не запущен прокси.

Определяем основные переменные
#!/bin/bash

PIDFILE="/home/provproxy/tinyproxy.pid"
TINYPROXYCMD="/usr/sbin/tinyproxy"
PIDVAL=0
WTIMEOUT=30
OK=0

CH_S[0]='-' #pseudographic items
CH_S[1]='/'
CH_S[2]='|'
CH_S[3]='\'
ITEM_ARR=0 #current item counter

PIDFILE — переменная, в которой указан PID-файл, файл, содержащий идентификатор основного процесса прокси-сервера. Tinyproxy при запуске создает сразу несколько процессов, позволяющих ему распараллеливать свою внутреннюю работу. Минимальное и максимальное число таких процессов задается в конфигурационном файле /etc/tinyproxy.conf параметрами MinSpareServers и MaxSpareServers, а процесс, идентификатор которого указан в PID-файле основной, управляющий. Ему можно послать сигнал, например, командой kill, и все остальные процессы тоже завершатся. Местоположение PID-файла также указывается в файле /etc/tinyproxy.conf в параметре PidFile. Конечно, правильнее читать сам конфигурационный файл, и выдергивать значение параметра оттуда, ну да ладно, параметр этот перенастраивается нечасто, посему пусть такое решение останется на моей совести -=^_^-=.
TINYPROXYCMD — путь к исполняемому файлу прокси-сервера
PIDVAL — здесь будет храниться значение PID, полученное из PID-файла.
WTIMEOUT — максимальное время ожидания запуска tinyproxy, или его завершения.
OK — флаг, принимающий значение 1 в случае успешного запуска/завершения, или 0 — в случае неуспеха. Вообще-то, можно и без него обойтись, но мне с ним удобнее и нагляднее.

CH_S[0] - CH_S[3], массив с псевдографическими элементами, для украшательства, отображения хода процесса запуска. Подробности про украшательства тут или тут , и если кому не надо, выбросить лишние команды из скрипта — дело нехитрое. Переменная ITEM_ARR предназначена для тех же целей.

Функции

Далее, определим в скрипте несколько функций.

см. описание функций под катом

Проверка параметров.

Проверять параметры будем при помощи оператора case, после объявления функций.
case "$1" in
    start)
	start_proxy
	;;
    stop)
	stop_proxy
	;;
    restart)
	restart_proxy
	;;
    status)
	status_proxy
	;;
    *)
	echo "Usage: $0 {start|stop|restart|status}"
esac


Если первый параметр, переданный из командной строки start, stop, restart или status — выполняются соответствующие функции, если что-то еще (*) — выводим краткую справку по использованию скрипта. В списке источников в конце заметки есть ссылка на более подробное описание оператора.

Статус процесса

Получается функцией process_status(). Вот ее код:
    #Получаем PID
    if [ -e $PIDFILE ];then #если файл существует
	PIDVAL=`cat $PIDFILE` #читаем PID
	TMPGREP=`ps -p $PIDVAL|grep "tinyproxy" -c` #процесс запущен - 1 иначе 0
	if [ $TMPGREP -ge 1 ];then #процесс запущен
	    return #выходим из функции
	else #pid-файл есть, процесса нет
	    rm $PIDFILE #удаляем pid-файл
	fi
    fi
    PIDVAL=0


Сначала проверяется наличие PID-файла, если он существует, отправляем его содержимое (конструкция «), прочитанное с помощью команды cat в переменную PIDVAL, далее, запрашиваем информацию о процессе (ps) по его PID (ключ -p). Если процесс существует, команда ps отправит на стандартный вывод что-то типа:

PID TTY TIME CMD
2100 ? 00:00:00 tinyproxy

А если процесса не существует:

PID TTY TIME CMD

Далее, этот вывод передается команде grep, которая фильтрует строки с именем искомого процесса (tinyproxy) и подсчитывает их количество (ключ -c). Если строк 1 процесс с данным PID существует, если 0 — процесса нет.
Если PID-файл существует, то в переменной $PIDVAL остается идентификатор процесса и происходит выход из функции

[...]
if [ $TMPGREP -ge 1 ];then #процесс запущен
	    return #выходим из функции

[...]


Если PID-файл существует, а процесс с данным PID не обнаружен, значит в PID-файле указан не тот PID, что, в большинстве случаев, может произойти из-за падения программы (с tinyproxy это случается довольно редко), либо из-за общего системного сбоя вызванного, например, отключением питания. Поэтому стоит PID-файл удалить.
Если процесс не обнаружен, или PID-файл не найден, то происходит выход из всех условных конструкций и переменной $PIDVAL присваивается значение 0
[...]
PIDVAL=0
[...]

Таким образом, если процесс существует, то в переменной $PIDVAL будет присутствовать его идентификатор, если не существует — значение 0.

Примечание о безопасности и стабильности использования PID-файлов
. Конечно, есть более универсальный способ найти процесс не обращаясь к PID-файлу, например, получить список процессов командой ps ax и отgrep’ать его, найдя нужное нам имя, и, если надо, то завершить его командой pkill имя_процесса, и данный способ весьма неплохо будет работать с тем же tinyproxy.
Но tinyproxy — это просто web-прокси сервер, и неизвестно, что произойдет, если применить такой метод, например, к серверу баз данных. Возможно, какие-то транзакции не завершатся, порушится сама база. Поэтому, информации, сохраняемой программами в PID-файлах, стоит доверять. Безопасность их использования и контроль доступа к ним других пользователей должны решаться другими средствами ОС. Посему я не вижу смысла загромождать скрипт дополнительными проверками.
За пояснение благодарю [info]ketmar@ljr

Отображение статуса tinyproxy

Если функция process_status() используется для получения статуса (и PID) процесса для внутренних целей скрипта, то функция status_proxy() выводит информацию пользователю. И хоть она очень проста, но лучше вынести ее отдельно, дабы не смешивать взаимодействие с пользователем со внутренней механикой программы.

Вот код этой функции:

status_proxy()
{
    process_status
    if [ $PIDVAL -eq 0 ]; then
	echo "Tinyproxy not running"
    else
	echo "Tinyproxy running [PID=$PIDVAL]"
    fi
}


Как я и говорил, функция очень проста, сначала вызывается функция process_status, и если в переменной $PIDVAL значение 0, то выводится сообщение о том, что tinyproxy не запущен, иначе, что запущен и дополнительно выводится его PID.

Запуск прокси-сервера

Выполняет его функция start_proxy(). Вот ее код:
см. код и описание функции под катом

ПРИМЕЧАНИЕ:
Если прокси не запускается, то для поиска неисправности удобно запустить прокси-сервер с ключом -d
tinyproxy -d
В таком случае прокси запустится не в виде фонового процесса (демона), а в виде обычного, и выдаст ошибки на консоль. Например, если на файерволе закрыты порты, необходимые серверу, будет выведено сообщение:
tinyproxy: Could not create listening socket.

Остановка прокси-сервера

За остановку прокси-сервера отвечает функция stop_proxy(). Ее код:
см. код и описание функции под катом

Перезагрузка прокси-сервера.
Тут вообще все просто.
1. Запускаем функцию остановки stop_proxy.
2.
Сбрасываем флаг: $OK=0
Выполняем функцию запуска start_proxy

Вот нехитрый код функции restart_proxy():

restart_proxy()
{
    stop_proxy
    OK=0
    start_proxy
}

Скачать скрипт

С Pastebin
С Mega.nz

Список источников

1.Bash. Функции.
2.Возврат значений из функции
3.Оператор case
4.Tinyproxy
5.Коды завершения, имеющие предопределенный смысл

Чиним поддержку криптографии и ошибку при запуске tcplay в Puppy Slacko 5.5. Часть III

Преамбула

Этот способ несколько сложнее, но ненамного.
Что сделаем:
1. Пересоберем ядро с поддержкой криптографии
2. Встроим tcplay в основную систему, т.е. после наших манипуляций он будет доступен «из коробки»
Преимущества:
— Не надо больше ничего делать
Недостатки:
— Способ требует больше движений
Начало
Тут я забегу немного вперед, и скажу, чтоб наше ядро (и соответственно далее Puppy Linux) запустился корректно, нам будет необходима поддержка UnionFS в ядре. На официальном сайте UnionFS я не нашел патч для поддержки UnionFS для версии оригинального ядра 3.2.33, поэтому выбрал ближайший патч для ядра версии 3.2.62 и, соответственно, решил изменить оригинальную версию ядра. На самом деле я долго, местами методом тыка пытался подружить оригинальное ядро с патчем для других версий, но не получилось, чтоб не загружать заметку, оставлю путь за кадром.
Если мы скомпилируем ядро без патча UnionFS, то при запуске операционной системы мы получим примерно такую картинку:

Подготовка
Нам необходимы:
1. Исходники ядра, которые можно взять здесь
2. Патч для поддержки UnionFS для новой версии ядра
3. Комплект разработчика, для соответствующей версии Puppy Linux, если мы будем собирать ядро в ней, или же «большой» Linux, в котором есть все нужные инструменты. (см. предыдущую заметку )
4. Комплект для работы со SquashFS, чтоб разобрать основной файл Puppy Linux Slacko, добавить туда, что нам надо, собрать обратно и оттестировать. Я на «большом» Линуксе просто скачал squashfs-tools-4.2 через sbopkg, но кому мало ли надо, вот оф. сайт
Внимание! Если собирать ядро в Puppy, то следует делать это на внешнем разделе, на котором имеется достаточно места, не следует собирать ядро в стандартных директориях, изменения в которых сохраняются в персональный файл. В противном случае место в файле сохранения и оперативная память быстро кончатся и процесс может до конца и не дойти.
Я собирал новое ядро для Puppy в «большом» линуксе.
Приступаем

1. Распакуем исходники ядра в отдельную директорию.
2. Скопируем в эту директорию патч для поддержки UnionFS
3. Распакуем его командой gunzip unionfs-2.6_for_3.2.62.diff.gz
4. Применим патч
patch -p1 -i <имя файла заплатки>
т.е. для нашего случая
patch -p1 -i unionfs-2.6_for_3.2.62.diff
Конфигурирование

Вообще это самый большой, больной и неоднозначный вопрос при сборке ядра, посему тут мне придется отослать читателя к более подробному и обстоятельному материалу, ссылки на который будут в конце заметки.
Я же остановлюсь только на некоторых моментах, которые непосредственно важны для нашей задачи.
Итак, у меня имелся в наличии готовый конфиг (который можно скачать здесь), и я подправил в нем только некоторые моменты
Во-первых, копируем файл .config в директорию с исходниками ядра.
Во-вторых, открываем в любом удобном текстовом редакторе файл Makefile, находящийся в директории с исходниками, ищем в нем 4 строчку сверху: EXTRAVERSION= и дописываем туда, что-нибудь типа -pcry (Puppy с поддержкой криптографии). Эта настройка добавит к имени ядра соответствующий постфикс, и кто-нибудь, случайно скачавший мое изделие, будет знать, что ядро не нативное, и возможно в нем работает криптография, но что-нибудь другое важное отвалилось :))
Наконец, запускаем конфигурирование командой
make menuconfig
Далее идем в раздел Cryptographic API и устанавливаем переключатели так, как это указано на нижеследующих картинках.
1 2 3
Далее идем в File systems и обязательно включаем в ядро поддержку Ext2, Ext3 и Ext4 файловых систем
В разделе File systems ищем подраздел Miscellaneous filesystems, заходим в него и проверяем, чтобы Union file system, был встроен в ядро <*>, а также проверяем, что в ядро встроена SquashFS 4.0
1 2 3
Собираем ядро

В директории с исходниками запускаем команду make bzImage
И идем пить чай, или водку. Возможно, с учетом скорости работы компьютера, и из самовара.
Далее собираем модули
make modules
И опять идем пить из самовара
На сборку ядра на селероне с 2.2 ггц тактовой частоты и 1 Гб оперативной памяти ушло 15 минут, а модули собирались час.
Подготавливаем ОС.

Внимание! Операции по подготовке ОС, разборке главного файла, его сборке и внедрению новых программ лучше выполнять из под root, чтоб не слетели права на некоторые системные файлы.
Команды make modules_install и make install также выполняются с правами root
1.Сначала разбираем основной файл slacko 5.5. — puppy_slacko5.5.sfs
2.Качаем необходимые пакеты LVM2, tcplay и Multipath tools. Ссылки здесь
3.Распаковываем пакеты, каждый в отдельную директорию
4. Копируем файл puppy_slacko_5.5.sfs в отдельную директорию, и, что называется, разбираем на запчасти, точнее распаковываем.
unsquashfs puppy_slacko_5.5.sfs

Образуется директория squashfs-root с содержимым sfs-файла
5.Теперь соберем все модули в одну кучу, на «большом» Линуксе это проблемы не представляет, а вот на Puppy должно хватить места в файле сохранения.
Переходим в каталог с исходниками ядра и выполняем команду
make modules_install
Если вы работаете не через удаленный терминал, то направьте вывод команды в текстовый файл:
, например
make modules_install >/mnt/sdb1/kernel/ok/out.txt
6.Создаем отдельный каталог (что-нибудь типа /mnt/sdb1/kernel/ok), в нем подкаталог lib, а в подкаталоге lib подкаталог modules и копируем в него каталог 3.2.62-pcry из /lib/modules
Дальше идет небольшой геморрой, надо скопировать все собранные Firmware-модули. Что это такое, можно прочитать, например тут. Поскольку я делал все манипуляции на удаленном компьютере через терминал, я просто скопировал из окна терминала нужные мне данные (они есть в выводе команды make modules_install) и написал 2 скрипта, облегчающих мне работу.
Нужная мне часть из вывода команды
Первый создает в моем рабочем каталоге нужную мне структуру подкаталогов (запускается в /mnt/sdb1/kernel/ok/lib/firmware), а второй копирует нужные файлы.
7. Подготавливаем новый sfs-файл, в директорию squashfs-root копируем (далее все пути относительно squashfs-root)
-Директорию 3.2.62-pcry в lib/modules (и удаляем из lib/modules 3.2.33-4g)
-Директорию firmware в lib и при необходимости заменяем нужные файлы
-Из распакованных пакетов копируем в корень squashfs-root все директории со всеми файлами, кроме директорий install
-Создаем в каталоге squashfs-root 3 скрипта 1 2 3, это doinst-скрипты, можно скопировать их из директорий install соответствующих пакетов, им нужно поставить права на исполнение и выполнить, после чего их можно удалить.
8. Выходим из squashfs-root и собираем основной файл Puppy Linux
squashfs-root puppy_slacko_5.5.sfs

Установка нового ядра и главного файла

1. Делаем копию puppy_slacko_5.5.sfs и файла ядра vmlinuz
2. Если вы работали в "большой" ОС, также стоит сделать копию каталога /boot и конфигурации загрузчика
3. Копируем новый главный файл на место предыдущего (он будет немного больше прежнего по размерам, это нормально).
4. Переходим в каталог с исходниками ядра и выполняем команду make install
5. Копируем из /boot vmlinuz вместо файла vmlinuz оригинального Puppy и при необходимости восстанавливаем /boot и конфигурацию загрузчика.
Если что-то не получилось

Или же что-то не устраивает, то всегда можно ядро подправить, пересобрав заново с нужными опциями. Итак, чтобы "вернуть все в зад" нужно:
1. Перейти в каталог с исходниками ядра и скопировать куда-нибудь файл .config, чтобы потом не выполнять конфигурирование заново.
2. Ввести команду make mrproper (Эта команда нужна для удаления временных файлов, созданных при предыдущей сборке. Она удаляет также все настройки, которые Вы сделали во время прошлой сборки.)
Вернуть .config обратно, снова запустить make menuconfig, отконфигурировать заново и запустить make bzImage (ну или make modules, если косяк связан с каким-то модулем, а не с настройкой ядра). Можно отдельно независимо пересобирать ядро и модули (и даже не все модули целиком, а только некоторые из них) если вы знаете, в каком конкретно модуле косяк. Патчи ядра сохраняются и после выполнения очистки.
Небольшая неудача с loglevel

У меня так и не получилось штатными средствами сбросить Default message log level при сборке ядра на уровень 0, как это походу было сделано в оригинальном ядре, и при загрузке выскакивали лишние сообщения ядра, портившие оригинальную красивую загрузку Puppy, патчить ядро я не решился (чтоб чуть что все таки можно было посмотреть вывод ошибок), и просто оставил уровень по умолчанию. А эстетичную загрузку можно вернуть, дописав loglevel=0 в качестве параметра ядра при загрузке, в настройке загрузчика:
kernel /slacko/vmlinuz ro vga=normal loglevel=0

Готовый дистрибутив

Можно скачать тут Puppy Slacko 5.5. NonPAE Crypto Mod

Использованные источники

1. Ставим ядро 2.6, или Ядерная физика для домохозяйки. Версия 2.0 Копия
2. Сборка ядра linux 3.4.* Копия
3. Работаем с модулями ядра в Linux Копия
4. Debugging by printing

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/328027.html
Прокомментировать заметку можно по ссылке выше.

Чиним поддержку криптографии и ошибку при запуске tcplay в Puppy Slacko 5.5. Часть II.

Преамбула
Что сделаем:
— Встроим tcplay, сопутствующие утилиты и необходимые модули в основной файл Puppy Slacko, чтоб tcplay был доступен «из коробки».
Плюсы:
— tcplay и недостающие криптографические модули будут работать из коробки, даже если файл сохранения с соответствующими изменениями испортился/потерялся.
Минусы:
— способ требует больше движений, но все-таки меньше, чем, если полностью пересобирать ядро.
— немного увеличится размер главного файла.
Что требуется.

1. Предварительно собранные модули для PAE или Non-PAE версии Slacko. См. соответствующую здесь
2. «Большой» Linux или Puppy с комплектом разработчика.
3. Комплект для работы со SquashFS, чтоб разобрать основной файл Puppy Linux Slacko, добавить туда, что нам надо, собрать обратно и оттестировать. Я на «большом» Линуксе просто скачал squashfs-tools-4.2 через sbopkg, но кому мало ли надо, вот оф. сайт
4. Необходимые пакеты LVM2, tcplay и Multipath tools. Ссылки здесь
5. Скрипт, загружающий модули.
Примечание: ниже описанным образом можно встроить и другие программы, которые недоступны из коробки, только не переусердствуйте, чтоб сильно не раздуть главный файл sfs.
Начинаем

Внимание! Операции по подготовке ОС, разборке главного файла, его сборке и внедрению новых программ лучше выполнять из под root, чтоб не слетели права на некоторые системные файлы.
Примечание:
придется много чего распаковывать, копировать, пользуйтесь mc для удобства
1. Помещаем главный файл puppy_slacko_5.5.sfs в отдельный каталог и распаковываем командой unsquashfs puppy_slacko_5.5.sfs. По окончании процесса, в каталоге образуется подкаталог squashfs-root с содержимым sfs-файла.
2. Если вы скачали готовые модули, то просто распакуйте в каталог squashfs-root каталоги bin и lib из архивов, при необходимости заменяя файлы. Если вы сами собирали модули, руководствуясь предыдущими заметками, скопируйте их в подкаталог lib/modules/XXX.XXX.XXX/kernel/crypto подкаталога squashfs-root где XXX.XXX.XXX — версия ядра, а также создайте в подкаталоге bin скрипт tcplay-mod:

#!/bin/bash
echo "Loading modules..."
modprobe lrw
modprobe xts
modprobe cbc
modprobe rmd160
modprobe sha256
modprobe wp512
modprobe aes
modprobe serpent
modprobe twofish
modprobe dm-crypt
echo "Complete!"
И назначьте ему права на исполнение
3. Модифицируйте файл squashfs-root/etc/rs.d/rs.local дополнив его командой /bin/tcplay-mod >/logmod, если вы не используете файерволл Puppy, закомментируйте предыдущую строчку. Вывод процесса загрузки модулей будет происходить в файл /logmod, при необходимости это можно будет использовать для отслеживания ошибок при запуске модулей.
4. Назначьте файлу squashfs-root/etc/rs.d/rs.local права на исполнение.
5. Распакуйте в отдельный каталог пакет поддержки LVM2
6. Скопируйте из этого каталога все подкаталоги, кроме подкаталога install в каталог squashfs-root
7. Скопируйте из подкаталога install в каталог squashfs-root скрипт doinst.sh
8. Установите ему права на выполнение, запустите, после чего удалите его.
9. Повторите пункты 5-9 для остальных пакетов (tcplay и Multipath tools)
Готово!

Теперь обратно нужно собрать главный файл, выходим из директории squashfs-root на уровень выше и выполняем команду:
mksquashfs squashfs-root puppy_slacko_5.5.sfs
Размер полученного нового главного файла увеличился примерно на 9 мегабайт, и приблизительно мегабайт на 15 увеличится, если добавить туда отсутствующий из коробки mc и обновить некоторые плагины к Firefox.
Готовые главные файлы

Puppy_slacko_5.5.sfs (PAE)
Puppy_slacko_5.5.sfs (non-PAE, 4G)

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/327863.html
Прокомментировать заметку можно по ссылке выше.

tcplay в Puppy Slacko 5.5 (Rus). Краткая инструкция по установке и другие заметки.

tcplay в PuppyRus Slacko 5.5. Краткая инструкция по установке и другие заметки.

I. Установка

1. Скачиваем и последовательно устанавливаем:
— пакет поддержки LVM: lvm2-2.02.96-i486-4 (скачать с mega.nz) (скачать с Google Drive)
— tcplay: tc-play-2.0-i486-1 (скачать с mega.nz) (скачать с Google Drive)
— multipath tools: multipath-tools-0.5.0-i486 (скачать с mega.nz) (скачать с Google Drive). Этот пакет самому tcplay не нужен, но используется для получения доступа к разделам зашифрованного диска/контейнера, если в нем несколько разделов.
— модули ядра: для версии PAE (скачать с mega.nz) (скачать с Google Drive)
для версии без PAE (скачать с mega.nz) (скачать с Google Drive)
Для других версий Puppy модулей нет, как сделать — описано тут
2. Перезагружаемся (естественно, файл сохранения должен быть, иначе чуда не получится).
3. Добавляем в автозагрузку /bin/tcplay-mod
— либо создав символическую ссылку на /bin/tcplay-mod в /root/Startup (но тогда tcplay будет корректно работать только при загрузке X)
— либо дописав строчку /bin/tcplay-mod в /etc/rc.d/rc.local и установив rc.local права на исполнение
— либо вместо добавления в автозагрузку /bin/tcplay-mod можно указать запуск нужных модулей в BootManager, как это описано тут.
4. Заново перезагружаемся. После перезагрузки tcplay должен работать корректно
II. Подключение контейнера. Пример команд и вывода.

# losetup -f
/dev/loop2
# losetup /dev/loop2 /mnt/sdb1/test.disk
# tcplay --map=test --device=/dev/loop2
Passphrase:
All ok!
# mkdir /mnt/test
# mount -t ext2 /dev/mapper/test /mnt/test

Подробно, как работать с файлами-контейнерами tcplay описано тут
III. Отключение контейнера. Пример команд.
# umount /mnt/test
# tcplay --unmap=test
# losetup -d /dev/loop2
IV. «Лишние» диски в Puppy

При подключении контейнера tcplay на рабочем столе могут появиться «лишние» диски с названиями вроде dm-0:

Так вот, не нужно их трогать и открывать, потом могут возникнуть проблемы с отключением, точнее отмонтированием зашифрованного диска.
Чтоб глаза не мозолили, их можно убрать, щелкнув по ним правой кнопкой и выбрав пункт «Удалить объект(ы)»

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/317718.html
Прокомментировать заметку можно по ссылке выше.

Чиним поддержку криптографии и ошибку при запуске tcplay в Puppy Slacko 5.5. Часть I.

Также возможно этот способ применим для любых урезанных дистрибьютивов, в т.ч. Live. К Puppy Slacko способ применим до последней (еще не русифицированной) версии, разработчики, раздолбаи, так до сей поры косяк и не поправили
Преамбула
На некоторых дистрибьютивах, при попытке подключения зашифрованного контейнера tcplay/TrueCrypt наблюдается следующая ошибка. tcplay вместо сообщения All ok! выдает ошибку:
device-mapper: reload ioctl on test failed: No such file or directory
При этом в логах, в сообщениях ядра присутствуют следующие записи:
Jul 26 23:18:43 puppypc15732 user.err kernel: [ 177.144795] device-mapper: table: 253:0: crypt: Error allocating crypto tfm
Jul 26 23:18:43 puppypc15732 user.warn kernel: [ 177.144798] device-mapper: ioctl: error adding target to table

Это значит, что в системе отсутствуют модули поддержки криптографии, необходимые tcplay либо TrueCrypt (оба используют системные библиотеки поддержки криптоалгоритмов), причем интересно, что в случае с tcplay шифрование проходит нормально, таким образом tcplay работает как настоящий разведчик. 🙂 Шифрует (донесения в Центр), а расшифровать не может.
Если же после установки tcplay при запуске случилась ошибка
tcplay: error while loading shared libraries: libdevmapper.so.2: cannot open shared object file: No such file or directory.
значит, в системе отсутствует поддержка lvm. Как ее установить, читайте здесь.
Попытаемся это починить. Собственно, способов починить есть два:
1. Собрать нужные криптографические модули и загрузить их
2. Пересобрать ядро с поддержкой криптографии (об этом позже).
Рассмотрим первый способ, на примере PuppyRus Slacko 5.5.
Read more…

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/317479.html
Прокомментировать заметку можно по ссылке выше.

tcplay, замена TrueCrypt для Linux. Работа с криптоконтейнерами. Часть II.

Часть II. Работа с простыми томами.
0. Создание простого тома tcplay/truecrypt
Команда для шифрования тома:

tcplay --create --device=/dev/loopX --cipher=шифр_или_каскад_шифров_через_запятую --pbkdf-prf=алгоритм --keyfile=path/to/key/file

где:
--create – указание программе создать новый шифрованный том
--device=/dev/loopX – устройство, которое требуется зашифровать, в данном случае loop-устройство с которым ассоциирован файл-контейнер.
--cipher=шифр_или_каскад_шифров_через_запятую – указание, какой алгоритм шифрования необходимо использовать, или же необходимо использовать несколько алгоритмов последовательно (они перечисляются через запятую). В настоящий момент tcplay поддерживает алгоритмы: AES-256-XTS, TWOFISH-256-XTS, SERPENT-256-XTS, таким образом, поддерживаются комбинации этих трех, двух, или одного из этих шифров, перечисленных через запятую.
В случае использования только одного из них – запятая после его указания не нужна.
Примечание: Если вы используете несколько шифров, особенно на слабой машине, то это может существенно замедлить работу компьютера. Из всех перечисленных шифров AES самый быстрый (на современных машинах он даже поддерживается на аппаратном уровне), но TWOFISH и SERPENT надежнее, хотя и медленнее.
--pbkdf-prf=алгоритм – алгоритм формирования ключа для шифрования на основе пароля. На самом деле, содержимое нашего ключевого файла тоже пароль, «ключ» в криптографии это несколько иное, но, поскольку объяснить вам всю криптографию в трех словах я не могу, отсылаю к специализированным источникам.
Кратко прочесть про PBKDF можно здесь
Вместо алгоритм надо подставить конкретный алгоритм. На данный момент tcplay поддерживает RIPEMD160, SHA512, whirpool
--keyfile=path/to/key/file – указание программе, где взять ключевой файл для шифрования. Если нужно использовать несколько ключевых файлов, то нужно указать несколько параметров --keyfile=, например:
tcplay --create --device=/dev/loop0 --cipher= TWOFISH-256-XTS --pbkdf-prf= RIPEMD160 --keyfile=/path/to/key/file01 --keyfile=/path/to/key/file02
Если ключевой файл не нужен, а достаточно пароля, вводимого с клавиатуры, параметр --keyfile не указывается. Пароль будет запрошен перед шифрованием.
Итак, предположим, что контейнер ассоциирован с устройством /dev/loop0, в качестве алгоритма шифрования мы выбрали один – AES-256, в качестве алгоритма PBKDF выбран whirlpool, а ключ находится в /keys/keyfile
Тогда команда приобретает вид:
tcplay --create --device=/dev/loop0 --cipher=AES-256-XTS --pbkdf-prf= whirlpool --keyfile=/keys/keyfile

Можно также добавить ключ --insecure-erase, тогда процесс пройдет быстрее, т.к. будет произведено затирание данных на диске. Поскольку я параноик, и в незашифрованном виде на диске ничего не храню, а свежий файл-контейнер представляет собой гигабайт нулей, то я смело его добавлю:
tcplay --create --device=/dev/loop0 --cipher=AES-256-XTS --pbkdf-prf= whirlpool --keyfile=/keys/keyfile –-insecure-erase

После ввода команды и нажатия Enter, нам предложат ввести парольную фразу и повторить ее. Если хочется кроме ключевого файла установить еще и пароль (или ключевой файл вообще не нужен), то вводим пароль и подтверждаем его, если указан ключевой файл, а пароль не нужен, жмем два раза Enter.
Далее попросят подтвердить свои действия, если все сделано правильно – отвечаем утвердительно, после чего нужно будет некоторое время подождать, пока tcplay не сгенерирует т.н. истинно-случайные числа и не завершит шифрование.
В конце процесса нам скажут All Done!, если так, значит шифрование файла-контейнера окончено.
Read more…
Начало.
Продолжение следует.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/316433.html
Прокомментировать заметку можно по ссылке выше.

tcplay, замена TrueCrypt для Linux. Работа с криптоконтейнерами. Часть I.

И просто краткие заметки от склероза.
Часть I. Общие положения.
0. Зачало.
TrueCrypt уже довольно давно почил, однако добрые люди не оставили в беде параноика и начинающего линуксоида в одном лице и форкнули создали независимую реализацию замечательного проекта. TCplay представляет собой утилиту командной строки (для Linux), поддерживающую все основные функции TrueCrypt – создание томов-криптоконтейнеров, открытие контейнеров, созданных в TrueCrypt, создание скрытых шифрованных разделов на томе с обычным шифрованным разделом, поддержку ключевых файлов и т.д.
1. Установка.
1.1. Устанавливаем src2pkg [копия статьи] с помощью installpkg (если не установлена)
1.2. Качаем исходники tcplay
1.3. В каталоге со скаченным архивом выполняем
src2pkg -C tc-play-2.0.tar.gz
и после завершения процесса получаем пакет slackware, который устанавливаем с помошью installpkg
2. Всякие мелочи

tcplay –v
или tcplay –-version – версия программы
tcplay –h или tcplay –-help или запуск без параметров – справка.
3. О генерации ключевых файлов.
Вообще, tcplay, как и TrueCrypt в качестве ключевых файлов может использовать любой файл, точнее первый его мегабайт. Так что генерировать ключевые файлы большего размера смысла не имеет. Конечно, нежелательно использовать в качестве ключевых файлов системные файлы, фотографии своего любимого кота, тещи или Джиллиан Андерсон и т.д. Есть вероятность, что злоумышленник подберет, а уж при использовании системных файлов вероятность близка к 100%.
Простейший способ сгенерировать ключевой файл – воспользоваться командой dd и устройством /dev/random
dd if=/dev/random of=/путь/к/файлу/имя_файла bs=1 count=256
Данная команда сгенерирует ключевой файл размером 256 байт.
Команда dd подробно описана, например, здесь копия
4. Подготовка файла-контейнера.
Чтобы создать новый файл-контейнер (неважно, содержащий лишь один обычный том TrueCrypt или же обычный и скрытый) нам понадобится файл нужного размера, создать его также можно при помощи команды dd:
dd if=/dev/zero of=/path/to/file/disk01.crypt bs=1024M count=1
Команда создаст файл размером 1 Гб (1024 Мб) заполненный нулями, естественно, /path/to/file/disk01.crypt нужно заменить на путь к файлу-контейнеру.
5. Представляем файл-контейнер в виде блочного устройства.
Далее, нужно сделать так, чтобы система представила созданный файл-контейнер в виде блочного устройства, проще говоря, смогла работать с ним, как с диском, для чего нужно «повесить» наш файл на петлевое устройство loop
Для начала определим первое свободное петлевое устройство:
losetup -f
В моем дистрибьютиве loop-устройства ничем не использовались, поэтому команда выдала
/dev/loop0
В других дистрибьютивах может быть и не loop0, например, дистрибьютивы Puppy Linux при загрузке занимают первых два (0 и 1) петлевых устройства, на одном из которых висит основной образ ОС, а на втором файл пользовательской сохраненки.
Вешаем файл-контейнер на свободное петлевое устройство:
losetup /dev/loop0 /path/to/file/disk01.crypt
первый параметр команды – петлевое устройство, второй – путь к файлу-контейнеру.
Продолжение

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/316329.html
Прокомментировать заметку можно по ссылке выше.

Руководство к Epson LQ-100, или лютого даунгрейдерства псто.

Товарищ нашел настоящий, живой и рабочий Epson LQ-100+, и даже картриджи к нему.
Вот специально к случаю выкладываю:
1. Инструкцию к принтеру (на немецком, у кого есть английская, будьте добры, оставьте ссылку в комментариях) [RAR, PDF, 4.2 Mb]
2. Мануалы по эскейп-командам (ESC/P2) и прочие сервисные вещи Manual Epson 9,24 pin dotmatrix printer [ZIP, PDF, 5.6 Mb]
3. Видеообзор принтера LQ-100 (кому лень гуглить затерянную инструкцию на английском или переводить с немецкого, советую):

На YouTube
4. Процесс разборки, чистки, мойки, смазки LQ-100

На YouTube

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/310267.html
Прокомментировать заметку можно по ссылке выше.

Sony Vegas 9. Как быстро получить небольшой видеофайл хорошего качества.

Проблема при использовании Vegas, с которой ко мне обращалось несколько пользователей, была в том, что выходной видеофайл, даже при небольшой продолжительности, получался довольно солидных размеров. Например, даже двухминутный ролик занимал около 400 Мб.
Vegas имеет довольно много возможностей для регулирования параметров сжатия видео, а соответственно для настройки размера и качества. Однако, начинающему пользователю довольно сложно разобраться во всем зоопарке кодеков, форматов и их настроек. Поэтому ниже я представлю быстрый, буквально в два клика, метод получения качественного, и в то же время небольшого видеофайла. Может быть способ не совсем «академичен» и «профессионален», но очень прост. В меню Файл выбираем пункт меню Создать как
В появившемся окне достаточно выбрать при создании ролика формат MainConcept AVC/AAC (mp4) со встроенным шаблоном.


Если вы делаете видео без звука, то есть возможность еще уменьшить размер. Надо при создании отключить аудио. Дело в том, что если этого не сделать, то Vegas вставит в выходной файл аудиодорожку, даже если в самом файле проекта аудиодорожек нет вообще. Она будет пустая (без звука), но, тем не менее, место в выходном файле все равно будет занимать.
Чтобы отключить аудио, нужно нажать в окне сохранения видео (рисунок выше) на кнопку Custom, в появившемся окне перейти на вкладку Аудио, и там снять галочку Включить аудио, после чего нажать OK. Окно закроется, а по нажатию кнопки Сохранить видео будет создано без аудиодорожки.

Для примера было пересоздано без звука видео, в котором рассказывалось о создании переходника PS/2 to DIN5. Его размер в формате MP4 с включенным звуком составил 42 802 Кб, с удаленной звуковой дорожкой, но включенным в настройках звуком 42 801 Кб, а с отключенным звуком 37 430 Кб
Скачать PDF

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/273342.html
Прокомментировать заметку можно по ссылке выше.

Интерфейс Sony Vegas 9. Особенности интерфейса, перемещение окон и панелей. Видеоинструкция.


Прямая ссылка
Текстовая версия совета

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/271548.html
Прокомментировать заметку можно по ссылке выше.

Как записать Audio CD с помощью Nero

Специально для Тихого Лехи который забыл пароль
Скачать [PDF, 355 Kb]

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/271317.html
Прокомментировать заметку можно по ссылке выше.

Sony Vegas 9. Интерфейс.

Превращение элементов панелей в окна и наоборот.
Особенности перемещения окон и панелей

Любому пользователю Windows, который пользовался любимой многими Фотошопой 😉 понятно — перетаскиваешь окошко внутри программы Read more… на панель, оно становится частью панели, тянешь за заголовок — опять отдельное окошечко. Но дизайнеры интерфейса Sony поступили нестандартно — окошечко прикрепить к области экрана/панели можно также, но на дергание заголовка окно уже не реагирует.
С этой проблемой обратилась ко мне в письме одна девушка, и попросила решить ее.
Так вот, отвечаю, чтоб открепить окно, т.е. окно опять стало отдельным окном, а не частью панели, надо тащить окно за следующий элемент управления с левой стороны области панели:


Видео-версия совета

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/270848.html
Прокомментировать заметку можно по ссылке выше.