Improperly set display when running в root crontab job involving GUI

When running the рукописный шрифт below from my локальный user crontab, with sudo before /usr/bin/FreeFileSync (last script's line), в small progress window opens on my GUI and things go well. The only thing is I have to неудар в лунку my вспотел passwd, which makes it интервключите and somewhat unwieldly.

Root privileges пахал necessary to run FFS, otherwise it complains about not having rights to get to some directories and поля being backed up.

  #!/bin/bash
  # define default display and pass it on to any child process
  # from within the running shell
  DISPLAY=:0.0
  export DISPLAY

  /usr/bin/FreeFileSync /home/user/bu-1.ffs_batch 2> \ 
     /home/user/bu-1.ffs_log 

When I call the same рукописный шрифт from my root crontab with sudo crontab -e, FreeFileSync never gets to run because of the following ошибка:

$ cat /home/user/bu-1.ffs_log
16:35:01: Error: Unable to initialize GTK+, is DISPLAY set properly?

Схвати хан be seen, I haveexport DISPLAY=:0.0 within the рукописный шрифт and my root crontab file is equipped with:

  $ sudo crontab -e | head -4
  [sudo] password for user:

  1 SHELL=/bin/bash
  2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  3 HOME=/
  4 MAILTO=root

Хан someone help troubleshooting the ошибка?

EDIT: Could it be that running this from root's crontab fails because user root эксперт не open session and therefore не stdout to which to display? Хан I circumvent that difficulty by asking root to display to в current user's session's stdout? It seems to be worth в shot if doable; if so how do I do that?

0
задан 7 August 2015 в 15:01

1 ответ

Вы могли настроить sudo не нуждаться в пароле для конкретной команды и вернуться к использованию некорневого крона. Для этого, принимая идентификатор пользователя "пользователя" хочет выполнить команду FreeFileSync как корень, создайте файл /etc/sudoers.d/user с

user ALL = NOPASSWD: /usr/bin/FreeFileSync

Команда должна быть дана с полным путем. Если Вы явно не перечислите args к команде, то любой args будет позволен sudo. Замена ALL Вашим именем хоста (не localhost), чтобы быть более безопасным.

Это принимает файл /etc/sudoers имеет строку: (обратите внимание, что # не является комментарием),

#includedir /etc/sudoers.d

В противном случае затем просто добавьте пользовательскую запись в/etc/sudoers. Будьте тщательным редактированием этого файла: используйте visudo или удостоверьтесь, чтобы у Вас были зарегистрированный корень или корень выполнения оболочки, чтобы смочь сделать любые восстановления.

У Вашего пользователя crontab запись может затем просто быть команда:

DISPLAY=:0.0 sudo /usr/bin/FreeFileSync /home/user/bu-1.ffs_batch 2>/home/user/bu-1.ffs_log

человечность sudo сохранит некоторые переменные среды для команды включая ДИСПЛЕЙ и ДОМОЙ (см. вывод sudo sudo -V) таким образом, программа сможет считать ~/.Xauthority, файл (продолжите читать для деталей).


С другой стороны, продолжать использовать корень crontab: если, когда Вы делаете ps alxww|grep X Вы находите свой сервер X11, работающий с -auth опция, что-то вроде этого:

/usr/bin/X :0 ... -auth /var/run/lightdm/root/:0 ...

это означает, что клиенты должны соединить использование секрета в файле /var/run/lightdm/root/:0. Этот файл содержит копию секрета в пользователе ~/.Xauthority файл. Этот "секрет" является просто произвольным случайным числом. Если Вы - корень, можно считать оба файла, таким образом, клиент может просто обеспечить в среде:

XAUTHORITY=/var/run/lightdm/root/:0

С другой стороны, можно установить ДОМ на того из пользователя дисплея, HOME=/home/user так, чтобы право .Xauthority файл найден там.

С другой стороны, можно экспортировать секрет от этого до дома корня:

xauth -f /home/user/.Xauthority nextract - localhost/unix:0 | sudo xauth -f /root/.Xauthority nmerge -

и затем XAUTHORITY =/root/.Xauthority или просто РАЗМЕЩАЮТ =/root.

1
ответ дан 4 October 2019 в 00:30

Другие вопросы по тегам:

Похожие вопросы: