Por que o gksu / gksudo ou o lançamento de um aplicativo gráfico com o sudo não funciona com o Wayland?

44

Eu instalei o Ubuntu 17.10. Agora estou tendo problemas com gksu:

$ gksu -dg synaptic
No ask_pass set, using default!
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
STARTUP_ID: gksu/synaptic/8760-0-alex-XPS-15-9530_TIME4974977
cmd[0]: /usr/bin/sudo
cmd[1]: -H
cmd[2]: -S
cmd[3]: -p
cmd[4]: GNOME_SUDO_PASS
cmd[5]: -u
cmd[6]: root
cmd[7]: --
cmd[8]: synaptic
buffer: -GNOME_SUDO_PASS-
brute force GNOME_SUDO_PASS ended...
Yeah, we're in...
Unable to init server: Could not connect: Connection refused
(synaptic:8767): Gtk-WARNING **: cannot open display: :1
xauth: /tmp/libgksu-HgUjgQ/.Xauthority
xauth_env: (null)
dir: /tmp/libgksu-HgUjgQ

Se eu não usar -g, a caixa de diálogo de senha será desativada. Parece um problema com a criação de um tty para root.

Algum conselho?

Alex Chapiro
fonte
1
gksudonão funcionará em uma sessão de Wayland , você pode mudar para uma sessão do Xorg e tentar.
Pomsky #
2
O próprio erro se um erro X "não puder abrir a tela:: 1". O Wayland foi projetado dessa maneira e, na opinião dos desenvolvedores, você não deve estar executando aplicativos gráficos como root na linha de comando. Você pode contornar o xhost.
Pantera
1
gksu -dg synaptic Você nunca deveria estar fazendo isso de qualquer maneira.
Rinzwind
3
@ N0rbert para de adicionar o 17.10 às perguntas que mencionam 17.10. As tags de versão devem ser usadas se a pergunta for específica para esse release. A maioria dessas perguntas geralmente é aplicável onde quer que Wayland, GNOME Shell, etc. estejam disponíveis, e isso inclui versões passadas e futuras.
30717 muru
@maru. 16.04 LTS é atual, 17.04 está próximo da EOL; portanto, normal 17.10 significa Wayland e GNOME Shell padrão; portanto, a tag 17.10 é útil, eu acho. É difícil encontrar perguntas, onde os usuários têm problemas com o 17.10, mas não têm respostas e comentários aqui . Eles precisam de respostas, mas esqueceram de adicionar a tag 17.10 quando solicitados. Eu posso parar de adicionar tag. Foi uma boa vontade.
N0rbert 30/10

Respostas:

55

Observe que esta resposta é específica para versões do Ubuntu usando Wayland, 17.10 sendo a primeira versão a usar Wayland por padrão.

É um recurso, não um bug! É um recurso de design do Wayland que você não pode iniciar aplicativos gráficos como raiz a partir do terminal.

As principais discussões estão obviamente nos sites do Fedora. Veja o bug # 1274451 do Fedora e aplicativos gráficos não podem ser executados como root no wayland (por exemplo, gedit, beesu, gparted, nautilus) no Ask Fedora . Mas há também algumas discussões nos sites do Ubuntu ( Ubuntu Devs incerto sobre o uso de Wayland por padrão em 17.10 - OMG! Ubuntu ).

Relatório de bug do Ubuntu: Não foi possível iniciar aplicativos pkexec'ed na sessão de Wayland

Solução potencial - Se você estiver editando arquivos do sistema com um editor gráfico (como o gedit), use uma ferramenta de linha de comando como nanoou vimou emacs. nanonormalmente é mais fácil para novos usuários, vimé mais poderoso e possui mais recursos, consulte este tutorial do Vim ou similar.

De qualquer forma, se você realmente deseja ou precisa executar aplicativos gráficos como root , defina xhostprimeiro o que força o fallback ao Xserver.

Para definir permissões, execute:

xhost si:localuser:root 

Quando terminar, para remover permissões

xhost -si:localuser:root 

Você pode adicionar uma opção gráfica / de mesa para fazer isso de acordo com este relatório de erro sináptico

Os aplicativos pkexec'ed podem ser curados e xhost +si:localuser:rootcolocados no XDG de inicialização automática da seguinte maneira (idéia de N0rbert):

cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF

Você pode adicionar este comando xhost ao .bashrc, mas eu recomendaria um par de aliases

alias gsuon='xhost si:localuser:root'

alias gsuoff='xhost -si:localuser:root'

Você pode nomear os aliases como desejar.

Para detalhes, consulte:


Volte para o Xorg

Se você preferir o Xorg por qualquer motivo, pode optar por executar no Xorg no login

Veja Como você muda do Wayland de volta para o Xorg no Ubuntu 17.10?

Pantera
fonte
Esta solução alternativa também funciona com o Mir ?
Eliah Kagan
Eu não sei sobre MIR, pode.
Pantera
1
Ou apenasxhost +local:
chaskes
18
"É um recurso, não um bug!" ... suspiro. Esse tipo de coisa é exatamente o motivo pelo qual não consigo convencer meus amigos e colegas a mudar para o Linux. Usar o VIM e o Nano não é uma alternativa ao GEdit. O Gedit funciona como um bloco de notas, enquanto você precisa aprender o código CRTL para esses outros. E, por exemplo, Nano, usando os termos como "Write Out" em vez de "Save" .... Muito hostil ao usuário.
JHBonarius # 30/17
9
Isso também quebra completamente o gparted, o que é meio importante para ter acesso. O que aconteceu com "Não tente impedir que pessoas estúpidas façam coisas estúpidas; você só conseguirá impedir que pessoas inteligentes façam coisas inteligentes".
Matthew Najmon
21

insira a descrição da imagem aqui Soluções

Em Wayland, geralmente é difícil executar programas de aplicativos da GUI com permissões elevadas (sudo -H, gksu ...). É uma boa ideia executar essas tarefas com ferramentas de linha de comando.

Mas existem soluções alternativas, se você tiver uma ferramenta GUI, que funcione bem para você e precise de permissões elevadas. (Eu uso duas dessas ferramentas padrão: o Synaptic Package Manager synaptice a ferramenta de particionamento Gparted gparted. Também uso o MakeUSB para criar unidades de inicialização USB mkusb, mas ele pode executar as partes que precisam de permissões elevadas sem gráficos.)

xhost e sudo -H

  1. Existe uma solução alternativa para permitir programas de aplicativos gráficos pertencentes a outros usuários que não o usuário conectado em Wayland,

    xhost +si:localuser:root
    
  2. gksue gksudonão estão incluídos no Ubuntu padrão e não funcionam aqui, mas funcionam no Xorg.

    Em vez disso, você pode usar

    sudo -H
    
  3. É uma boa idéia evitar programas de aplicativos gráficos pertencentes a outros usuários além do usuário conectado,

    xhost -si:localuser:root
    

back-end do gvfs admin

No Ubuntu 17.10 (gvfs> = 1.29.4), você pode usar o backend administrativo do gvfs. Observe que você precisa do caminho completo,

gedit admin:///path/to/file

Em teoria, o método de administração do gvfs admin (que usa o polkit) é melhor e mais seguro (que xhoste xudo -H), independentemente da interface do usuário usada.

Você não executa o aplicativo inteiro como root. A escalação de privilégios ocorre apenas quando estritamente necessário. Consulte o seguinte link e links dele,

nautilus-admin

Também é possível usar nautilus-adminpara operações de arquivo com permissões elevadas e usar geditcom permissões elevadas. Isso é descrito na seguinte resposta do AskUbuntu,

Acesso temporário da raiz ao desktop Wayland via função gks

Por favor evite sudo GUI-program. Isso pode fazer com que o sistema substitua os arquivos de configuração do seu ID de usuário normal com roota configuração e defina a propriedade e as permissões para caber roote bloquear seu ID de usuário regular. Você deve executar aplicativos GUI com sudo -H, que grava os arquivos de configuração no rootdiretório inicial do /root. Exemplo:

sudo -H gedit myfile.txt

Mas há um risco que você esquece -H. Em vez disso, você pode criar uma função, por exemplogks

gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }

e guarde-o ~/.bashrcperto dos pseudônimos. Então você pode correr

gks gedit myfile.txt

de uma maneira semelhante à que você usou gksudoantes.

Testando

Você pode verificar como sudo, sudo -He gkstrabalho com os seguintes comandos

sudodus@xenial32 ~ $ sudo bash -c "echo ~"
/home/sudodus
sudodus@xenial32 ~ $ sudo -H bash -c "echo ~"
/root
sudodus@xenial32 ~ $ gks () { xhost +si:localuser:root; sudo -H "$@"; xhost -si:localuser:root; }
sudodus@xenial32 ~ $ gks bash -c "echo ~"
localuser:root being added to access control list
/root
localuser:root being removed from access control list
sudodus@xenial32 ~ $ 

e claro

gks gedit myfile.txt

de acordo com o exemplo na seção anterior.

Método que funciona através do menu Alt-F2 e Gnome Shell

Em vez de adicionar uma função simples de uma linha ~/.bashrc, você pode criar um sistema que funcione também sem o bash. Pode ser conveniente usar, mas é mais complicado de configurar. Observe que você deve instalar apenas uma das alternativas, porque a função de uma linha irá atrapalhar o uso deste sistema mais complicado.

Três arquivos

O shellscript gks:

#!/bin/bash

xhost +si:localuser:root

if [ $# -eq 0 ]
then
  xterm -T "gks console - enter command and password" \
  -fa default -fs 14 -geometry 60x4 \
  -e bash -c 'echo "gks lets you run command lines with GUI programs
with temporary elevated permissions in Wayland."; \
read -p "Enter command: " cmd; \
cmdfile=$(mktemp); echo "$cmd" > "$cmdfile"; \
sudo -H bash "$cmdfile"; rm "$cmdfile"'
else
 xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H "$@"
fi 

xhost -si:localuser:root;

O arquivo da área de trabalho gks.desktop:

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gks
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gks %f
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland

O arquivo de ícone gks.svgfica assim:

insira a descrição da imagem aqui

Você pode baixar o arquivo de ícone ou um tarball com todos os três arquivos neste link,

wiki.ubuntu.com/Wayland/gks

Copie os arquivos [extraídos, copiados e colados] para os seguintes locais,

sudo cp gks /usr/bin
sudo cp gks.desktop /usr/share/applications/
sudo cp gks.svg /usr/share/icons

Efetue logout / logon ou reinicialize, e deve haver um ícone na área de trabalho. Funcionará a partir de uma janela de terminal, como na solução simples com a função

Alt F2 caixa:

insira a descrição da imagem aqui

Menu Gnome Shell:

insira a descrição da imagem aqui

console gks e gparted:

insira a descrição da imagem aqui

Script personalizado e arquivo da área de trabalho

Se você tiver apenas alguns aplicativos da GUI, que precisem de permissões elevadas, poderá criar scripts e arquivos da área de trabalho personalizados para eles e evitar a inserção do comando (nome do aplicativo). Você digitaria apenas a senha, o que não é mais difícil em comparação com as versões anteriores do Ubuntu (você deve digitar a senha de qualquer maneira).

Exemplo com o programa GUI simples xlogoque acompanha o pacote de programas x11-apps:

O shellscript gkslogo(simplificado comparado a gks),

#!/bin/bash

xhost +si:localuser:root

xterm -T "gks console - enter password" -fa default -fs 14 -geometry 60x4 -e sudo -H xlogo

xhost -si:localuser:root;

O arquivo da área de trabalho gkslogo.desktop:

[Desktop Entry]
Version=1.0
Categories=Application;System;
Type=Application
Name=gkslogo
Description=Run program with temporary elevated permissions in Wayland
Comment=Run program with temporary elevated permissions in Wayland
Exec=gkslogo
Icon=/usr/share/icons/gks.svg
Terminal=false
StartupNotify=false
GenericName[en_US.UTF-8]=Run program with temporary elevated permissions in Wayland

Eu estava com preguiça e usei o mesmo arquivo de ícone gks.svg

Copie os arquivos [copiados e colados] para os seguintes locais,

sudo cp gkslogo /usr/bin
sudo cp gkslogo.desktop /usr/share/applications/

gks [logo] console e xlogo:

insira a descrição da imagem aqui

sudodus
fonte
O "Acesso temporário para root à área de trabalho de Wayland via function gks" é um método mais seguro (por exemplo, adicionar um arquivo como /etc/xdg/autostart/xhost.destoptambém sugerido) porque termina restaurando o ambiente original? E podemos substituir sudo -Hcom segurança gksuno alias para usar a inserção em arquivos .desktop etc.?
Sadi
1
Sim, acho mais seguro permitir acesso root à área de trabalho somente quando necessário. E sim, você pode substituir sudo -Hpor gksuna função, pode funcionar melhor para seus aplicativos.
sudodus 30/10
1
+1 para uma resposta extremamente completa. Semelhante à sua gksabreviação, eu tinha configurado gsupara usar kits de políticas (o novo futuro para 16.04) para gedite nautilus. Quando o 18.04 for lançado, acho que vou apenas nomear o xhost +si...script do wrapper gksuque nunca instalarei a partir dos pacotes começando 18.04.
WinEunuuchs2Unix
2
"Wayland foi projetado para não permitir permissões elevadas (sudo -H, gksu ...) com programas de aplicativos da GUI." - falso. Wayland permite que aplicativos raiz sejam excelentes. Você pode ver isso executando sudo -E gedit. Atualmente, existe um erro no gdmqual ele configura o servidor de compatibilidade Xwayland X11 para não suportar XAUTHORITY, o que é necessário para aplicativos X11 executados como raiz para funcionar. Os aplicativos nativos de wayland executados como raiz funcionam perfeitamente.
21418 psusi
1
@psusi, modifiquei a resposta para evitar declarações sobre o design e as intenções de Wayland.
sudodus 21/02
6

Melhor verificar se o wayland está realmente funcionando primeiro antes de conceder o direito de root

if [ $XDG_SESSION_TYPE = "wayland" ]; then
    xhost +si:localuser:root
fi
eli chan
fonte
5

Se você estiver usando o Ubuntu 17.04 ou superior, é recomendável usar o administrador do gvfs . Basta adicionar admin: // na frente do caminho de arquivo completo que você deseja abrir em um aplicativo como o Editor de Texto ou Arquivos .

Por exemplo, para alterar as configurações de inicialização, abra

admin:///etc/default/grub

Esse método usa o PolicyKit e ainda funcionará com o padrão Wayland do Ubuntu 17.10, enquanto o sudo e o gksu para aplicativos GUI não.

Jeremy Bicha
fonte
1
Obrigado. Para mim, isso funcionou melhor com o gedit (exceto um comportamento estranho quando usado simplesmente como gedit admin:), muito estranhamente com o nautilus (quase inútil) e totalmente falhou com o sináptico . Alguma ideia?
Sadi
Não vai funcionar com sináptica. No entanto, ele deve funcionar bem no nautilus, mas você precisa escolher um diretório e não um arquivo como #admin:///etc/
Jeremy Bicha 31/10
Isso meio que funciona com o nautilus, mas você verá o que quero dizer ("muito estranhamente", "quase inútil"), mesmo quando você abre um diretório diretamente e começa a tentar fazer isso e aquilo ;-)
Sadi
@ Sadi Eu não tenho idéia do que "isso e aquilo" é. Você pode registrar um erro se ele não funcionar corretamente.
Jeremy Bicha
3

Para aplicativos que usam su-to-root e pkexec, você pode adicionar este código /etc/xdg/autostart(veja meu comentário na barra de ativação ) por seu próprio risco:

cat <<EOF | sudo tee /etc/xdg/autostart/xhost.desktop
[Desktop Entry]
Name=xhost
Comment=Fix graphical root applications
Exec="xhost +si:localuser:root"
Terminal=false
Type=Application
EOF

Outros aplicativos raiz também estão danificados no Wayland (consulte os erros 1713313 e 1713311 ).


Se você não deseja uma solução permanente, use o método @ ravery:

basta digitar xhost +si:localuser:rooto terminal antes de iniciar o aplicativo privilegiado

N0rbert
fonte
1

Se um aplicativo suportar a API Wayland, você poderá executá-lo como root usando o sudo -EH applicationcomando

A opção -E diz ao sudo para preservar variáveis ​​de ambiente (assim como WAYLAND_SOCKET e XDG_RUNTIME_DIR) necessárias para desviar aplicativos. É sempre melhor usar esta opção sobre o desagradável xhost hack proposto em outras respostas. O xhost permite que o aplicativo seja executado no invólucro do X, menos seguro do que o uso do Wayland (área de transferência compartilhada, registro de chaves etc.). O truque sudo -EH não funcionará com um aplicativo que não foi reescrito para wayland, como o gparted por exemplo, mas funcionaria com o gedit etc.

ZAB
fonte
0

Na verdade, o seguinte código quase funciona:

#! /bin/bash
set -e 
if [ -z "$1" ] ; then
    echo "Application is not specified" ;  exit
fi 
if [ $XDG_SESSION_TYPE = "wayland" ]; then
    if [[ -t 1 ]]; then
       xhost +si:localuser:root
       sudo -u root "$@"
       xhost  -  
       exit 0
    fi 
fi
gksu "$@"

(por favor, desculpe-me pelo estilo ingênuo de codificação do bash - sou uma espécie de novato nesse assunto). T não funciona estável com Alt-F2, se a última seleção não for um terminal; neste caso, simplesmente não podemos definir o foco na caixa de diálogo de senha. Parece que funciona no menu do Gnome. Enfim <1. Não é uma solução 100%. 2. Parece-me que os arquitetos do Ubuntu pensam que não devemos procurar nenhuma solução alternativa.

Alex Chapiro
fonte
1
Eu acho que você quer "$@"(em vez de "$1" "$2" ...).
Muru
Sim, é claro :-) Estes são apenas vestígios dos meus experimentos #
Alex Chapiro 26/10