С няшными котэ антифа-стридэйджерами:
via polytheme@ljr
С няшными котэ антифа-стридэйджерами:
via polytheme@ljr
На Мракопедии особо не оценили, пусть тут лежит, чтоб текст не пропал. Авторы те же, я и Панкарь:
Эх, страна моя родная, край загадок и чудес.
Где еще такое счастье, где еще такой прогресс!
Под одной огромной крышей, уфонафт, НЕХ, мелкий бес
А еще любитель крипи, SCP без них ██████!
Это аномальная, аномальная квартира,
Это аномальная, аномальная страна!
Полтергейст гремит посудой — собирается братва,
Вомпер цедит кровь с бокала,уфонафт жрет шаурма,
SCP мацу заводят, черти делают шашлык,
Мракопедию читает вслух любитель крипоты!
Это аномальная, аномальная квартира,
Это аномальная, аномальная страна!
Вечером концерт заводит наша дружная семья,
Полтергейст на барабанах, вомпер в трубы дует SKA
SCP вновь напросились, доверяем синт и бас,
Крипипастер на гитаре, а соседи на ушах!
Это аномальная, аномальная квартира,
Это аномальная, аномальная страна!
Написали с товарищем ████████ новый панковский текст, вдохновившись незабвенным Механиком и его Гнилым Господом.
Съежился последний мышиный окей,
Попрятались в норы крылатые слова,
Лебедь, Рак и Щука в едином порыве
Тянут в обрыв ледяную тележку!
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Парень висит на пустых обещаньях,
Элвис клюет сакральную Корсунь,
Дикая Охота заблудилась в Москве,
Мастер пропил труп Маргариты.
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Плачет в счетчике отключенный ток,
Закуталась в шубу нейтронная бомба,
Мыши возносят молитву веганам
Следуя по рельсам в скрытый Ультхар!
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Червие, червие, червие!
Червие, червие, червие!
Червие, червие, червие!
Слава Гнилому Господу!
Дональд едет, едет
Сквозь снежную равнину
Порошок целебный
Русским он везет
Русский все отринет,
Порошок тот примет,
И печаль отступит,
И тоска пройдет!
via neilzrnpzdc_was@ljr
ЗЫ. Сегодня звонил и долго разговаривал с товарищем из ГОРФ, тот от нехуй делать смотрит раша-тв весь день, говорит, что судя по эфирам в ГОРФ 2 проблемы — Трамп и Джигурда, и что «Вашингтонский обком», походу, нихрена не шутка.
Как-то так.
Чтоб не потерять.
Автора оригинала не ведаю, но помню, что в оригинале был какой-то глюк, исправили. Вроде работает, и даже правильно. 🙂
Вставлять в начало файла functions.php
шаблона темы.
Чуть не забыл, ко вчерашнему разговору с товарищем, который про это спрашивал. Ну я тебя, товарищ, немного надул, ибо не погуглил. Не надо никаких костылей с header ('Location: http://natribu.org')
, если по каким-то причинам надо делать редирект со страниц WordPress, то есть стандартная функция
wp_redirect( $location, $status );
где:
$location
— адрес, куда посылаем.
$status
— код HTTP, статус перенаправления.
Подробности, например, тут [Копия]
Вот тестовый шорткод, работает, но где-то реально использовать тупым копипастом не сильно рекомендую, тому ще, во-первых, нет ни единой проверки, во-вторых, если он будет доступен нечестному юзеру, то юзер таким образом может перенаправить хороших пользователей на какую-нибудь бяку, а в-третьих, в мануале написано, что оно из шорткода вроде как работать не должно. Но у меня работает. Так что использовать просто как пример вызова функции wp_redirect
и внимательно читать мануал.
Если перейти в блоге WordPress по ссылке на любой тег, то попадем на страничку, содержащую анонсы постов по данному тегу, адрес странички будет примерно такой:
http://tolik-punkoff.com/tag/manuals/
Где manuals
— собственно, выбранный тег, а tag
— префикс для URL-адреса меток, который можно настроить в консоли WordPress в разделе Настройки — Постоянные ссылки.
Идея такого формата адреса достаточно очевидна, убираешь из строки адреса выбранный тег и попадаешь в список всех тегов, как например это сделано в ЖЖ или LJR
Вообще-то в профессиональной теме WordPress это дело должно бы работать из коробки, потому что вообще-то плохо, если раздел сайта, который логически существовать должен, не существует. И так думаю не я один, а как выяснилось из логов, и роботы. Правда это оказался робот какого-то мелкого поисковика, не Google или Яндекса, но все равно неприятно.
Так вот, если тема не сильно профессиональная, или разработчик забыл о такой мелочи, то посетитель сайта попадет по такой ссылке на страницу 404.
Исправляем досадную неприятность.
Не так давно я затрагивал вопрос настройки 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, или маску подсети.
У меня был GDM, поэтому приведу его как основной, остальные дам для справки.
Необходимо найти файл custom.conf
, в источниках написано, что лежать он должен по адресу /etc/gdm/custom.conf
, но на самом деле это зависит от дистрибьютива. В моем случае файл находился здесь: /etc/X11/gdm/custom.conf
В файле, который выглядит, как обычный INI-файл необходимо найти секцию [xdmcp]
и вписать туда следующие параметры:
Enable=true
Port=177
Как видите, можно задать альтернативный порт для XDMCP.
Настройка других DM:
Под катом
Внимание! Стоит заметить, что в некоторых случаях конфигурационные файлы могут располагаться в других местах. Если их нет по указанным путям, можно воспользоваться поиском файлов в том же mc
Понадобится уже упомянутый в заметке про 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
szg_akt2@ljr постоянно наезжает на «лавочников», подспудно противопоставляя их «пролетариям» и «революционерам». Про «революционеров» в некотором смысле соглашусь, потрясения, неизбежно связанные с революцией ни одному предпринимателю, собственнику, не вперлись.
НО! В текущем «капиталистическом» строе, «лавочник», т.е. мелкий собственник, предприниматель, это и есть «гегемон», великий защитник общества, который удерживает общество с одной стороны от скатывания в корпоративный фашизм, когда как в антиутопиях из НФ всем рулит какая-нибудь Umbrella или Genetics, inc. или Microsoft, а с другой стороны — удерживает государство от скатывания в гибридный (с распиздяйством, ибо чиновник не хочет работать, он хочет зарплату) государственный тоталитаризм.
Конкретный пример, две картинки:
РОССИЯ (ГОРФ, Кондопога):
Около хлебного ларька ОЧЕНЬ скользко, продавщица на вопрос товарища отвечает что-то типа «дык ведь ЖКХ не посыпало» (естественно, в ЖКХ скажут, что мы только дворы посыпаем, а у ларьков это в мэрию, а там загоняют по инстанциям между районной и городской управой, как минимум).
ФИНЛЯНДИЯ:
Службы НЕ УСПЕЛИ доехать до моей любимой кафешки по гололеду. А должны были, лавочника, хозяина кофейни не ебет, во-первых, ему НАДО, чтоб клиенты зашли в кафешку, а во-вторых, пиар тоже не лишний. В результате он доплачивает официантам, они чистят и посыпают дорожку песком, а «лавочник» зовет юриста и в его присутствии вешает на дверь объявление — «отсюда дотуда почищено и посыпано за счет Такой-то Такоговича». И я уверен, что он потом обратится в суд, высудит с мэрии компенсацию, и чиновникам придется лизать не только дорожку, которую их службы должны были очистить, но еще и жопу «лавочнику».
-Лавочник — истинный бизнесмен, работает только на себя (но работа только на себя не означает отказ от социальных проектов, это ведь в конечном итоге и в худшем случае — пиар и дополнительные клиенты)
-Лавочник стремится к оптимизированной и счастливой жизни.
-Лавочник отметает вредные мемы и психоконструкты типа «патриотизма», «государства», «бога» и прочего «корпоративного дресс-кода», когда они мешают вести ему бизнес.
-Лавочник — за науку, потому что результаты научных исследований он может применить для уменьшения накладных расходов, соответственно больше оставив себе/больше поделившись с работниками.
-Лавочник за либерализацию и за легалайз в самом широком смысле, потому что тогда открываются новые рынки.
-Лавочник за честную зарплату, ведь если платить работникам слишком мало, они будут саботировать, «а что они делают с грибным жульеном, вам лучше не знать (C)»
-Лавочник за лиьерализацию в политике и экономике, иначе ему нельзя будет работать.
-Лавочник за все хорошее, против всего плохого. Под хорошее-то можно подстроиться, ничего не потеряв, плохое требует больше усилий для оптимизации себя относительно его.
Вот и сравните, бля, на очень простом примере, страны где «лавочники» есть, а где нет. Начнете пихать гнилую моральку про «сопли сирийских детей», тоже найду что ответить.
Удачи!
Ребята, да, капча сломалась, но это не повод так набигать, кроме каптчи есть еще куча методов от вас избавиться. Но если все-таки вам хочется, чтобы автор данного блога перешел по ссылке (другие пользователи не увидят, а я от скуки читаю), то прошу, скидывайте ссылки на гей-БДСМ порно с мелкими пацанами, как говорится, хорошее дело сделаете, и админу (т.е. мне), и SUPO.
Сковородки, виагра и кредиты в Ощаде не интересуют, спасибо.
На самом деле делалось не для совсем сервера, но тем не менее. Стоит, в общем, на одном заводике в одной из стран СНГ аппарат по переработке пластиковых отходов в пластиковые полезности, управляет им комп с 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
В файле /etc/sudoers
как раз и описывается, какие пользователи и группы имеют возможность пользоваться утилитой sudo
, временно повышая свои права до root, и какие команды им разрешено выполнять без пароля.
Этот файл руками лучше не редактировать, а всегда делать это с помощью команды visudo
:
Файл настроек /etc/sudoers всегда следует редактировать с помощью команды visudo. visudo блокирует файл sudoers, сохраняет изменения во временный файл и проверяет, что файл грамматически корректен, перед тем как скопировать его в /etc/sudoers.
Важно:
Крайне важно, чтобы файл sudoers был без синтаксических ошибок! Любая ошибка делает sudo неработоспособным. Всегда редактируйте его только с помощью visudo для предотвращения ошибок. [1]
Но есть небольшая проблема, 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
в конце заметки).
Для разрешения пользоваться командой 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 [Копия]
Понадобилось распаковывать deb-пакеты, чтобы вытащить из них некоторые программулины, для других версий Linux не собранные. Решил распаковку deb-пакетов автоматизировать и написать скрипт, распаковывающий, а точнее разбирающий на составные части все deb-пакеты, находящиеся в текущем каталоге.
Кратко и по рабоче-крестьянски, что такое deb-пакет. Фактически, это архив формата ar
, содержащий бинарные файлы программы, скрипты, необходимые пакетному менеджеру Debian для установки/удаления пакета и всякую служебную информацию, вроде контрольных сумм и прочего.
Нас интересуют бинарные файлы и неплохо бы посмотреть на предустановочные скрипты, ну мало ли чего там интересного и важного обнаружится. Установочные скрипты внутри архива ar
сжаты в архив control.tar.gz
, а вот бинарники находятся в архиве data.tar.??
, где вместо ??
может быть .gz, .xz
и т.д., в зависимости от того, что для сжатия бинарников было использовано. В архиве data
сохранена структура каталогов, идентичная каталогам в системе, куда будет установлен пакет, примерно как в пакетах Slackware (только структура каталогов, естественно, специфична для Debian-подобных Linux). В архиве control.tar.gz
могут содержаться скрипты конфигурирования, из которых наиболее интересны preinst
, выполняемый на Debian перед распаковкой пакета, и postinst
, выполняемый, когда пакетный менеджер распаковал бинарники в целевую систему. Естественно, просто так их выполнять не советую, но если делать из deb-пакета пакет Slackware, то не лишним будет с этими скриптами ознакомиться и буде там что нужное, передрать в doinst.sh
Определим основные переменные:
#!/bin/bash
DATADIR="./data" #директория, куда класть архивы с бинарниками
CONTROLDIR="./control" #... с управляющими скриптами
CURDIR="" #Текущая директория
Вывод краткой справки по использованию скрипта:
if [ "$1" == "-h" ]; then #print help echo "Unpacking all *.deb packages in current directory" echo "use" `basename "$0"` "[-c]" echo "-c - delete files in out-dirs" exit fi
Выводим информационное сообщение и создаем каталоги для хранения архивов с бинарниками и управляющими скриптами:
echo "Unpacking all *.deb packages in current directory"
echo "Making out-dirs... $DATADIR $CONTROLDIR"
mkdir $DATADIR
mkdir $CONTROLDIR
Если при запуске скрипта был указан ключ -c
, то очищаем содержимое директорий для хранения распакованных файлов:
if [ "$1" == "-c" ]; then echo "Clear out-dirs..." CURDIR=`pwd` cd $DATADIR rm * cd $CURDIR cd $CONTROLDIR rm * cd $CURDIR fi
С помощью команды find
получим список всех deb-пакетов (*.deb
) в текущей директории:
echo "Processing:"
F=`find . -name "*.deb" -type f`
где:
. (точка)
— указание команде find
искать в текущем каталоге.
-name
— после этого ключа задается нужная нам маска файла ("*.deb"
)
-type f
— искать только файлы (не каталоги, подпадающие под шаблон).
Результат отправляется (``
) в переменную $F
, которую обрабатываем в следующем цикле for
:
for FILE in $F
do
...
done
Что делаем в цикле:
Вызываем архиватор ar
с параметром t
, это выведет список файлов в архиве, потом при помощи grep
получаем имя архива data
с бинарниками (напомню, оно разное может быть, в зависимости от того, чем бинарники сжаты):
DATAPKG=`ar t ${FILE}|grep "data"`
Аналогично поступаем и с архивом control
, содержащим управляющие скрипты:
CONTROLPKG=`ar t ${FILE}|grep "control"`
Получаем имя deb-пакета без расширения (ключ -s ".deb"
команды basename
):
BASENAME=`basename -s ".deb" ${FILE}`
И расширения для содержащихся в deb-пакете архивов с бинарниками и скриптами:
EXTDATA=`echo $DATAPKG|sed 's/data//g'`
EXTCONTROL=`echo $CONTROLPKG|sed 's/control//g'`
echo "${FILE} : $DATAPKG, $CONTROLPKG"
Идея в том, чтобы при разборе пакета поименовать каждый архив также, каково имя пакета, присвоив правильное расширение, чтоб, если пакет не один, было понятно — какой архив от какого пакета, и чтоб они друг друга не затерли.
Вытаскиваем архивы из пакета:
ar -p "$BASENAME.deb" $DATAPKG > "$DATADIR/$BASENAME$EXTDATA"
ar -p "$BASENAME.deb" $CONTROLPKG > "$CONTROLDIR/$BASENAME$EXTCONTROL"
После запуска скрипта в каталоге, содержащем deb-пакеты, будкт созданы два подкаталога, содержащие архивы с бинарниками и архивы с инсталляционными скриптами.
Их уже можно распаковать стандартными tar’ом и gzip’ом или посмотреть их содержимое с помощью mc
На PasteBin
Скачать с Mega.nz
1. Архиватор ar
2. Структура deb-пакета
3. Цикл for
4. Распаковка пакета deb
5. basename --help
Ух и задолбался же я с этими самыми переводами строк! Возникла тут задачка конвертировать кучу огромную текстовых файлов из DOS/Windows (перенос строки CR+LF, h0D, h0A), старого Mac-формата (CR, h0D), который, вопреки утверждениям Википедии и других авторитетных источников использует не только вышедшие из употребления Маки, в формат Linux (LF, h0A). Желательно иметь возможность еще и обратной/произвольной конвертации между всем этим зоопарком. Сначала я, конечно, попробовал написать универсальный скрипт с помощью sed
, но никакой универсальности не получилось. На C++, ой, после C# это все равно, что пересесть с мерседеса на велосипед. На C# задача в строчки 4 кода решается, но тащить ради маленькой утилиты Mono, это уж слишком
В общем нашел готовую крохотную утилиту flip
.
Плюсы:
+ Есть готовые версии почти под все платформы, кроме DOS, даже статически откомпилированный бинарник для Linux, так что можно задуть в роутер/initrd, если оно кому-то там надо.
+ Бесплатно
+ Есть исходники
+ Работает моментально
+ Поддерживает файлы с перепутанными концами строк (где есть и Windows, и UNIX и Mac варианты)
Минусов пока не нашел.
Использование простое: первый параметр, что конкретно делаем, остальные — имена файлов через пробел.
Делать можно следующее:
-t
— отобразить используемый тип переноса строки
-d
— конвертировать в DOS/Windows формат (CR+LF)
-m
— конвертировать в Mac-формат (CR)
-u
— конвертировать в UNIX/Linux формат (LF)
Скачать можно со странички автора или отсюда:
1. Исходник
2. Slackware-пакет
3. Версия для Windows (консольная)
4. Все остальное
Недавно нашел няшную чОрную панель с меню Пуск для всяких там WM, у меня стояла на Openbox, но скрины будут с IceWM. Давно искал такую легковесную, простенькую и при этом няшную (чОрную, как мой кот) панель. Да, изначально была идея найти панель под цвет кота.
Правда, проект довольно старый и походу издох естественной смертью, но мне нравится.
Может находиться и снизу:
Статья и описание на Хабре
Скачать бинарный пакет для Slackware с Mega.nz
ЗЫ. Сборка: сообщество PuppyLinux Rus. Пакет для Slackware мой.
Пост, скорее из серии, «чтоб не пролюбить, и самому потом долго не искать», чем конкретная детальная инструкция. Понадобился мне PolicyKit для GDM под x86 Slackware (14.1), из коробки его нифига не было, во всяком случае в нужном дистрибьютиве, пришлось собирать. Не буду детально описывать геморрой со сборкой, ибо зачем вам описание четырех кривых рук из двух стран, хехе. Наибольший геморрой случился с правильной сборкой требуемой ему библиотеки mozjs-17.0
, то ли я дурак, то ли оно изначально криво, но оригинал не собирался, ставился не туда, загаживал систему какими-то лишними файлами под 200 Мб, в общем тьфу и ужоснах. Совместными усилиями были найдены нужные слакбилды, так что тут краткая заметка для себя.
1. Собираем упомянутый mozjs-17.0 (aka js-185)
Sources
SlackBuild
Binary package (готовый собранный пакет) для x86 (i386) Slackware
2. Собираем polkit-0.133 (polkit-1)
Sources
SlackBuild
Binary package (готовый собранный пакет) для x86 (i386) Slackware
3. Наконец, собираем polkit-gnome (polkit-gnome-authentication-agent-1)
Sources
Binary package (готовый собранный пакет) для x86 (i386) Slackware
1 и 2 собираются стандартно
1. Распаковываем SlackBuild из архива в отдельный каталог.
2. Копируем туда архив с исходником.
3. Запускаем в этом каталоге ./Название_программы.SlackBuild Архив_с_исходниками.tar.gz
Финальный пакет замечательно соберется с помощью src2pkg
, если первые установлены.
Да, чуть не забыл, само дерево жужжать не будет, т.е. polkit-gnome-authentication-agent-1
автоматически не запустится, его надо прописать в какую-нибудь иксовую автозагрузку и после того, как стартуют иксы, GDM и будет сформировано окружение пользователя, т.е. или в скрипт Xsession
добавить строку /usr/libexec/polkit-gnome-authentication-agent-1 &
или добавить его в автозагрузку приложений, как описано, например, здесь
Позже я вернусь к описанию автозагрузки иксовых программ отдельно, во всяком случае опишу автозапуск в GDM и IceWM
Попросили разобраться тут с одной небольшой проблемой, при старте X-server’а и вообще графического окружения выполнялось ненужное, и даже вредное автоматическое монтирование USB-устройств. На подключенных к терминальному серверу флешках хранились ключи для бухгалтерии.
Проблема была в том, что подключающимся через XDMCP к графической оболочке пользователям, автоматически становились доступны подключенные к серверу носители USB.
Было известно, что графический интерфейс представляет собой связку GDM, IceWM в качестве desktop-manager’а и SpaceFM в качестве файлового менеджера. Исследование было недолгим, ибо такая конфигурация по умолчанию применяется в Absolute Linux, легковесном дистрибьютиве Slackware, который я же и посоветовал этой фирме года 3 назад 🙂
В автомонтировании был виновен SpaceFM, файловый менеджер. Поскольку, в самом менеджере все настраивается через графический интерфейс, и изменить настройки (локальные) может любой пользователь, то надо было искать другой выход.
Монтирование SpaceFM, естественно, осуществляет не сам, а использует udevil
. Соответственно, наиболее простое, быстрое и секурное решение — подправить конфиг udevil
. Выкладываю финальный параноидальный вариант, где udevil
запрещено монтировать все, что не было примонтировано до старта графической оболочки, и от любых пользователей (сменные носители, сетевые шары, оптические носители). Хотите монтировать — добро пожаловать в sudo
.
Конфиг: /etc/udevil/udevil.conf
Конфиг прекрасно документирован, правда на буржуйском, так что его можно переделать под свои нужды.
Как-то выкладывал конфигурационные файлы для 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} '
Записываем результат в переменную VPNBOOKPASS
, обернув всю команду в обратные кавычки (``
)
Далее устанавливается размер массива, хранящего имена файлов настройки (специально так сделал, чтобы если добавится еще один файл конфигурации, количество обрабатываемых файлов обновлялось автоматически): CTR="${#PEERSFILES[*]}"
Далее инициализируется счетчик цикла I="0"
В цикле из массива извлекаются имена файлов, к ним добавляется путь к директории их содержащей, и эти данные передаются функции passwork
, которая получает пароль, сохраненный в файле конфигурации, и в случае необходимости его меняет на пароль, полученный с сайта.
until [ "$CTR" -eq "$I" ]; do passwork $PEERSDIR${PEERSFILES[I]} let "I+=1" done
Этим в скрипте занимается отдельная функция 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 в который можно добавить свои программы, загружаемый по сети или с 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 True Image for DOS
Как выглядели первые версии Windows
Windows 1.03
Впрочем, можете сами скачать и поиграться:
Windows 1.03 (осторожно, венда хранится в рашке)
Windows 2.01 (осторожно, венда хранится в рашке)