Por vários motivos, quero executar meu navegador como um usuário de sistema diferente na minha caixa Fedora.
Por enquanto, criei um usuário de sistema separado chamado sandbox
e criei um ~/.local/share/applications/chrome-sandboxed.desktop
arquivo personalizado para o Google Chrome com meu usuário:
#!/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"
Depois de alguma luta e pesquisa, descobri quePreciso permitir que o sandbox
usuário abra janelas na minha sessão comxhost +SI:localuser:sandbox
e essao pkexec
comando teve que ser incluído em um sh -c ""
comando separado que termina com&& true
já que não funciona no Gnome de outra forma. Eu até consegui issodefinir como meu navegador padrão executandoxdg-settings set default-web-browser chrome-sandboxed.desktop
, já que antes não aparecia na ferramenta GUI para escolha de aplicativos padrão.
Agora, a única coisa que me incomoda é que tenho que digitar minha senha toda vez que clico em um link em outro aplicativo (por exemplo, Thunderbird) para autenticar pkexec
e executar o programa como outro usuário (mesmo que ele perceba que já existe um processo em execução e abrir o link em uma nova guia da janela existente - mas acho que essa lógica é implementada no próprio aplicativo e, portanto, só pode ser ativada após a autenticação ter ocorrido e o processo ser iniciado).
Como não me importo com o fato de meu usuário poder acessar as sandbox
coisas do usuário (é o contrário que quero evitar), gostaria de fazer isso sem senha. Não tenho certeza sobre como conseguir isso, no entanto.
Eu li que isso pode ser feito criando uma policykit
ACL. Mas como eu não querogeralmentedesativar o prompt de senhae não tenho ideia do nome do "aplicativo" personalizado, queparece ser relevante para configurações ajustadas(se entendi a sintaxe da resposta corretamente) não sei como desabilitar o prompt de senha apenas para este aplicativo (e talvez outros no futuro).
Qualquer ajuda seria muito apreciada.
PS: Desculpe, a tag sudo
provavelmente é confusa, mas eu precisaria de 300 reputação (que não tenho) para criar a nova tag pkexec
.
EDITAR
Consegui funcionar com as dicas deusuário1686deresponder.
Primeiro, (se ainda não houver um) crie um policykit
arquivo de política personalizado para configurar action id
o programa desejado - no meu caso /usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy
(observe que nesta política padrão auth_admin
ainda é necessária):
<?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>
Em seguida, crie uma regra personalizada para permitir a execução da ação sem senha com o configurado action id
( com.google.chrome.sandboxed
aqui) apenas para o seu usuário - no meu caso /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
Depois, remova todas as ocorrências do env DISPLAY=$DISPLAY
seu .desktop
arquivo, caso contrário, pkexec
tente executar env
como o outro usuário /usr/bin/google-chrome-stable
. Comousuário1686apontado, as variáveis de ambiente necessárias são herdadas automaticamente para o processo filho, portanto, não são mais necessárias de qualquer maneira.
Você pode precisar systemctl reload polkit.service
ou systemctl restart polkit.service
, mas não tenho certeza disso, pois pensei que esse era o motivo pelo qual não estava funcionando para mim no início - embora eu tenha esquecido de alterar meu .desktop
arquivo.
Funciona exatamente como esperado agora.
Responder1
Veja como o GParted lida com isso:
<?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>
Observe as duas <annotate/>
tags.
Quando esta política é instalada, um simples pkexec /usr/bin/gparted
é automaticamente atribuído a um "ID de ação" de kit de política diferente (para que você possa definir padrões diferentes, bem como combiná-lo em regras personalizadas). Você também não precisa passar $DISPLAY manualmente – o pkexec copiará todas as variáveis necessárias automaticamente.