С другого tty я могу запустить
DISPLAY=:0 notify-send hullo
и увидеть сообщение в моем сеансе работы с зубочисткой. Но если я войду в систему как root, это не сработает. Нет и
USER=toothrot DISPLAY=:0 notify-send hullo
Как мне заставить его работать от root?
Мне это нужно, потому что я хочу создать правило udev, которое влияет на мой сеанс x. Используя Arch.
X может иметь два способа авторизации клиентов.
Один способ - использование cookies; тогда вам нужно установить DISPLAY=:0
и XAUTHORITY=/home/yourusername/.Xauthority
.
В вашем случае я предполагаю, что это делается с помощью xhost, иначе установки DISPLAY было бы недостаточно. Введите xhost
, чтобы увидеть, кто авторизован.
Возможно, у вас есть cookie ~/.Xauthority
вместе с xhost +SI:localuser:toothrot
авторизацией.
Вы можете разрешить root доступ к дисплею :0 с помощью DISPLAY=:0 xhost +SI:localuser:root
, но вы должны сделать это как обычный пользователь. Использование cookie - лучший способ:
DISPLAY=:0 XAUTHORITY=/home/toothrot/.Xauthority notify-send hullo
Чтобы выполнить notify-send от имени пользователя:
su toothrot -c 'DISPLAY=:0 XAUTHORITY=/home/toothrot/.Xauthority notify-send hullo'
Предположительно, вы давно решили свою проблему, но для полноты картины общее решение взято (из здесь):
$ my_user="toothrot"
$ my_user_id=$(more /etc/passwd | awk -F: '/^'${my_user}':/ {print $3}')
$ sudo -u $my_user DISPLAY=':0' DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${my_user_id}/bus /usr/bin/notify-send "hullo"
Если у вас есть несколько экранных сеансов, ваш пробег может различаться в зависимости от DISPLAY=" :0" выше. Хотя это для другого поста.
Приведенные выше ответы несколько корявые и не работают корректно для нескольких пользователей или нескольких дисплеев. Может произойти атака с повышением привилегий, если пользователь создаст символическую ссылку ~/.Xauthority
на защищенный файл. Альтернативой может быть полное забвение udev
и использование вместо него uudev , который запускается не как -root в вашем собственном X-сеансе. Вы только что создали файл ~/.config/uudev.conf
, который содержит:
* ACTION="bind", DRIVER="whatever",...
notify-send hullo
Если вы запустите systemctl --user restart uudev
из файла ~/.xsession
или ~/.xinitrc
, то notify-send
просто запустится с уже установленными соответствующими переменными DISPLAY
и XAUTHORITY
.