Ребята, да, капча сломалась, но это не повод так набигать, кроме каптчи есть еще куча методов от вас избавиться. Но если все-таки вам хочется, чтобы автор данного блога перешел по ссылке (другие пользователи не увидят, а я от скуки читаю), то прошу, скидывайте ссылки на гей-БДСМ порно с мелкими пацанами, как говорится, хорошее дело сделаете, и админу (т.е. мне), и SUPO.
Сковородки, виагра и кредиты в Ощаде не интересуют, спасибо.
Удаленная перезагрузка сервера под управлением Linux. Перезагрузка Linux без ввода пароля.
На самом деле делалось не для совсем сервера, но тем не менее. Стоит, в общем, на одном заводике в одной из стран СНГ аппарат по переработке пластиковых отходов в пластиковые полезности, управляет им комп с Linux на борту, а компом из будочки рядом управляет оператор с рабочего места с обыкновенной виндой. Комп с Линуксом надо иногда перезагружать, отключать, а в штатном ПО аппарата эту возможность почему-то не встроили. Раньше оператором был довольно умный парень, которому и root-пароль можно было доверить, и ssh, но он уволился, напоследок создав два батника примерно такого содержания:
plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 reboot
plink -ssh -P 22 -l root -pw rutoviiparol 192.168.0.40 poweroff
Бардак сущий, под root ходить для перезагрузки никуда не годится, да еще и хранить рутовый пароль в открытом виде. Можно, конечно, было бы подправить батник, сделав вход под юзерской учеткой, но sudo было криво настроено и все равно оператору бы пришлось для перезагрузки вводить пароль.
Завести на сервере отдельных пользователей «для отключения» и «для перезагрузки» и настроить все так, чтобы при входе этих пользователей по ssh автоматически выполнялось выключение или перезагрузка, при этом не требовался ввод пароля, создать соответствующие bat-файлы на операторском рабочем месте.
Первым делом понадобится группа для этих пользователей. Самая простая операция. Назовем группу, например powermanager и создадим ее (естественно, здесь и далее все команды, требующие root-доступа делаются из-под учетки root или через sudo).
groupadd powermanager
В файле /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-пакеты
Понадобилось распаковывать 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
Универсальный конвертер символов перевода строки (Windows\Mac\Linux)
Ух и задолбался же я с этими самыми переводами строк! Возникла тут задачка конвертировать кучу огромную текстовых файлов из 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. Все остальное
Няшная панель Qtpanel для Openbox и других WM для Linux
Недавно нашел няшную чОрную панель с меню Пуск для всяких там WM, у меня стояла на Openbox, но скрины будут с IceWM. Давно искал такую легковесную, простенькую и при этом няшную (чОрную, как мой кот) панель. Да, изначально была идея найти панель под цвет кота.
Правда, проект довольно старый и походу издох естественной смертью, но мне нравится.

Скрин из оригинальной статьи
А так она выглядит на терминальном сервере подшефной фирмы, куда я ее смеха ради и вас для задул на время:

По клику доступно
Может находиться и снизу:

По клику доступно
Статья и описание на Хабре
Скачать бинарный пакет для Slackware с Mega.nz
ЗЫ. Сборка: сообщество PuppyLinux Rus. Пакет для Slackware мой.