Por que os usuários nunca devem usar o sudo normal para iniciar aplicativos gráficos?

114

Eu li a documentação da comunidade "RootSudo" e estou interessado nesta linha:

Você nunca deve usar o sudo normal para iniciar aplicativos gráficos como Root.

Por quê? Qual é a diferença? Forneça uma explicação simples, pois sou apenas um usuário de desktop normal.

Nur
fonte
Na verdade, recentemente tive dificuldade em instalar o MATLAB em / usr / local. Isso requer privilégios de root para gravar em / usr / local, mas a execução do instalador usando o gksu de alguma forma impossibilitou a execução do programa instalado como não root. A execução do instalador usando o sudo fez tudo funcionar bem.
Bib-lost

Respostas:

129

Os aplicativos gráficos geralmente armazenam configurações e outros dados específicos do usuário em arquivos de configuração gravados na pasta inicial do usuário . Os principais aplicativos de mecanismo usados ​​para determinar o que eles devem usar como pasta pessoal do usuário é a HOME variável de ambiente . (Você pode inspecionar você mesmo echo $HOME).

Suponha que você esteja executando gedit(um editor de texto gráfico) como root. Se você executar sudo gedit, HOMEcontinuará apontando para o diretório inicial, mesmo que o programa esteja sendo executado comoroot . Consequentemente, geditvão escrever arquivos de configuração comoroot em seu diretório home. Este , por vezes, resultará nos arquivos de configuração a ser detidas porroot e, portanto, inacessíveis para você (quando posteriormente executar o programa como a si mesmo e não como root). Isso acontece principalmente quando o aplicativo precisa criar um novo arquivo de configuração. Os arquivos criados recentemente, por padrão, pertencem ao usuário que os cria (quem, nesse caso root, não é você).

Essa é a principal razão pela qual você deve executar aplicativos gráficos com um sudofront-end gráfico e não com um straight sudo. No Ubuntu e na maioria de seus derivados (incluindo Xubuntu e Lubuntu), a interface gráfica padrão é gksu/gksudo . No Kubuntu é kdesudo. (Depende do ambiente da área de trabalho que está sendo usado.)

Se você deseja usar sudodiretamente para executar um aplicativo gráfico como gedit, pode executar:

sudo -H gedit

O -Hsinalizador sudodefine HOMEpara apontar para roota pasta pessoal (que é /root).

Isso ainda não resolverá automaticamente a propriedade .Xauthority, copiando-a para uma pasta temporária (essa é outra coisa que os sudofront-end gráficos cuidam de você). Porém, no evento infreqüente que .Xauthorityé inacessível, você receberá um erro dizendo que é e poderá corrigir o problema excluindo-o ( sudo rm ~/.Xauthority), pois ele é regenerado automaticamente. Portanto, proteger .Xauthoritya propriedade e as permissões é menos importante do que proteger a propriedade e as permissões dos arquivos de configuração.

Em contraste com a rootdetida .Xauthority, quando os arquivos de configuração se tornam propriedade como root, nem sempre é tão óbvio qual é o problema (porque programas gráficos, muitas vezes, correr, mas não funciona muito bem, e saída de erros úteis para o console). E, às vezes, é um aborrecimento maior para corrigir, especialmente se você estiver em uma situação em que deseja que um ou mais arquivos em seu diretório pessoal sejam de propriedade de alguém que não seja você (porque você não poderá corrigi-lo simplesmente inserindo recursivamente chowntodos os arquivos) de volta para si mesmo).

Portanto, sudo(pelo menos sem -H) não deve ser usado para executar um aplicativo gráfico, a menos que você esteja familiarizado com o funcionamento interno do aplicativo e tenha certeza de que ele nunca tenta gravar nenhum arquivo de configuração.

Eliah Kagan
fonte
Posso me tornar o proprietário de todos os arquivos de configuração (ou de qualquer arquivo) no meu diretório pessoal novamente, se esse arquivo pertencer à raiz?
Nur
@Nur Supondo que não haja arquivos em seu diretório pessoal que você queira pertencer a qualquer outro usuário ou que deseje ter qualquer outra participação em grupo (para compartilhamento) , você pode executar: sudo chmod -R $USER:$USER ~Infelizmente, esses critérios nem sempre se aplicam. Se você tiver algum arquivo em que precise preservar o proprietário do grupo, poderá executar sudo chmod -R $USER ~. Isso geralmente é suficiente. (Se você tiver arquivos precisam ser propriedade de outro usuário em seu diretório home, mesmo que seja um problema.)
Elias Kagan
11
@EliahKagan chmodRealmente faz isso? Eu sempre pensei que era chownisso. chmodnunca fez isso por mim.
Wyatt8740
2
@ Wyatt8740 Eu definitivamente deveria ter escrito em chownvez de chmodnos meus comentários acima. Desculpe por isso - e obrigado por apontar isso!
Eliah Kagan
2
@TheQuark Em sudo -H echo $HOME, seu shell - correndo como você, não como root - realiza expansão de parâmetros em $HOME, obtendo o caminho do seu diretório home, em seguida, passa isso para sudo, que por sua vez passa o valor já se expandiu para echo, que imprime-lo. sudo -H printenv HOME,, sudo -H bash -c 'echo $HOME'e sudo -H sh -c 'echo $HOME'todas as impressões /root. Isso é conceitualmente semelhante - embora por um mecanismo diferente - a como x=a echo "$x"não é impresso a(a menos que xjá tenha o valor a).
Eliah Kagan em 18/06
5

Uma alternativa para gksu nautiluse gksu gedité usar o nautilus-admincomplemento. Ele permite que você navegue em arquivos e diretórios com o Nautilus e depois os abra como root (administrador).

A instalação é simples:

sudo apt install nautilus-admin

Agora, quando você estiver no nautilus, terá uma opção extra para Editar como administrador:

nautilus admin.gif


gedit como root não permite preferências

Ao executar geditcomo root, não é possível usar as preferências que você configurou como usuário comum para paradas de tabulação, converter guias em espaços, nome da fonte, tamanho da fonte, quebra de linha, etc.

Para resolver isso, escrevi o script sgeditpara herdar as preferências do usuário e aplicá-las ao root: Como sincronizar meu root gedit com as preferências do meu usuário gedit?

  • Ligue usando sgedit filename1 filename2 ...
  • Obtém as configurações gedit do usuário para paradas de tabulação, fontes, quebra de linha, etc.
  • Eleva para sudo -Hpreservar a propriedade do arquivo enquanto obtém poderes de root.
  • Solicita a senha se o último sudoexpirou.
  • Obtém as configurações gedit do sudo
  • Compara as diferenças entre as configurações de usuário e sudo gedit
  • Executa as configurações definidas apenas nas diferenças (reduz 174 comandos set para uma dúzia ou menos. Da próxima vez que for executada, talvez apenas uma ou duas alterações, mas muitas vezes sem alterações).
  • Chamadas geditcomo uma tarefa em segundo plano, para que o prompt do terminal reapareça imediatamente.
WinEunuuchs2Unix
fonte