Шалости с перенаправлениями

есть в составе coreutils очень забавная команда tty. все, что она делает – это выводит путь к текущему терминалу или псведотерминалу. что-то типа /dev/tty1 или /dev/pts/1. зачем это нужно, кроме как для понтов, спросите вы? а вот зачем.

к примеру, есть скриптик, кругом красивый и интерактивный, и использующий dialog, а не обычный read или подобное, для получения данных от пользователя. и есть необходимость получить какое-то значение, и сразу загнать его в переменную, без извращений с временными файлами или иными дополнительными сущностями. классический подход var=$(command) здесь не сработает. однако наворотив вот такую конструкцию

var=$(dialog --inputbox "Enter some data" 8 60 2>&1 > $(tty))

можно спокойно получить требуемый результат

gtk-doc для eudev

все в этом мире имеет как свои хорошие, так и плохие стороны. gentoo в этом плане – не исключение. сейчас речь об их форке udev-а – eudev.

хорошее, в принципе, дело. systemd в частности и поттеринг вообще очень многих (я не исключение) крайне заебали своими закидонами. поэтому иметь подобную альтернативу крайне нужно. но вот как они развиваются? ладно, выбросили gudev, glib-овую обвязку, это, в принципе, нормально. но вот нахуя при этом еще и выпиливать gtk-doc для всего – это пионерство для меня осталось загадкой. документация по api библиотек – для лохов? программа хорошо документированная на языке программирования си?

я бы еще воспринял это изменение, если бы ребятки предоставили более-менее адекватную замену, какой-нибудь man 3 libudev или что-то наподобие. так ведь хуй там.

благо, комментарии из кода не выкинуты (пока), и gtk-doc можно запилить обратно. патч для версии 3.2.1 можно взять здесь

Читать далее «gtk-doc для eudev»

Безопасность eval

и еще раз к вопросу о пользе чтения man-ов

eval считается крайне уязвимой конструкцией, особенно на произвольных данных. дескать, подставь ; и лепи себе дальше патчи бармина, сколько душе угодно.

оно то так, но есть в bash одна очень приятная штука для борьбы с этим злом – расширитель @. позволяет экранировать всякую каку без особых извратов с echo/sed/perl/whatever

Читать далее «Безопасность eval»

Временные метки при логировании

захотелось странного – меток времени в .xsession-errors. обычно этот файлик создается простым редиректом всего выхлопа через exec > blah-blah 2>&1. а далее в ход идет bash-евская магия с сопроцессами. в результате команда приобрела следующий вид

exec > >(while read ln ; do echo "[$(date)] : $ln" >> "${TMPDIR:-/tmp}/xsession-errors.$USER" ; done) 2>&1

дальше можно уже изгаляться как угодно, фильтры там добавить, чтобы лишнее отсеять ну или кто во что горазд

по хорошему, вместо дерганья внешней date надо бы написать свою командочку для вывода, благо последние версии bash (4.4) это позволяют. но это уже как-нибудь в другой раз

FVWM и переводы gettext

в fvwm есть хорошая штука – встроенная поддержка gettext. все сроки описанные как $[gt.String] являются переводимыми. одна проблема, как это все извлечь и запихать в .po файл. руками – неспортивно, писать отдельную тузлинку – как-то чрезмерно. наиболее оптимальный вариант – внедрить поддержку этого дела в какой-нибудь из существующих инструментов.

я выбрал пакет intltool. везде его использую, реализован он на perl-е, что весьма лепо, и для подобных задач самое оно. патчик получился на удивление простеньким

Читать далее «FVWM и переводы gettext»

eject и setuid

экспериментирую тут с автомонтированием через udev с добавлением всяких собственных ништяков. pmount мне не особо нравится, к тому же надобность есть только в отмонтировании из-под пользователя, а это можно и другими средствами реализовать. наиболее приемлемым мне показался eject (из состава util-linux) со взведенным uid битом. но, как оказалось, не все так просто, как казалось. chmod ug+s /usr/bin/eject особого эффекта не дал. отмонтирование сбоило из-за недостатка прав. изучение исходников показало, что за каким-то чертом разработчики запуск umount делают весьма странным образом. после fork-а дергают sedgid(getgid()) и setuid(getuid()). сакральный смысл этих действий мне совершенно неясен, потому перед сборкой делается следующее:

sed -i 's/getgid/getegid/' sys-utils/eject.c
sed -i 's/getuid/geteuid/' sys-utils/eject.c

после этого все работает как надо

mc, less и все, все, все…

mc я давно уже собираю без редактора. их просмотрщик меня тоже изрядно выбешивает. поэтому встроенный просмотр тоже отключаю нафиг.

а что взамен? взамен православный less. кстати, ляцкий гугл на запрос “less” выдает хренову тучу ссылок на css-ное гивно. o tempora, o mores.

но чтобы less-ом можно было нормально пользоваться, нужно его малость приготовить. первое – это пара патчиков.

Читать далее «mc, less и все, все, все…»