出於多種原因,我想在 Fedora 盒子上以不同的系統使用者身份運行瀏覽器。
現在,我創建了一個名為Google Chrome 的單獨系統用戶sandbox
,並使用我的用戶建立了自訂檔案:~/.local/share/applications/chrome-sandboxed.desktop
#!/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
,因為它之前沒有出現在用於選擇預設應用程式的 GUI 工具中。
現在唯一困擾我的是,每次單擊另一個應用程式(即 Thunderbird)中的連結時,我都必須輸入密碼以進行身份驗證pkexec
並以另一個用戶身份運行該程式(即使它隨後會意識到已經有一個正在運行的進程並在現有視窗的新選項卡中打開連結 - 但我猜該邏輯是在應用程式本身中實現的,因此只能在身份驗證發生並且進程啟動後才能參與)。
由於我不關心我的用戶是否能夠存取sandbox
用戶的內容(這是我想阻止的相反方式),所以我想執行無密碼操作。不過,我不確定如何實現這一目標。
我讀到可以透過創建policykit
ACL 來完成。但既然我不想一般來說停用密碼提示我不知道自訂“應用程式”的名稱,似乎與微調配置相關(如果我正確理解了答案中的語法)我不知道如何停用此應用程式的密碼提示(也許將來還會有更多應用程式)。
任何幫助將不勝感激。
PS:抱歉,該標籤sudo
可能令人困惑,但我需要 300 聲譽(我沒有)才能建立新標籤pkexec
。
編輯
首先,(如果還沒有)建立一個自訂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
會自動為簡單策略指派不同的策略包「操作 ID」(因此您可以定義不同的預設值,並在自訂規則中進行比對)。您也不需要手動傳遞 $DISPLAY – pkexec 將自動複製所有必要的變數。