Какеры

Додик с Петухеллом и ваши виртуальные прихвостни, даже не пытайтесь…
Заглянул тут в логи:
Неудачные попытки хакнуть, и это только 1 процент
Не пытайтесь, ребята, не ваш уровень.
1. Нет у меня таких плагинов, даже похожих нет.
2. О нулевых уязвимостях меня в корпоративном блоге предупреждают (ну скупаем мы их массово, такая работа)
3. Все забэкаплено. Даже если и хакнете, то насрать. 24 часа на восстановление, в договоре прописано.
4. Уведете домен, как нашисты у Назлобу, хуй с ним, будет новый домен, нам на выдачу в гугле, тащемта, насрать. Нас из других источников финансируют, нам SEO пофигу.
5. Г. Д-ченко и Д. С-нов, вас же предупреждали, что интернеты вам следует отключить, и больше туда не захаживать. Можем ведь, как Хуйло сказало, и специалистов по обрезанию (не подумайте, кабелей) послать.

Настройка X11-forwarding через ssh, с помощью PuTTY и Xming

Вообще в Linux, а особенно на сервере под Linux вполне можно обходиться голой консолью, ибо все инструменты обычно в консольном варианте есть. Но иногда хочется запустить и графическое приложение, например программу разметки диска, а иногда без графики вообще не обойтись, если обрабатываешь видео или работаешь с виртуальными машинами. На наше счастье возможность удаленно работать с графическими программами есть. Называется это дело X11-Forwarding и существует оно аж в двух вариациях:
XDMCP, нечто вроде RDP в винде — когда мы подключаемся к оконному менеджеру Linux, вводим свой логин/пароль и работаем с удаленным рабочим столом.
— И просто возможность запуска отдельных приложений (GIMP, GParted и т.д.)

К первому я еще может, когда-нибудь вернусь, а пока будем настраивать второе.

Настройка X11-forwarding в ssh на стороне Linux

Будем считать, что ssh у нас уже настроен. Правим конфиг демона ssh /etc/ssh/sshd_config
Раскомментируем или дописываем следующие строки:
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

Перезапускаем демон или рестартируем сервер.
Если надо, открываем порты на файерволе:
Для переопределения дисплея:
iptables -A INPUT -s x.x.x.x/xx -p tcp --dport 6000 -j ACCEPT
iptables -A OUTPUT -s x.x.x.x/xx -p tcp --sport 6000 -j ACCEPT

Вместо x.x.x.x/xx подставить нужную подсеть

Настройка PuTTY

Щелкаем по значку в лотке, открываем Конфигурация и в появившемся окне выбираем в дереве слева Соединение -> SSH -> X11
Выставляем все значения как на картинке и запоминаем число после localhost: (оно понадобится виндовому X-серверу).

Настройка виндового X-сервера

Их, наверное с десяток всякоразных наберется, но я особо не экспериментировал, все побежали и я побежал, взял самый популярный Xming
1. Качаем с официального сайта или напрямую с SourceForge
2. Устанавливаем
3. Настраиваем, запускаем Пуск -> Все программы -> Xming ->XLaunch

Выбираем Multiple windows и устанавливаем Display number таким же, как было настроено в PuTTY:

Нажимаем Далее и выбираем Start no client, тогда Xming «поселится» в трее и будет ждать, пока мы с консоли PuTTY запустим какое-нибудь графическое приложение.


В следующем окне я оставил все также, поскольку Font Server не настраивал.

Хотя глюк со шрифтами у меня был, но как оказалось, его исправление особого шаманства не требует.

Если нажать Готово в следующем окне, Xming сядет в лоток и будет ждать, пока мы запустим что-нибудь графическое из консоли. Например
gparted &

символ & — чтоб программа запустилась в фоновом режиме и не занимала консоль.

Чтобы каждый раз не лезть в XLaunch, можно в свойства ярлыка Xming дописать нужные параметры "C:\Program Files\Xming\Xming.exe" :0 -clipboard -multiwindow

Глюк с размером шрифтов и борьба с ним.

По умолчанию Xming почему-то выставляет ОЧЕНЬ маленький размер шрифта меню и диалоговых окон


Борьба проста. Дописываем в окне Additional Parameters XLaunch’а в строку Additional parameters for Xming параметр -dpi 96 или его же в свойства ярлыка. Число в параметре выбираем под свои глаза и монитор

Вот что получилось:

Другие опции можно узнать из официального мануала

Источники не помню, но УМВР. И у друга тоже.

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

Выдираем досовую часть из Hiren’s Boot CD

Зело полезный набор утилит Hiren’s Boot CD за время своего существования уж как-то очень сильно раздулся, несмотря на то, что авторы в последних версиях повыкидывали оттуда всякую совсем уж проприетарщину, типа Windows 98, загружающейся с болванки. HBCD 15.2 весит целых 600 метров, что пофиг, если загружаешься непосредственно с болванки, и неприемлемо, если надо грузиться по сети на слабую машину со 128 метрами памяти, например. Но на такой машине весь HBCD и не нужен, а нужна только его досовая часть. Итак, выдираем ее и формируем отдельный образ.
Все дико просто, если пользоваться моей предыдущей инструкцией по ручной сборке образа загрузочного CD в Linux .
Итак, будем считать, что вы ее читали, и у вас уже подготовлена директория iso_root, ней лежит минимальный набор файлов для загрузки (загрузчик ISOLINUX isolinux.bin, его конфиг isolinux.cfg, необходимые файлы *.C32 и memdisk), а также скрипт вне директории iso_root, который вызывает mkisofs c нужными параметрами.

1. Создаем в директории iso_root директорию HBCD, а в ней директорию Dos (все именно так, с сохранением регистра, иначе чуда может не получиться).
2. Вставляем в дисковод диск HBCD, и копируем все файлы из директории HBCD/Dos в созданную директорию.
3. Выходим в директорию iso_root и правим конфиг isolinux.cfg, добавляя следующий пункт меню:

label dossoft
	menu label DOS Programs
	kernel memdisk
	initrd HBCD/Dos/dos.gz
	append floppy
	timeout 1000

4. Правим заголовок меню:

menu title DOS programs

5. Выходим на уровень выше и запускаем скрипт createiso
6. …
Образ готов! ФАНФАРЫ!


Загрузочное меню диска

Загрузочное меню досовой части Hiren’s Boot CD

Конечно, если попытаться загрузить Mini XP из этого меню или вернуться в основное меню HBCD, получим ошибку. Зато все досовые утилиты прекрасно работают (тестировано на «мониторе»). И весит этот образ всего 20 Мб, вместо 600 с гаком целого HBCD.

Готовый образ здесь

Рабочее

Вот ведь блинский блин. Друг, товарищ и вообще хороший человек (Ага, три раза человек. Д-р В█████кий ) ███████ устроился на новую работу. И ведь опять, блядь, ██████████. Этот анекдот мне уже начинает надоедать. Мало того, что из ███████ ████████, как из меня ████████ ███, так еще и ███████ ему попадаются есть отдельная шутка юмора, в них обычно не ████████ нужен, а Геракл, чтоб вычистить эти авгиевы конюшни. Нормальный ████████ в такие места идет только за большие деньги, которых у таких контор нету. Ну если есть, то на ████████ █████████. Посему берут ████████ за сраные ███-███ ████ в месяц, поскольку ███████ на такие деньги идет. А работать приходится мне, ну это уже тому ще ███████ не шарит. Если и шарит, то хуево и не в том.
███████, конечно, везет, на самом деле. Тому ще, во-первых, я его █████, а во-вторых, ████████ не предполагает личного посещения этих клоак, и можно помогать █████ с помощью ████████, ███████, всяких ██████████ ████████, ███ и такой-то матери, не отрывая жопу от уютного дивана в Финляндии.
Так вот, новая работа ███████ это вообще что-то с чем-то, в типа таком же говне работает небезызвестный ██████ (██ ████ ██████████ ███████). В общем контора занимается «██████» и сидит на ███████████. У нее внутри неонка даже ███████████ есть, причем кроме ███████████ там походу вообще нет ничего. Исходя из объяснений ████████, контора занимается чем-то ███████-███████-█████████████, вроде ███████████ ██████████ ██████. Это типа официально. На самом деле внутрях даже не неонка, а сплошное ██████- ███питие, куча ███ постпенсионного возраста, четыре █.█.█ (и █.█.█.), которые в чем-то понимают, но постоянно в разъездах или в ███████ и до кучи ████████-████████ на какой-то крутой тачке. ███████ говорит, что на ████████, но тут веры ███████ нет, ибо в машинах он шарит еще хуже, чем в █████████. Совершенно не понимаю, как ████████ взяли в эту контору с █████████████, ибо он везде проходит как ███████████████ █████████████, █████, ████, ████████ и ███████ (причем со █████████, а ни как я). У меня, собственно, все то же, только без █████████████ и █████ ██████ ████.
Ну да ладно. Так вот, об █████████. Как оказалось, в ████████ ну просто не авгиевы конюшни, а конюшни размером с небольшую ███████, типа ███████ ████████.
— везде винды, поставленные еще на заводах при покупке компов, в основном XP, самое свежее — директорский ноутбук с █████ Половину виндов на всем этом хозяйстве надо переустановить, естественно, не проебав данные. Дисководов нет, USB залиты чем-то типа █████████ (████████████). Фотку показать не могу, ибо тоже ███████████. Если просочится, то ████████ изменят класс на «Евклид» (а вас переведут в класс D, будете у меня за SCP-█████ ухаживать — примечание д-р В████ский). Единственный способ общения компов со внешним миром — сетевой разъем.
— кроме компов есть еще некие устройства типа «очень старый китайский телефон» но в чехле от танка. По характеристикам что-то типа третьего пня (хорошо, хоть x86, а не какой-нибудь ARM или ПЦ ПОМЕР). Памяти от 64 до 128 Мб. Софт под DOS (нагло выдранный из 98 винды, видимо без всякого уведомления тов. ██████). Причем все это железо упаковано в реальный такой железный чемодан. Называется херня «█████████».

И все это надо обслуживать, сбэкапить ось и софт с «█████████» (штатную бэкапилку █████████████, а без нее «███████» может только свои данные выгружать с помощью специальной █████████████, запускаемой с «██████████████████» ████), переустановить винды где надо. В общем ад, ужас, шок, трепет и крипота с домовыми.

После интенсивных телефонных переговоров и разрытия склада с деталями был собран относительно неплохой по местным меркам «сервак» (пень четвертый, 1.7 Ггц, гиг памяти). Туда водрузили слакварь и решили поднять PXE-сервер. Поскольку секретность ™, то на █████████ повесили еще и отчетность. Т.е. ему надо составлять [ДАННЫЕ УДАЛЕНЫ], как именно он сделал то-то и то-то. И снабжать ссылками на открытые источники. Поскольку писать у █████████ получается только [ДАННЫЕ УДАЛЕНЫ], то мне придется вас немного █████████ ██████████████████. Заодно и сайт попиарю, да не забанит меня Роскомганьба (Не стоит так оскорблять нашу организацию, мы гораздо круче — примечание д-ра Б█████████).
Как-то так.

Уважаемый █████████ █████████ ██████████████████ еще раз допустите утечку информации, и/или будете в таком тоне отзываться о делах на Базе ███, или об SCP-████, которого вы пренебрежительно называете ██████, то я лично скормлю вас какому-нибудь Кетеру.
О5-█

Как сделать загрузочный 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

Дожил до светлых дней!

Слава, блин, всем богам!
В новой версии Openvpn наконец по умолчанию и без пересборки работает опция получения пароля из текстового файла. Правда блядский Openvpn таки пришлось пересобирать с опцией ./configure --disable-plugin-auth-pam, тому ще нет у меня этого самого pam и нафиг не нужно.
Ну и новая версия стала как-то стабильно работать, прошлая почему-то регулярно сегфолтилась.

Cut в стиле livejournal в блоге WordPress

В WordPress откровенно не хватает ката в стиле ЖЖ, собственно кат-то там есть, но он монументален, как египетская пирамида и неумолим, как топор палача.
Тег <!--more--> можно использовать лишь один раз в посту, и все что после него уходит в подкат.


Кат как в ЖЖ, напротив, может позволить скрыть несколько частей записи (длинные участки кода, крупные картинки) оставив остальное видимыми читателю с основной страницы блога.

Удивительно, что никто эту ситуацию до сей поры не исправил, ни разработчики, ни авторы многочисленных плагинов. Конечно, попадались всякие статьи и исходники на тему «как сделать спойлер», но это были не устраивающие меня решения на javascript или ухищрения с CSS. И одно и другое плохо, во-первых, зависимостью от конкретного браузера, а во-вторых, тем, что зря занимает канал клиента, т.к. крупная картинка под спойлером или куча текста все равно будет загружена в клиентский браузер.

Итак, необходим следующий функционал:
1. Кат в стиле живого журнала, поддерживающий изменение текста ссылки на содержимое под катом, с возможностью использоваться несколько раз в одном посту для скрытия определенных его фрагментов.
2. Сделано это должно быть без javascript и CSS.

Как устроен кат в ЖЖ.

На главной странице блога область текста, находящаяся между тегами <lj-cut> и </lj-cut> заменяется на ссылку вида http://blog.livejournal.com/1234567.html#cutid1 со стандартным текстом Read more… или текстом, заданным пользователем. Где
1234567.html — страница, содержащая полный текст поста
cutid1 — якорь [4], указывающий на начало скрываемого текста на странице поста.
Правда, в такой реализации тоже есть один минус — имена якорей генерируются автоматически, в зависимости от количества участков, скрытых под катом в посту (cutid1, cutid2... cutidN).

Ну ладно, писать, так писать, подумал я и решил добавить возможность задавать осмысленные имена якорей, например, #code, #function, #ioann_grozny_killing_son_2666_x_6666 и т.д.

Как сделать в WordPress кат в стиле Живого Журнала?

Тут на помощь придут шорткоды [1]. Можно написать плагин, реализующий такой функционал и добавляющий шорткод [lj-cut]] [[/lj-cut]

Создаем «болванку» плагина

В директории wp-content создаем поддиректорию lj-cut, а в ней файл lj-cut.php со следующим содержимым:

<?php

/*
Plugin Name: LJ-cut style cut
Description: Add Livejournal-like Cut Shortcode 
*/


function ljcut_shortcode($atts, $content=null)
{			
	
}

add_shortcode ('lj-cut','ljcut_shortcode');

?>


Информация в комментариях после Plugin Name: и Description: будет отображена в админ-панели в разделе плагинов. Plugin Name: и информация далее должна быть указана обязательно.
Функция ljcut_shortcode($atts, $content=null) обрабатывает шорткод, ей передаются движком массив с параметрами $atts и содержимое между открывающим и закрывающим тегом $content
Функция add_shortcode добавляет шорткод с указанным именем (1 параметр) и устанавливает функцию его обрабатывающую (2 параметр).

Описание и алгоритм.

Функция обработки шорткода будет вызвана каждый раз, как будет встречена в посту. Ей будут переданы параметры из массива $atts, указанные в тексте как [shortcodename param1="value1", param2="value2"].

1. Заведем 2 статических переменных:
static $cutid=0; //номер текущего cutid в посту
static $oldplink=''; //предыдущий permalink
Первая будет хранить номер текущего cutid в посту, а вторая сохранять предыдущую постоянную ссылку на пост. Переменные обязательно должны быть объявлены при помощи ключевого слова static, иначе их значения будут сброшены при каждом вызове функции.

2. Вытащим из массива $atts параметры и запишем их в соответствующие переменные. Если параметр не будет определен, то ему будет присвоено значение, указанное в кавычках после =>

extract(shortcode_atts(array(
	      'text' => 'Read more...',
	      'unicancor' => '',
	), $atts));


4. Получим URL поста, откуда была вызвана функция обработки шорткода, используя внутреннюю функцию WordPress get_permalink() [2]:
5. $plink=get_permalink(); //получаем URL текущего поста
6. Получим URL текущей страницы:
$clink=get_bloginfo('url').$_SERVER["REQUEST_URI"]; //URL текущей страницы
Функция get_bloginfo('url') получит адрес блога [3], а в элементе REQUEST_URI массива $_SERVER будет находиться значение вида /blog/post.html если пользователь читает пост на странице поста и значения вида /page/2/ (/author/tolik-punkoff/, /tag/it/), если пост читают с какой-то из страниц сайта. В первом случае необходимо показывать весь текст, во втором — заменять скрытую под катом часть на соответствующую ссылку.
7. Далее необходимо проверить, какой раз функция обработки шорткода ката вызывается из поста. Делается это путем сравнения заранее сохраненной постоянной ссылки на пост и только что полученной.
Если ранее сохраненная ссылка не такая же, как и полученная во время вызова функции, значит, мы начали обрабатывать новый пост. В таком случае отсчет текущих фрагментов, скрытых под катом, необходимо начать заново, а постоянную ссылку на новый пост сохранить в соответствующей переменной. Иначе функция была очередной раз вызвана из текущего поста, соответственно, нужно просто увеличить счетчик фрагментов под катом:

	if ($oldplink!=$plink) //пост новый, надо начать отсчет cutid заново (с 1)
	{
		$cutid=1;
		$oldplink=$plink; //и сохранить текущий 
	}
	else //мы все еще обрабатываем старый пост
	{
		$cutid++; //прибавляем значение cutid
	} 


8. Далее необходимо сравнить постоянную ссылку на пост (premalink) со ссылкой на той странице, на которой находится пользователь и если пользователь на странице поста — установить якорь [4] и вывести контент, скрытый под катом. Если пользователь на одной из страниц блога со списком постов, то выводится ссылка на пост, дополняемая указателем на якорь (http://tolik-punkoff.com/tag/it/post#ancor).
Если имя якоря задано пользователем в соответствующем параметре шорткода, то оно и используется, иначе, якорь принимает вид cutidN, где N — заранее посчитанный в переменной $cutidномер.

if ($plink==$clink)
	{
		//мы в теле поста, cut надо раскрыть и вставить якорь
		if ($unicancor=='') //если якорь не задан, используем cutidn
		{
			$ret='<a name="cutid' . $cutid . '"></a> ' .$content;
		}
		else
		{
			$ret='<a name="' . $unicancor . '"></a> ' .$content;
		}
	}
	else
	{
		//мы на одной из страниц, но не в самом посту
		//надо установить ссылку на пост и на нужный якорь в посту
		if ($unicancor=='') //если якорь не задан, используем cutidn
		{
			$ret='<a class="more-link" ' . 'href="' . $plink . '#cutid' . $cutid .
			 '">' . $text . '</a>';
		}
		else
		{
			$ret='<a class="more-link" ' . 'href="' . $plink . '#' . $unicancor .
			 '">' . $text . '</a>';
		}
	}


Сохраняем сгенерированный HTML-код в переменной $ret
9. Возвращаем сгенерированный код и завершаем функцию обработки шорткода:
return $ret;

Скачать плагин

С Pastebin
С Mega.nz
Страничка плагина на сайте HexProject
Страничка плагина на GitHub
Скачать с tolik-punkoff.com

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

1. Шорткоды в WordPress
2. get_permalink()
3. get_bloginfo()
4. Якорь (HTML)

Запускающий скрипт для 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.Коды завершения, имеющие предопределенный смысл

Небольшая заметка про безопасность WordPress-блога

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

I. Плагины.

1.Защищаемся от спама. В комплекте с WordPress идет плагин Akismet, настраивается он довольно просто и от спама защищает хорошо. Вот краткая инструкция, например.
2.Ставим капчу на вход в админ-панель, а заодно и на добавление комментариев, форму восстановления пароля с помощью плагина Securimage-WP. Настраивается он тоже несложно, хотя я особо ничего и не настраивал. Поставил, активировал, зашел в Настройки — Securimage-WP и поставил четыре галочки. Ах да, еще матан-капчу включил.

3.Можно установить плагин WP Security Audit Log и отслеживать различные действия, которые производят как пользователи сайта, так и пытаются произвести вредители. Говорят, что плагин тяжелый, но я особо этого не заметил. А вот боты в форму логина wp-login.php реально ломились нехилыми пачками и это с учетом того, что у меня не сильно известный и популярный блог. Заодно плагин отслеживает и 404 ошибки, что позволяет вовремя заметить косяки в теме оформления, тегах, структуре сайта и т.д.
4.С помощью плагина Jeba Limit Login Attempts можно ограничить количество попыток ввода логина/пароля до трех штук, после чего вход в админку будет заблокирован на 30 минут. Правда, если количество вредителей, ломящихся в админку, превышает разумные пределы, может статься, что туда будет не попасть самому. Хотя есть способ и рыбку съесть, и ног не намочить. О нем далее.

II. Переименование страницы входа.

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

Шаг 1. Оригинальный wp-login.php переименуем в любое другое название, хоть в «s4gr3gerh6hb.php».

Шаг 2. Затем заменим все слова wp-login.php на новое имя, в нашем случае на s4gr3gerh6hb.php, в файле s4gr3gerh6hb.php (старый wp-login.php) и в файле wp-includes/general-template.php [Копия в PDF]

Можно еще в .htaccess доступ закрыть, либо устроить редирект куда-нибудь, например на http://www.cia.gov или на http://natribu.org

Способ с изменением .htaccess считается самым надежным и самым ненагружающим сервер, но если не хочется/нет возможности/лень менять что-то на сервере, то можно сделать редирект и вручную средствами php [Копия в PDF]

Например так:

<?php
		header('Location: http://natribu.org', true, 301);
?>

Или вообще поизвращаться, написать свой скрипт, который будет демонстрировать визитеру рептилоидов, играющих на баяне OST X-files и вести учет IP и количества обращений к скрипту. Но это все-таки дополнительная нагрузка на сервер.

Про архиламеров Хуйла

Некое продолжение темы, развитой здесь
Отдел «К» на самом деле такие придурки, что я охуел. Склевали подставное лицо, как голуби семечки из рук гопника.
А технология-то проще, чем музыка у группы «Технология»:
1. Покупаем старый, относительно известный хотя бы в узких кругах блог, желательно вместе со всеми наработанными текстами и связанными ресурсами.
2. Нанимаем старого хозяина контент-менеджером на недолгий срок.
3. Изучаем его литературный стиль, учимся дублировать.
4. Разрываем контракт.
5. Устраиваем скандал, ведущий к «деанону» желательно в таких же узких кругах.
6. Инструктируем чела, как если что говорить с ментами.
7. Устраиваем в блоге скандал, который заинтересует ментов.
8. […] на самом деле, тут могут быть всякие дополнительные плюхи, типа установки на компьютер первоначального хозяина публичного прокси за дополнительные деньги, или даже проплата интервью региональным изданиям
9. Менты наябываются, и даже суда не получается.
10. ФАНФАРЫ! ЗАНАВЕС!

Это такой общий план проекта по наебыванию деанонимизаторов в сети, на деле, чтоб корректно все сделать, надо прикладывать разум и руки, без анализа конкретики и подстройки под ситуацию оно вряд-ли сработает, если вы такой же ламер, как сотрудники отдела «К». Но, если все продумать, то выполнить сможет даже школьник.

Как-то так.
Удачи!

Конфиги pptp для vpnbook.com

Кое-кто просил pptp-конфиги для vpnbook.com
Получите, распишитесь.

На Pastebin:

Общий конфиг options.pptp
Куда класть, понятно из конфигов пиров (помещаются в директорию /etc/ppp/peers)
vpnbook-ca1
vpnbook-de233
vpnbook-euro214
vpnbook-euro217
vpnbook-us1
vpnbook-us2

Скачать одним архивом с mega.nz

На euro-214 и 217 открыты все порты, на остальных доступен только HTTP/HTTPS, за торренты (ну так написано) могут типа по голове настучать, в смысле отрубить, но хз, я в принудительном режиме качал 100 метров, не отрубили.
217 на мой взгляд довольно падучий, 214 более стабильный, но чет последнее время тоже периодически разрывает коннект.
Сам пользуюсь в основном канадским, ну нравится мне, что сервер предоставляет моя любимая контора ZOG ЦРУ ФСБ СБУ CDC.

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