Проблема: ACPI-скрипты, поставляемые по умолчанию с Debian, по нажатию кнопки питания тихо гасят систему, ничего не спрашивая и успешно забивая на несохранённые пользовательские данные.
РешениеРешение: модифицируем соответствующие скрипты, а точнее, /etc/acpi/powerbtn-acpi-support.sh. В моём случае он принадлежит пакету acpi-support-base версии 0.109-6. В нём содержится следующая строка:
if [ `CheckPolicy` = 0 ] ; then
Перед ней мы и вставляем свой обработчик:
# If KDE is running, let it process the acpi event
if pidof ksmserver; then
export DISPLAY=:0
user=$(who | sed -n '/ (:0[\.0]*)$\| :0 /{s/ .*//p;q}')
home=$(getent passwd $user | cut -d: -f6)
XAUTHORITY=$home/.Xauthority
[ -f $XAUTHORITY ] && export XAUTHORITY
/bin/su -p -c '/usr/bin/qdbus org.kde.ksmserver /KSMServer logout -1 -1 -1' $user
exit 0
fi
Часть кода взята из пакета eeepc-acpi-scripts согласно лицензии GPL 2.upd.: Внимание!!! Скрипт обновлён!!! Предыдущая версия скрипта содержала уязвимость, позволяющую пользователю запускать произвольный код с правами
root.
Описание уязвимостиУязвимый код приведён ниже:
. "$home/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0"
export DBUS_SESSION_BUS_ADDRESS
Он был найден в блоге samwise_and_the_stereotypical в поисках способа заставить работать qdbus под рутом. Однако под рутом оно всё равно не заработало, а при запуске от пользовательского аккаунта работает и без явного указания переменной DBUS_SESSION_BUS_ADDRESS.
Таким образом, если вы уже успели установить этот скрипт, то эти две строки должны быть удалены. Если вы только собираетесь его устанавливать, новая версия их не содержит и должна быть безопасной. Спасибо AEP за багрепорт.Вывод: при использовании чужого кода сначала поймите, как этот код работает.