По нескольким причинам я хочу запустить браузер от имени другого системного пользователя на моем компьютере Fedora.
На данный момент я создал отдельного системного пользователя с именем sandbox
и создал пользовательский ~/.local/share/applications/chrome-sandboxed.desktop
файл для Google Chrome с моим пользователем:
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
StartupNotify=true
Type=Application
Categories=Network;WebBrowser;
MimeType=x-scheme-handler/unknown;x-scheme-handler/about;text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
Name=Google Chrome (sandboxed)
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable %U && true"
Icon=google-chrome
Actions=new-window;new-private-window;
[Desktop Action new-window]
Name=New Window
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable && true"
[Desktop Action new-private-window]
Name=New Incognito Window
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable --incognito && true"
После некоторой борьбы и исследований я обнаружил, чтоМне нужно разрешить sandbox
пользователю открывать окна в моем сеансе с помощьюxhost +SI:localuser:sandbox
и чтокоманду pkexec
пришлось заключить в отдельную sh -c ""
команду, которая заканчивается на&& true
так как в Gnome это не работает иначе. Я даже получил этоустановить в качестве браузера по умолчанию, запустивxdg-settings set default-web-browser chrome-sandboxed.desktop
, поскольку ранее он не отображался в графическом интерфейсе инструмента для выбора приложений по умолчанию.
Теперь единственное, что меня беспокоит, это то, что мне приходится вводить пароль каждый раз, когда я нажимаю на ссылку в другом приложении (например, Thunderbird), чтобы пройти аутентификацию pkexec
и запустить программу от имени другого пользователя (хотя затем приложение поймет, что процесс уже запущен, и откроет ссылку в новой вкладке существующего окна, но я предполагаю, что эта логика реализована в самом приложении и, следовательно, может сработать только после того, как будет выполнена аутентификация и процесс будет запущен).
Поскольку мне все равно, сможет ли мой пользователь получить доступ к sandbox
материалам пользователя (я хочу предотвратить как раз обратное), я бы хотел сделать это без пароля. Хотя я не уверен, как этого добиться.
Я читал, что это можно сделать, создав policykit
ACL. Но так как я не хочув целомотключить запрос пароляи я понятия не имею о названии пользовательского "приложения", котороекажется, имеет значение для тонкой настройки конфигурации(если я правильно понял синтаксис в ответе) Я не знаю, как отключить запрос пароля только для этого приложения (и, возможно, для других в будущем).
Любая помощь будет высоко оценена.
PS: Извините, тег, sudo
возможно, сбивает с толку, но для создания нового тега мне понадобится 300 репутации (которой у меня нет) pkexec
.
РЕДАКТИРОВАТЬ
Получилось с подсказками отпользователь1686'sотвечать.
Во-первых, (если его еще нет) создайте policykit
файл пользовательской политики для настройки action id
нужной программы — в моем случае (обратите внимание, что в этом случае по- прежнему требуется /usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy
политика по умолчанию ):auth_admin
<?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>
<vendor>Google</vendor>
<vendor_url>https://www.google.com</vendor_url>
<icon_name>google-chrome</icon_name>
<action id="com.google.chrome.sandboxed">
<description>Run Google Chrome as another user</description>
<message>Authentication is required to run Google Chrome as another user</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/google-chrome-stable</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
Затем создайте пользовательское правило, разрешающее выполнение действия без пароля с настройкой action id
( com.google.chrome.sandboxed
здесь) только для вашего пользователя - в моем случае /var/lib/polkit-1/localauthority/50-local.d/10-passwordless_chrome-sandboxed_from_myuser.pkla
:
[No pkexec password prompt for myuser when running chrome-sandboxed]
Identity=unix-user:myuser
Action=com.google.chrome.sandboxed
ResultActive=yes
После этого удалите все вхождения env DISPLAY=$DISPLAY
из вашего .desktop
файла, в противном случае pkexec
попытается выполнить env
от имени другого пользователя вместо /usr/bin/google-chrome-stable
. Какпользователь1686Как было отмечено, требуемые переменные среды автоматически наследуются дочерним процессом, так что они в любом случае больше не нужны.
Возможно, вам придется systemctl reload polkit.service
или systemctl restart polkit.service
, но я в этом не уверен, так как сначала думал, что именно из-за этого у меня не работает — хотя я просто забыл изменить свой .desktop
файл.
Теперь все работает так, как и ожидалось.
решение1
Вот как это делает GParted:
<?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>
<vendor>The GParted Project</vendor>
<vendor_url>https://gparted.org</vendor_url>
<icon_name>gparted</icon_name>
<action id="org.gnome.gparted">
<description>Run GParted as root</description>
<message>Authentication is required to run the GParted Partition Editor as root</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gparted</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
Обратите внимание на два <annotate/>
тега.
При установке этой политики простому pkexec /usr/bin/gparted
набору политик автоматически назначается другой «идентификатор действия» (чтобы вы могли определять разные значения по умолчанию, а также сопоставлять его с пользовательскими правилами). Вам также не нужно вручную передавать $DISPLAY – pkexec автоматически скопирует все необходимые переменные.