Не буду описывать для чего она нужна %) Заметка от дырявой памяти на всякий случай.
Скачать с официального сайта
Прямая ссылка на последнюю стабильную не бета-версию 0.5
Копия на всякий противопожарный
Не буду описывать для чего она нужна %) Заметка от дырявой памяти на всякий случай.
Скачать с официального сайта
Прямая ссылка на последнюю стабильную не бета-версию 0.5
Копия на всякий противопожарный
К сожалению, автор QEMU перестал поддерживать XP, а старые версии, на мой взгляд, несколько глючноватые, но для каких-то небольших задач вполне подходят.
1. Качаем последнюю версию, поддерживающую XP 2016-09-03 (2.7.0) или отсюда
2. Ставим стандартным для Windows образом
3. Поскольку QEMU, как и в линуксе, управляется с командной строки, а расположена установленная программа в Program Files, да и имена у виртуалок длинные и неудобные, типа qemu-system-i386.exe, то пишем батник, передающий программе параметры, примерно такой, как здесь
содержимое qemu386.bat:
@Echo Off
Setlocal EnableDelayedExpansion
Set P="C:\Program Files\qemu\qemu-system-i386.exe"
For %%A In (%*) Do SET P=!P! %%~A
start "QEMU"/B %P%
Команда start — чтоб после запуска из консоли, например из-под FAR’а, консоль не висела, ожидая завершения работы QEMU
Параметр "QEMU" — заголовок окна, создаваемого командой start. Без него start подумает, что заголовок окна это путь к исполняемому файлу и попытается безуспешно выполнить первый передаваемый QEMU параметр.
/B — указывает команде start не создавать это самое новое окно, если его не указать, то за окном QEMU будет висеть черное пустое окно новой консоли.
В переменной %P% будет путь к QEMU и передаваемые параметры, например:
qemu-system-i386.exe -fda bootdisk.img -boot a загрузка с образа дискеты bootdisk.img
4. Кладем батник в какой-нибудь каталог, имеющийся в PATH, например, в C:\Windows
Пример как раз таки загрузки с такого образа

Про эту дискету расскажу как-нибудь позже, она с хитринкой, а мне было нечем заняться в компании дальнобоев, автослесарей и ноута с XP и мамедным интернетом, кроме как ее (недо)-реверсингом %).
Использоваться, например, может, если программа где-то глубоко зарыта в недрах Program Files, имя самой программы длинное и некузявое, а добавлять ее каталог в PATH бессмысленно или лень.
В таком случае можно написать подобный BAT-файл:
@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A
"C:\Program Files\somesoftware\soft.exe" %P%
@Echo Off
Setlocal EnableDelayedExpansion
Set P=
For %%A In (%*) Do SET P=!P! %%~A
echo %P%
При вызове, например с такими параметрами:
test1.bat 1 2 34 5 76 blablabla hutinpuilo
выдаст на экран строку
1 2 34 5 76 blablabla hutinpuilo

Выдержка из источника SET, справка по команде под катом
Копия BAT-файла на Pastebin
Источник 1 2
SET (справка по команде, копия)
Насколько понимаю, клиент этих ваших телеграмов закрытый и исходников нет, это первый момент, над которым стоит задуматься и серьезно. Если софт, предлагающий что-то секурное закрыт, в нем либо дырка, либо говнокод, который создатели боятся показать. Говнокод это тоже дырка, потенциальная, но в современном мире потенциальная дырка превращается в кинетическую со сверхсветовой скоростью.
Второй момент — скрытый пиар Телеграма на рашка-тв. Если раньше о телеграме знали относительно «избранные», то теперь знает каждый ламер (даже бабки на лавочке), причем знает, что через телеграм можно купить наркотики, детское порно и выполнять задания куратора из синего кiта. Так вот нахуя? Не для того ли, чтоб куча лохов, которым в ГОРФ нихуя не доступно, скачали себе телеграм, регнулись (а для этого нужен номер телефона) и через некоторое время получили свою двушечку за спайсуху, свастон, майнкампф или изображение кiта? Задумайтесь.
Это все отдает паранойей и конспирологией, но если у вас паранойя, еще не значит, что за вами не следят…
UPD: Анонимусы подсказывают, что насчет закрытости кода я ошибался.
Еще одна заметка от склероза:
Вот ссылка на архив с темами
В архиве и мобильная, и модифицированная основная, со всеми свистелками и перделками.
Кому для чего вдруг надо, просите ключик в комментах на LJR (ну я там чаще бываю, не забудьте регнуться — анонам почта не приходит)
Когда-то, впрочем, не так давно,
r_l@ljr сделал офигенный проект — новостные постапокалиптчиеские заголовки. В виде простого скрипта PHP.
Идея крутая, и мне показалось, что неплохо бы ее использовать в дизайне своего сайта. В результате я пошел и спросил у
r_l@ljr исходники, а дизайнеры внедрили этот прикол в тему оформления.
Заметка, скорее от склероза, и чтоб не пролюбить… Но мало ли кому понадобится.
При заходе на любую страницу сайта http://tolik-punkoff.com, в его шапке вы можете увидеть сгенерированный «заголовок новости»:

Как эта штука сделана в моей теме и версии WordPress:
Понадобится оригинальный архив (ссылка в конце заметки)
В нем 3 файла:
news_data — файл с массивами фраз для генерации заголовка
global.php — файл скрипта, отображающего заголовок. Новый заголовок генерируется автоматически, через заданное время.
globalf5.php — заголовок генерируется один раз, надо нажать F5, т.е. обновить страницу, чтобы получить новый.
Внимание: в файле news_data пропущена запятая, даже в нескольких местах, так что если сами будете делать, поправьте. На локальном web-сервере, должно быть видно где.
1. Закачиваем в директорию темы, например, your-site.org/wp-content/themes/beach/, конкретика зависит от вашего хостера, исправленный файл news_data.
2. Создаем скрипт news.php следующего содержания:
<?php
$where=array();
$subject=array();
$action=array();
$object=array();
$parts=array();
include(__DIR__.'/news_data');
foreach ($parts as $part)
{
$news[$part]=${$part}[mt_rand(0, count(${$part})-1)];
}
$obs=implode(' ', $news)." ";
?>
В конце заметки ссылка на PasteBin
3. Далее находим файл заголовка темы (в редакторе темы WordPress), скорее всего это будет header.php:

В самом начале подключаем скрипт news.php:
<?php
/**
* @package Beach
*/
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
include(__DIR__.'/news.php');
...
Команды ini_set используются для отладки, если что-то пошло не так, скорее всего, вам вывалится сообщение об ошибке. Не буду на этом останавливаться, т.к. подробное описание есть в любом учебнике по PHP, выкиньте эти команды, когда все заработает. include(__DIR__.'/news.php'); подключает ранее созданный скрипт.
4.Внедряем скрипт в header.php, в «шапку» страницы:
...
<h2 id="site-description"><?php bloginfo( 'description' ); ?></h2>
<h3 id="apoknews"><?php echo $obs; ?></h3>
</hgroup>
...
В зависимости от используемой темы, вы сами должны найти место, куда внедрять данный код (выделенный жирным).
5. Подправляем CSS. Файл: style.css
В начале файла дописываем:
#apoknews {
color: RGB(255, 215, 0);
background-color: RGB(0, 0, 0);
text-align:left;
border: 3px solid #ffd700;
padding-left: 7px;
}
Код скрипта данных
Код скрипта отображения (news.php)
Фрагмент кода скрипта формирования заголовка header.php.
CSS
Или еще раз возвращаясь к напечатанному. Сегодня поговорим о защите от спама.
В первоначально описанном способе копия был баг (промотайте в конец), из-за которого можно было легко и непринужденно загадить ящик получателя спамом, да еще и в автоматическом режиме. Отправить картинки, вирусы, или загадить чужой ящик не получится, но вот закидать «Войной и миром» ящик владельца сайта вполне таки да.
Чтобы уменьшить такую вероятность, добавим в скрипт отправки почты каптчу. Поскольку скрипт, отправляющий почту (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
Скачать все одним архивом
Тесты и куски кода
Прикиньте, братик обнаружил кучу старых нулевых перфокарт! Их там еще до жопы, это то, что он вынес и вскоре мне отправит.
К сожалению, не смог нагуглить технические характеристики: сколько влезает байт на одну такую. В целом от 80 до 150, кто дополнит пост — тому печенька.
Компьютер, который с ними работал, еще не откопали 🙁
Ну это же и правда, почти «Steins Gate», ребята!
Возможность отсылки в процессе.
Редтрект в PHP осуществляется с помощью функции header(), и в ее использовании есть небольшая проблема. Она должна быть вызвана ДО любого вывода текста, т.е. до вывода любых тегов, текста, и т.д.
Можно не бояться за то, что текст, выведенный после функции header() пользователь вообще не увидит. Увидит, если установить нужный параметр — время до редиректа, например, так вот:
header( 'Refresh: 5; url=http://natribu.org' );
Цифра 5 указывает на время в секундах, которое пройдет перед тем, как пользователь будет перенаправлен на далее указанный адрес (в данном случае http://natribu.org, хехе).
Следующий код вызовет ошибку:
<?php echo "Вы будете посланы нахуй через 5 секунд"; header( 'Refresh: 5; url=http://natribu.org' ); ?>
Warning: Cannot modify header information — headers already sent by […]
А следующий код сработает правильно:
<?php header( 'Refresh: 5; url=http://natribu.org' ); echo "Вы будете посланы нахуй через 5 секунд"; ?>

Через 5 секунд:

Случилась тут небольшая задачка, как обработать две и более кнопок submit в HTML-форме, причем желательно без помощи JS и иных ухищрений, т.е. есть, например, такая форма:

Надо выяснить (на сервере), какую кнопку нажал пользователь.
На самом деле (ну если никто не поизвращался над браузером, т.е. клиентом) в отправленном серверу запросе POST будут только параметры нажатой кнопки. Если задать каждой кнопке уникальное имя, то можно будет отследить, какая кнопка была нажата, и, соответственно, обработать это.
Создадим тестовую форму multibutton.html:
<html> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> <title>Multibutton 'Send' Test</title> </head> <body> <center> <form action='multibutton.go.php' method='POST'> <b>Press a button</b></br> <input type='text' name='testtext' value='Test Text'></br> <input type='submit' name='button1' value='Button #1'> <input type='submit' name='button2' value='Button #2'> <input type='submit' name='button3' value='Button #3'> </form> </center> </body> </html>
И напишем скрипт-обработчик multibutton.go.php:
<?php
$buttonmessage="<center><b>Perssed button:</br>#";
//Проверка кнопок
if (isset($_POST['button1']))
{
$buttonmessage.="1";
}
if (isset($_POST['button2']))
{
$buttonmessage.="2";
}
if (isset($_POST['button3']))
{
$buttonmessage.="3";
}
echo $buttonmessage."</br>";
echo "Test text value: '".$_POST['testtext']."'</b></br></br>";
echo "<b>----- Output $_POST array: ----</b></br><code><pre>";
print_r ($_POST); echo "</br></pre></code>";
echo "<b>-------------------------------</b></center>";
?>
Если в массиве $_POST будет найден элемент button1 — обрабатываем нажатие кнопки #1 (if (isset($_POST['button1']))), аналогично поступаем с другими кнопками. Текстовое поле — исключительно для теста, можно вписывать любое значение, оно будет показано пользователю.
Для наглядности выводится содержимое массива $_POST:
print_r ($_POST);
Получим следующее:
Нажата кнопка #1:



Можно объединить создание формы и вывод результата в единый скрипт: см. код на PasteBin
Сразу оговорюсь, это учебные примеры. В ближайшее время я вернусь к теме и покажу, как использовать каптчу «на местности», т.е. встроить ее в работающий движок сайта или его часть. А тут пока примеры относительно скорее умозрительные, что называется, из учебника.
Если кто-то вдруг совсем не знает, что это такое, то в конце заметки есть ссылка на источник, ну или можно в поисковик сходить.
Код тестового скрипта вполне неплохо обкомментирован, поэтому особых пояснений не требует. Если уж возникнут вопросы — задавайте, постараюсь ответить.
Механизм сессий на самом деле не всегда удобно использовать, например, если не хочется возиться с уже продуманными умными людьми сессиями готового сайтового движка, а свою каптчу встроить хочется. В таком случае просто перекладываем всю работу на cookie, создаваемые и удаляемые по нашему хотению:
Тут поясню лишь один момент, установку самих cookie. Делается это встроенной функцией PHP setcookie, полное описание которой вы можете найти в разделе источников в конце заметки.
Мне же понадобились только три параметра:
setcookie($name,$value,$expiredtime);где:
$name — имя cookie
$value — передаваемое в cookie значение, сохраняемое на компьютере пользователя
$expiredtime — срок действия cookie, после его окончания cookie не будет обрабатываться сервером. Таким образом устанавливается максимальное время, данное пользователю на ввод кода каптчи.
В данном случае:
setcookie('mycaptchamd5',md5($captchacode),time()+300);
т.е. имя cookie 'mycaptchamd5', в качестве значения передается md5-хэш кода каптчи, а время действия устанавливается в 300 секунд (т.е. 5 минут).
Код модуля ASCII каптчи на PasteBin
Пример с сессией
Пример с cookie
Цифры псевдографикой. Вариант 1
Цифры псевдографикой. Вариант 2
Скачать все с Mega.nz в одном архиве
Функция setcookie()
Разработка CAPTCHA своими руками
Копии

Итак, закончили мы на том, что нарисовали все цифры, создали массивы php с псевдографическими изображениями цифр и написали отладочную функцию, которая выводит конкретную цифру. Продолжаем!
Для начала условимся, то нашему злодею-хацкеру, распознающему каптчу, мы, хоть и ненамного, но усложним задачу: «пробельные» («пустые») символы в изображении каждой цифры, а также сами символы, изображающие цифру, будут выбраны случайно из заранее заданного набора. Зададим набор символов, изображающих цифру, в виде строки:
$pgstring="#$%@!?0"; //символы, из которых будут составлены цифры
Аналогично и для «пустых» символов:
$spstring="- "; //пробельные символы
Тут все зависит от вкуса, цвета и лично ваших глазок. Главное, чтобы в строке с возможными «пустыми» символами и в строке с возможными символами, изображающими цифру, не встретилось одинаковых символов, иначе при определенных условиях, пользователь вполне может получить вот такую вот гадость, вместо каптчи:
###### ###### ###### ###### ###### ###### ######
###### ###### ###### ###### ###### ###### ######
###### ###### ###### ###### ###### ###### ######
###### ###### ###### ###### ###### ###### ######
Заведем еще две переменные, которые будут хранить выбранные символы для «пробельных» и символов изображения:
$pgchar="";
$spchar="";
Пока просто оставим их пустыми, потом к ним еще вернемся.
Далее подробное описание скрипта с картинками и видео
В данный момент, мы имеем готовый include-модуль, формирующий код каптчи и ее псевдографическое изображение. В следующей части будут примеры ее использования.

Сегодня будем рисовать каптчу. Причем не с помощью стандартных библиотек вывода графики (таких мануалов в сети более чем достаточно), а каптчу, отображаемую пользователю в виде псевдографики, т.е. изображения символов каптчи будут созданы из обычных числовых и буквенных символов. Для упрощения задачи примем следующее:
— В качестве символов, из которых будет создаваться изображение, будем использовать латинские буквы, цифры и знаки препинания. Можно, конечно, и китайскими иероглифами пользоваться, но не факт что пользователь сможет каптчу распознать и она у него не «поплывет».
— Сам код каптчи будет состоять только из цифр (ну вот лень мне было заморачиваться с буквами в ASCII-арт).
Плюсы:
+ Скрипт легко встраивается как медведевский будильник, в разные места в любое место, где нужна каптча.
+ Не требует библиотек обработки изображений, дополнительных ранее нарисованных картинок и т.д., соответственно, будет работать даже на самом плохом хостинге, где библиотек типа ImageMagick может вообще не быть
+ Отображается даже в консольном (текстовом) редакторе типа lynx.
+ Почти не тратит трафик (текст же) и ресурсы сервера.
Минусы:
— Довольно легко ее распарсить автоматически, если не применять всякие дополнительные фишки, типа изменения количества строк и столбцов изображения. Их, к сожалению, в этом мануале не будет, но если кто-нибудь захочет вдруг, то я вернусь к этому вопросу.
В части первой займемся рисованием цифр. Конечно, человеку увлекающемуся ASCII-артом это нафиг не надо, можно сразу пропускать и переходить ко второй части. Кто не знает, что такое ASCII-арт вообще, тот может сходить в Википедию или Гугль, и ознакомиться с темой.
Я сам не великий ASCII-сенсей, так что использовал достаточно стандартную методу:
1. В любом простом текстовом редакторе (Блокноте, Notepad++, mcedit или редакторе FAR-а) нарисуем поле размером в X символов и Y строк каким-либо одним символом, например *, -, # или любым другим. Должно получиться что-то типа этого (я взял поле размером 6 x 5 символов):
------
------
------
------
------
2. Далее, нажимаем клавишу Insert, включаем режим замены и заменяем в этом поле символы - на какие-нибудь другие, так, чтобы получилось изображение определенной цифры, например:
-0000-
00--00
00--00
00--00
-0000-
Если кто-то ленивый, то можно поискать готовые цифры в Гугле, взять несколько черновой вариант здесь, готовый, используемый мною вариант здесь. Или можно вообще в последней части статьи скачать сразу весь архив. XD
Итак, у нас есть готовые изображения цифр, осталось лишь записать их в виде, доступном PHP.
Создаем массивы, содержащие псевдографические изображения цифр. Здесь и далее условимся, что в качестве «пустого» символа я использовал *, а в качестве символа для изображения цифры, знак $.
Код и некоторые пояснения
В следующей части создадим генератор кода каптчи и генератор ее ASCII-изображения.
Или как я избавился от слишком назойливой опеки антиспама на сервере.
Не так давно поднимал вопрос о форме обратной связи для сайта на WordPress [Копия].
Некий анон хотел меня затроллить, но, как обычно, мало того, что написал полнейшую чепуху, которая не работает, так еще и случайно помог вскрыть баг (хотя, скорее опцию) почтового сервера, которая, правда, лично мне мешала.
Ситуация такая: антиспам финского сервера (вполне оправданно, кстати) отправляет в спам письма с доменов .ru (mail.ru и yandex.ru точно), .kz, .by и некоторых не связанных с ГОРФ, типа .tk
Но, со спамом я неплохо справляюсь самостоятельно, и лишняя опека со стороны умной машины мне не нужна. На случай, мало ли у кого возникает аналогичная проблема, вот рецепт:
Находим в скрипте mail.php строчку:
$mes = "Имя: ".$name."\n\nТема: " .$sub."\n\nСообщение: ".$message."\n\n";
И меняем ее на:
$mes = "Имя: ".$name."\n\nТема: " .$sub."\n\nСообщение: ".$message."\n\n"."E-mail to answer: $email\n\n";
Ниже меняем в строке
$send = mail ($address,$sub,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$email");
$email на $address. Должно получиться:
$send = mail ($address,$sub,$mes,"Content-type:text/plain; charset = UTF-8\r\nFrom:$address");
Что этот код делает. Да все просто. Строка с сообщением ($mes) изменяется так, что адрес, который ввел пользователь в контактной форме, добавляется к тексту сообщения как простой текст. Параметры функции php mail изменяются так, что в заголовок письма вместо адреса пользователя, добавляется наш собственный адрес для приема сообщений из контактной формы. В результате мы получим сообщение, отправленное с нашего же адреса. Примерно как на скриншоте ниже:

Проблема с антиспамом решилась (сервер проверял только заголовки писем, а не указанные в тексте адреса), единственный минус — не ответить по нажатию соответствующей кнопки в почтовой программе, но тут уж, как говорится, шашечки или ехать.
Другой баг скрипта отправки почты, это то, что довольно легко его использовать автоматически и зафлудить почтовый ящик. Скоро расскажу, как побороть и эту беду.
Сгенерировать строку, состоящую из случайных символов. Немного дополним задачу, строка будет состоять из случайных символов, а сами символы будут взяты из заранее заданного определенного набора. Например, строчные и заглавные латинские буквы, цифры, знаки препинания или любые другие заданные символы в любой комбинации.
Такая штуковина вполне может пригодиться для генерации, например, пароля из заданного набора символов
Делается это довольно просто. Поручим формирование строки отдельной функции.
Во входных параметрах передадим ей строку, содержащую набор символов, из которых будет сформирована выходная случайная строка (параметр Alphabet) и длину генерируемой строки (параметр Length)
string GenRandomString(string Alphabet, int Length)
{
...
}
Внутри функции.
//создаем объект Random, генерирующий случайные числа
Random rnd = new Random();
//объект StringBuilder с заранее заданным размером буфера под результирующую строку
StringBuilder sb = new StringBuilder(Length-1);
//переменную для хранения случайной позиции символа из строки Alphabet
int Position = 0;
Далее в цикле генерируем случайную строку:
for (int i = 0; i < Length; i++)
{
//получаем случайное число от 0 до последнего
//символа в строке Alphabet
Position = rnd.Next(0, Alphabet.Length-1);
//добавляем выбранный символ в объект
//StringBuilder
sb.Append(Alphabet[Position]);
}
Возвращаем сгенерированную строку:
return sb.ToString();
txtReturn.Text = GenRandomString("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", 10);
возвращает строку случайных символов длиной 10 знаков, состоящую из заглавных и строчных букв английского алфавита.
Продолжаю тему, начатую в предыдущей заметке [КОПИЯ]. В ней описывал получение данных от определенных скриптов и процессов запущенных на сервере под управлением Linux с помощью SSH, псевдотерминала и отдельного пользователя, создаваемого специально для целей мониторинга.
Будем посмотреть другой способ, с одной стороны, более сложный и требующий владения каким-нибудь языком программирования, кроме Bash-скриптов. Хотя, можно обойтись и исключительно одним Bash’ем, если клиент и сервер под Linux, или Bash прикрутили к Windows (cygwin(?), не пробовал, не знаю). А с другой стороны, наоборот, способ простой безопасный, требующий минимум вмешательства в настройки сервера.
На полноценный мануал не рассчитывайте, так, заметки на полях рабочего блокнота, чтоб не забыть и потом допилить под свои личные нужды.
Примечание: Термины «клиент» и «сервер» могут по ходу статьи быть неоднозначно истолкованными.
Серверное приложение будет наоборот, работать на «клиентском», «операторском» рабочем месте, а «сервер», в смысле компьютер с Linux, на котором я запускаю свои скрипты, и который управляет нужной мне железякой, станет вполне себе клиентом.
В общем, чтобы не вносить путаницы я условлюсь называть рабочее место оператора «локальным компьютером», а тот, который «сервер в привычном понимании» — «удаленным».
Такая же, как и в предыдущей заметке. Имеется удаленный компьютер под управлением Linux, рулящий системой контроля температуры и давления.
На самом деле, рулить он может чем угодно: от домашнего FTP с котиками или соединения с Интернетом, до управления СКД, открытием ворот, дверей, врат в Ад, личным концлагерем и т.д.
Суть в том, что нужно, чтобы удаленная система сигнализировала оператору об изменении своего состояния (изменении температуры, разрыва соединения с Интернетом, пришествии Сатаны). Оператор, как обычно, сидит под Windows (как в большинстве организаций в СНГ).
Для простоты условимся, что локальный и удаленный компьютер находятся в одной локальной сети (и одной подсети) 10.10.0.0/24, IP-адрес локального компьютера 10.10.0.30, прием данных производится через сетевой порт 11000 локального компьютера. Локальный и удаленный компьютеры обмениваются данными по протоколу TCP, данные представляют собой Unicode-строки.
Как это организовано на локальном и удаленном компьютере
Сервера приема сообщений:
— Смотреть на PasteBin
— Скачать с Mega.nz
Скрипта отправки сообщений:
— Смотреть на PasteBin
— Скачать с Mega.nz
1. Клиент-серверное приложение на потоковом сокете TCP [Копия]
2. Как открыть TCP-/UDP-сокет средствами командной оболочки bash [Копия]
Понадобилось мониторить состояние сервера, точнее не всего сервера, а определенного демона, на сервере запускаемого. Понятно, что самым простым способом мониторинга чего-то работающего в фоне, является просмотр соответствующих логов. Но такой способ на самом деле дает весьма мало интерактивности, надо постоянно заходить по SSH, ковыряться в этих самых логах. Хочется, чтоб при изменении состояния, или же по определенной команде от определенного пользователя, сервер нам все рассказывал сам.
Хорошо, если демон умеет при изменении состояния запускать некие пользовательские скрипты. Так умеет, например, демон OpenVPN или, например, демон небольшой промышленной системы метеоконтроля, который я использовал в данном примере.
Вкратце, имеется плата на Arduino, обрабатывающая показания с нескольких датчиков и передающая их в удобоваримом формате через COM-порт демону, запущенному на сервере. Демон умеет исполнять пользовательские скрипты, но вот беда (та же беда и с OpenVPN), если в скрипте написать что-то типа echo "У нас изменились параметры, шеф, все пропало" это сообщение в лучшем случае уйдет неведомо куда. В худшем — вылезет пользователю, из под которого стартует демон, посреди рабочего сеанса в консоль.
Самый простой способ всего этого избежать, при этом получив нужную интерактивность — отправлять сообщения определенному пользователю, созданному специально для данной цели.
Не так давно я делал похожего пользователя для отключения/перезагрузки сервера [КОПИЯ] . Фактически, пользователю была установлена псевдооболочка (на самом деле просто скрипт), выполняющий единственную команду перезагрузки/отключения системы. И идея создания псевдооболочек меня зацепила. Таким образом можно дать пользователю выполнять только ограниченный набор команд, да еще и обрабатывать параметры в скрипте по-своему, так что никакой злоумышленник, даже получив доступ по ssh ничего сделать не сможет, т.к. команды псевдооболочки ему неизвестны.
Почему бы не использовать такой способ и для целей мониторинга?
Первым делом создаем отдельную группу:
groupadd monusers
где monusers — любое название группы на ваш вкус, ранее в системе не существующее
Создаем пользователя:
useradd -g monusers -d /home/meteomon -s /home/meteomon/monitor.sh meteomon
где:
-g monusers группа пользователя (ранее созданная monusers)
-d /home/meteomon домашний каталог пользователя
-s /home/meteomon/monitor.sh — псевдооболочка для пользователя, скрипт, обрабатывающий команды.
meteomon — имя пользователя
Задаем пользователю пароль (иначе не сможем залогиниться по ssh):
passwd meteomon
Создаем домашний каталог:
mkdir /home/meteomon
Меняем владельца каталога на пользователя meteomon:
chown meteomon:monusers /home/meteomon
Меняем права доступа на каталог:
chmod 500 /home/meteomon
Создаем в домашнем каталоге скрипт monitor.sh о содержимом скрипта ниже.
Меняем владельца и права доступа для скрипта monitor.sh
chown meteomon:monusers /home/meteomon/monitor.sh
chmod 500 /home/meteomon/monitor.sh
Поскольку пользователь предполагается исключительно для мониторинга, разрешим ему всего одну команду — выход из системы. Соответственно, скрипт будет такой:
#!/bin/bash
echo "Hi, monitor operator"
echo "To exit enter byebye"
while [ "$KEYINPUT" != "byebye" ]; do
read KEYINPUT
done
Все просто — ввод с клавиатуры попадает в переменную KEYINPUT и пока она не равна byebye скрипт выполняется. Как только пользователь введет byebye, так прервется цикл, скрипт завершит работу, и пользователь автоматически выйдет из системы.
Для отправки сообщений пользователю используем связку команд echo и write
Можно создать отдельный скрипт со следующим содержимым:
#!/bin/bash
USERNAME="meteomon"
echo -e $1|write $USERNAME 2>/dev/null
положить его в каталог с доступными пользователям скриптами (например в /usr/sbin) и установить права доступа, например в 755, чтобы пользователь для мониторинга мог получать сообщения от всех пользователей системы.
Примечание: параметр -e команды echo позволяет использовать специальные символы, такие, как перенос строки \n, а конструкция 2>/dev/null отправляет в нуль-устройство сообщение об ошибке, которое может возникнуть, если пользователь meteomon не вошел в систему.
Осталось прописать соответствующую команду в пользовательском скрипте, вызываемом демоном, или исполняемом по cron’у:
...
DATA=`meteosrv checksystem`
/usr/sbin/techo $DATA
...
Внимание! Читайте документацию по демону, можно случайно нарваться на подводный камень, например, OpenVPN в некоторых случаях болезненно относится к ошибкам, случающимся в пользовательских скриптах.
Для Windows понадобится утилита plink, обычно она идет вместе с ssh-клиентом PuTTY. В каталоге с ней создаем bat-файл следующего содержания.
testmon.bat:
plink -ssh -P 22 -l meteomon -pw meteomonpass 192.168.0.40
где вместо meteomon надо подставить имя пользователя для мониторинга, вместо meteomonpass — заданный пароль, а вместо 192.168.0.40 настоящий адрес удаленного компьютера.

Источники
Пост из серии «кратенькая инструкция от склероза», описываю больше для себя, как форма сделана на моем сайте. Мопед не мой, но найти, откуда взята сия метода, не смог.
0. Создаем новую страницу, озаглавливаем ее согласно случаю, например Обратная связь, устанавливаем простое и понятное название постоянной ссылки, например contact-form, вставляем в редакторе в режиме Текст вот этот вот html-код. Не забудьте заменить beach на название директории с вашей темой. Пока ничего работать не будет, но «болванка» странички с формой обратной связи готова, осталось лишь научить сайт обрабатывать запрос, отправленный из формы.
1. Нам понадобится php-скрипт, отправляющий почту. Создаем файл mail.php, вставляем код, который откроется по ссылке, и копируем файл по FTP в директорию темы (wp-content/themes/ваша-тема).
В исходнике mail.php надо заменить admin-vnc@uaitc.fi на тот e-mail, на который вы хотите получать сообщения, отправленные из этой формы и указать в строке
header( 'Refresh: 3; url=http://tolik-punkoff.com/obratnaya-svyaz/' ); нужный адрес, куда пользователь будет перенаправлен после отправки сообщения. Число (в данном случае 3) — время перед перенаправлением. Фактически время, которое пользователю будет отображаться сообщение об успехе, либо об ошибке при отправке сообщения.
2. Сохраняем два изображения, valid.png:

invalid.png:
images темы (wp-content/themes/ваша-тема/images).style.css темы вот этот вот код cssФАНФАРЫ!
Все необходимое в одном архиве (на mega.nz)
Нашел оригинальный архив (скачать с mega.nz)
Akismet (идет в комплекте) — офигенная защита от спама. Достаточно только регнуться на их сайте (через конрсоль wp), получить ключик (бесплатный) и пользоваться. Из 400 спамерских комментариев проворонил 2. Классный результат.
BackUpWordPress — лучший плагин для бэкапа.
Better Tag Cloud — добавляет годное красивое облако тегов

Спрашивают, как у нас сделан украинский флаг при входе на сервер. Да проще пареной репы, товарищи!

1. В любимом графическом редакторе готовим картинку. Должна быть PNG, разрешением 210×210 px и глубиной цвета 32 бита.
2. Идем в файл /usr/share/gdm/defaults.conf и ищем там параметр Logo= (секция [greeter]) и меняем путь на путь к своему файлу или заменяем сам файл.
Можно настроить приветствие:
Параметры
DefaultWelcome=false
DefaultRemoteWelcome=false
устанавливаем в false (иначе, ЕМНИС, будет использовано имя компьютера) и меняем параметры (вместо нашего названия подставьте свое):
Welcome=Welcome to UAITC
RemoteWelcome=Welcome to UAITC
Флаг (по клику можно скачать с mega.nz):
