Поставил GIMP (в Шindoшs), захотел сделать для файлов изображений контекстное меню «Редактировать в GIMP». Для этого создал reg-файл с таким содержимым (путь к бинарнику редактора нужно исправить на актуальный):
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\EditWithGIMP]
@="Редактировать в &GIMP"
[HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\EditWithGIMP\command]
@="\"C:\\Program Files\\GIMP 2\\bin\\gimp-2.10.exe\" \"%1\""
После выполнения reg-файла контекстное меню появляется.
ВНИМАНИЕ! Не запускайте эту команду, чтобы «проверить» её, так как у вашего компьютера скорее всего произойдёт сбой, влекущий за собой принудительную перезагрузку системы.
Текст бомбы:
:(){ :|:& };:
Что она делает: :() — объявление функции с именем : {:|: &} — в теле функции описан запуск её же и отправка вывода снова в функцию : (в фоне) ; — разделитель команд, как и &&. : — первый запуск функции :
Как я недавно писал тут, после переезда на VDS’ку на сервере из-за недостатка памяти стала отваливаться сессия screen’а, в которой крутится демон опроса и наполнения БД новостей Tiny Tiny RSS. Для контроля того, что screen-сессия и процесс демона опроса и агрегирования новостей запущены, я написал скриптик на похапе, который опрашивает состояние этих процессов и отображает на WEB-странице. Показать
Возможны 22 вариантов:
Скрин запущен, демон запущен: Показать
Скрин запущен, демон выпал: Показать
Скрин отвалился, демон вместе с ним: Показать
Четвёртый вариант я не привожу, так как демона не в скрине я никогда не запускаю.
Однако мне достаточно быстро надоело открывать новую вкладку со страницей статистики каждый раз, когда у меня возникало подозрение о том, что скрин/демон отвалился. Поэтому я интегрировал индикаторы работы прямо на страницу Tiny Tiny RSS.
Ищу две картинки индикаторов ON и OFF, создаю файл скрипта опроса (допустим, readerstates.php) в том каталоге, где развёрнут TT RSS, с таким содержимым:
<?php $screen=exec("ps aux | grep -e 'SCREEN -dmS reade[r]'");
$daemon=exec("ps aux | grep -e 'php <путь к скрипту демона>/update_daemon2.ph[p]'");
$scrn_t=$dmn_t='не запущен';
$scrn=$dmn='off';if($screen){$scrn='on';$scrn_t='запущен';}
if($daemon){$dmn='on';$dmn_t='запущен';}?>
<img src='/... путь к картинке .../<?php echo$dmn;?>.png' title='Демон <?php echo$dmn_t;?>' />
<img src='/... путь к картинке .../<?php echo$scrn;?>.png' title='SCREEN <?php echo$scrn_t;?>' />
После переезда моего сайта на VDS’ку шум раздолбанного вентилятора Asus EEE PC 710 перестал меня беспокоить, но теперь периодически вываливается screen-сессия, в которой крутится демон опроса и наполнения БД новостей TTRSS (чаще всего демон отваливался с ошибкой 12 «недостаточно памяти», но иногда и сам процесс скрина отъезжал).
Показать
Для повторного запуска я сначала стартовал сам скрин
screen -S reader
нажимал Enter и уже в нём запускал демона:
php <путь к скрипту демона>/update_daemon2.php
Теперь, если я вижу, что сессия скрина пропала, то стартую её заново и в ней автоматом запускаю демона:
screen -dmS reader sh && screen -S reader -X stuff "php <путь к скрипту демона>/update_daemon2.php^M"
Осталось написать демона, который будет контролировать работу запущенного демона.
Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.
Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.
Показать
<?php
// задаю необходимые переменные
$home_iface='eth0'; // интерфейс, посредством которого система включена в домашнюю сеть
$lan='192.168.120.0/24'; // определитель домашней сети (или её гостевого сегмента)
$temp_file='/tmp/dev.tmp'; // путь к временному файлу
// функция анализа и вывода MAC'а на странице
function DrawDevice() { ... }
// получаю MAC интерфейса $home_iface
$home_mac=exec("sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'");
// отображаю его на странице
DrawDevice(trim($home_mac));
// удаляю временный файл, если он есть
if(file_exists($temp_file))exec("rm -f {$temp_file}");
// сканирую сетевой диапазон $lan
exec("fping {$lan} -age -r 1 >/dev/null 2>/dev/null");
// вычленяю устройства с ответившими MAC'амм
// и записываю во временный файл,
// можно писать в базу данных для получения динамики
exec("ip n | grep 'lladdr' | awk '{print $5}' > {$temp_file}",$h);
// получаю список ответивших MAC'ов из временного файла
$h=file_get_contents($temp_file);
// и удаляю его
if(file_exists($temp_file))exec("rm -f {$temp_file}");
$mac=array();
// убираю из списка символы новой строки
$mac=explode("\n",$h);
// в цикле вывожу MAC'и
foreach($mac as$host){DrawDevice($host);}
?>
Требования:
1. в системе должен быть установлен пакет fping (или любой другой с аналогичной функциональностью, например nmap);
2. пользователь, от которого запущен WEB-сервер, обычно www-data, можно проверить командой
должен иметь возможность выполнения команды ifconfig от имени суперпользователя (sudo ifconfig) или запускать эту утилиту непостредственно по пути её расположения, обычно /sbin/ifconfig, можно проверить командой
BASH (bourne again shell) — командная среда, используемая по умолчанию во многих современных Linux-дистрибутивах. Если используется ОС из семейства Linux, то, скорее всего, используется и bash. Ниже приведены команды, опции настройки и разные трюки, придающие пользователю терминала более комфортную среду для работы (в BASH).
Показать
Настройка автодополнения и поиска в ~/.inputrc
Для одинарного нажатия Tab при автодополнении в ~/.inputrc (или в /etc/inputrc для всех пользователей)
set show-all-if-ambiguous On
Вывод по клавишам ↑ и ↓ из истории только тех команд, которые начинаются с уже набранных букв
Список исключений — через двоеточие, можно использовать шаблоны.
Эвристическое исправление ошибок а именах директорий
shopt -s cdspell
Звуковой сигнал при запуске оболочки
export PROMPT_COMMAND="echo -ne '\a'"
можно использовать по разнному, например — включить мигание окна KiTTY.
Для того, чтобы не разрывать многострочные команды, используется
shopt -s cmdhist
Если вписать
export HISTTIMEFORMAT='%d %h %Y %H:%M:%S '
то в истории будут записаны дата и время выполнения команды.
Использование регистронезависимых масок файлов
shopt -s nocaseglob
Тогда, к примеру
ls *.jpg
выведет не только *.jpg, но и *.JPG.
Хитрости BASH
Возврат в предыдущую директорию
cd -
При нажатии ESC и сразу за этим . (в терминологии *nix — Meta.) в строку подставится последний использованный объект. Например, если первой строкой набрано
ls /home/smbdy/logs
во второй наберите
rm ESC .
получите
rm /home/smbdy/logs
Реализация ввода пользовательского пароля с проверкой:
переименует ’file-with-long-name-typed-with-tab-completion.txt’ в файл с именем ’old-file-with-long-name-typed-with-tab-completion.txt’.
Функция быстрого переименования расширений
renamer() {
local fn
for fn in *."$1"; do
mv "$fn" "${fn%.*}"."$2"
done
}
Пример: renamer doc txt — переименует все доки в txt’шники в текущем каталоге.
Если определить функцию command_not_found_handle (), то можно обрабатывать ситуацию «команда не найдена». До выдачи сообщения о не обнаруженной команде bash поместит в $1 введенную строку и выполнит код этой функции. При этом, если функция возвращает код завершения 127, то сообщение о ненайденной команде будет выведено на экран.
Для добавления алиаса с автоприменением определяем новый алиас в ~/.bash_aliases
alias editalias=’edit ~/.bash_aliases && source ~/.bash_aliases’
Имейте в виду, что для работы алиасов из этого файла он должен быть явно включён в вашем ~/.bashrc:
Иногда требуется записать все, что вы вводите в терминале, для того чтобы самому запомнить, что и как делали или передать кому-то другому для анализа или обучения, или просто записать терминальную сессию вместо записи видео с захватом экрана. Все привыкли пользоватся скриншотами и записью видео с экрана. Есть даже мануалы, как делать скрины в голой консоли.
Однако существует интересный способ, как делать «видеозапись команд» в консоли без лишних телодвижений (я не говорю обо всяких доставляемых ttyrec, termrec & ipbt). Выполните в терминале, к примеру, следующие команды:
Показать
script -t 2> timing -a ttyoutput
pwd
cd /
pwd
cd -
pwd
exit
После команды exit запись с терминала прервётся и с помощью команды
scriptreplay timing ttyoutput
можно воспроизвести записанные действия и ответы системы. Для выхода можно использовать комбинацию клавиш Ctrl + D в обычном шеле или набрать exit или logout в csh (если переменная ignoreeof не задана — то Ctrl + D тоже сработает).
Для вывода списка вводимых команд без проигрывания всех действий с установленными временными интервалами достаточно ввести команду
awk '/@/' ttyoutput
А чтобы получить полный список вводимых команд и ответы интерпретатора:
awk '/./' ttyoutput
Можно даже интерактивно передавать вводмые команды, например — с помощью ключа
‒f (‒‒flush)
один пользователь вводит команды в терминал
mkfifo ttyoutput2; script -f ttyoutput2
другой — наблюдает за операциями в реальном времени с помощью
cat ttyoutput2
Сетевой обмен между удалёнными машинами можно организовать с помощью утилиты netcat.
P. S. Команды script и scriptreplay входят в пакет util-linux, поставляемый вместе с операционной системой (по крайней мере в Linux, хотя впервые утилита script появилась в системе 3.0BSD), поэтому они доступны сразу после установки системы.
P. P. S. Альтернативы — уже упоминавшиеся termrec, ipbt, ttyrec/ttyplay — имеет сходный функционал, есть утилита ttycast, осуществляющая широковещательную передачу команд терминального сеанса в реальном времени.
Также существуют такие утилиты: TermRecord@github — пишет в html и воспроизводит в браузере.
Сайты в сети Интернет не всегда хостятся на одном узле, тем более если это система разветвлённых общемировых порталов типа поисковика Google, магазина Amazon или система доставки видеоконтента Netflix. Поэтому для определённого сайта не всегда достаточно знать его доменное имя. Например, для создания правила переадресации в iptables, ipfw и прочих фаерволах нужно указать IP-адрес(а) узла назначения. Для этого я придумал такую функцию-однострочник (для удобства чтения поделена на две строки):
Допустим, нужно поменять маршрут к узлу mail.ru. В командной строке пишем gethostnets mail.ru и функция вернёт список сетей, в которых есть IP-адрес мэилрушного сайта:
Для работы необходим установленный пакет ipcalc. Не знаю, насколько этот однострочник будет полезен, но его реализация дала мне пищу для ума, писал и отлаживал я его несколько дней.
Не уверен, нужно ли делать пошаговый разбор скрипта, если кому-то нужно понять логику его работы — напишите комментарий или письмом в мою почту. Сделаю заметку-дополнение к статье.
P. S. Понял, что правильнее и аккуратнее будет искать и анализировать автономные системы, связанные с IP целевого узла. Так и провайдера можно узнать точнее. Но это тема для другой заметки...
Для работы скрипта требуются установленные в системе пакеты dialog и screen.
Показать
В конец ~/.bashrc дописать:
if [ "$SSH_TTY" ]; then
if [ ! "$STY" ] ; then
CHOICE=`~/SCREEN/choose`
if [ "$CHOICE" ]; then exec screen -dr $CHOICE; fi
fi
fi
При логине по ssh-протоколу откроется меню с выбором работы в существующих сессиях screen’а или возможностью остаться в консоли ssh-клиента. Если запущенных сессий screen’а нет — меню не откроется.
Содержимое файла ~/SCREEN/choose:
#!/usr/bin/env bash
i=0
declare -ax SCREENS
SOCKETS=`find /var/run/screen/S-$(whoami) -type p 2>/dev/null`
if [ -z "$SOCKETS" ]; then exit 0; fi
for S in $SOCKETS; do ((i=$i+1)); S=`basename $S`; SCREENS[$i]=`screen -ls | grep $S | perl -e '$s=<>; $s =~ s/^\\t(.*)\s/$1/; $s =~ s/\s/_/g; print $s'`; done
MENU=""
for ((j=1; j<=$i; j=$j+1)); do MENU="$MENU $j ${SCREENS[$j]}"; done
MENU="$MENU $j Отменить"
WHICH=`dialog --stdout --menu Select: 0 0 0 $MENU`
if [ "$WHICH" != "$j" ]; then echo ${SCREENS[$WHICH]} | sed -e 's/_(.*)$//'; fi