Из следующих вопросов
мы видим, что gksu больше не будет поддерживаться в долгосрочной перспективе, и он не будет установлен по умолчанию с> = 13.04. Вместо этого мы должны использовать pkexec, который прекрасно работает для неграфических приложений, но не для приложений в графическом интерфейсе:
pkexec gedit
при замене gksu в файле .desktop
EXEC=pkexec /usr/bin/gedit
или Когда я запускаю скрипт Python для запуска графического приложения с правами root, я получаю следующую ошибку:
>>>subprocess.Popen(['pkexec','gedit'])
** (gedit:3203): WARNING **: Could not open X display
Как мне переписать мои скрипты или мои файлы .desktop для поддержки диалога аутентификации и запустить приложение от имени пользователя root, если у меня не будет зависеть от gksu?
Сначала создайте файл действия .policy
в /usr/share/polkit-1/actions/
. Принято называть файлы действий «иерархическим» способом поставщика, например com.ubuntu.pkexec.gparted.policy
или org.debian.apt.policy
, а затем вставить следующий контент:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<action id="org.freedesktop.policykit.pkexec.run-[Short Program Name]">
<description>Run [Full Program Name]</description>
<message>Authentication is required to run [Full Program Name]</message>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">[Full Program Path]</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
</action>
</policyconfig>
Заменить [Short/Full Program Name/Path]
на соответствующий значения, например gedit
, gedit Text Editor
и /usr/bin/gedit
. Значение <action id>
не обязательно должно соответствовать выбранному имени файла (и один файл может содержать несколько действий), но условно имя файла является префиксом для всех его действий.
После сохранения файла определенная программа будет работать с X и графическим интерфейсом и так далее.
Еще одно исправление: добавьте следующую строку в /etc/pam.d/polkit-1:
необязательный сеанс pam_xauth.so
blockquote>
Еще одно исправление для пользовательских скриптов: определите соответствующие переменные среды внутри вашего скрипта.
Вы можете использовать фрагмент, подобный следующему, чтобы сделать это:
getXuser() {
user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
if [ x"$user" = x"" ]; then
startx=`pgrep -n startx`
if [ x"$startx" != x"" ]; then
user=`ps -o user --no-headers $startx`
fi
fi
if [ x"$user" = x"" ]; then
user=$(pinky -fw | awk '{ print $1; exit; }')
fi
if [ x"$user" != x"" ]; then
userhome=`getent passwd $user | cut -d: -f6`
export XAUTHORITY=$userhome/.Xauthority
else
export XAUTHORITY=""
fi
export XUSER=$user
}
for x in /tmp/.X11-unix/*; do
displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
getXuser;
if [ x"$XAUTHORITY" != x"" ]; then
export DISPLAY=":$displaynum"
fi
done
(на основе функции ACPI getXuser
)
Если файл .desktop
все еще не найден не работает, вы можете попробовать обернуть ваш pkexec commandline
во фрагмент sh
, например:
Exec=sh -c "pkexec --user root script_that_needs_root.sh"
Последняя проблема - известная ошибка, по-видимому:
http: / /bugs.debian.org/cgi-bin/bugreport.cgi?bug=690339
https://bugzilla.xfce.org/show_bug.cgi?id=9373