comportamento da sessão “sudo” no ambiente gráfico

3

Eu escrevi esses dois scripts e eles estão no meu $PATH :

gsudo :

#! /bin/bash
sudo -n true &> /dev/null
if [ $? -eq 0 ]
then
  sudo "$@"
else
  upass=$(zenity --password --title "Enter your password" 2> /dev/null)
  [[ ! -z "$upass" ]] && echo $upass | sudo -S -p "" "$@"
fi

Este script basicamente faz a mesma coisa que gksu faz. Olha se sudo precisa de senha ou não e de acordo com o resultado disso vai pedir senha ou não.

run-something :

gsudo command1
gsudo command2

Se eu executar o segundo script a partir de uma janela de terminal, obtenho o comportamento esperado. Ele simplesmente pede minha senha apenas uma vez. Mas se eu chamo isso de um ambiente gráfico, como um executor de tarefas (eu tentei o i3wm dmenu e o rofi launcher) ele pede minha senha duas vezes. Então, por que isso está acontecendo, como posso consertar isso? Eu acredito que sudo -n true deve retornar a mesma coisa ambas as vezes, porque ela está sendo chamada no mesmo script, então sudo session deve persistir. Eu não estou tentando salvar sudo sessão entre chamadas de script diferentes, é o suficiente para que ela persista apenas em uma chamada.

    
por isamert 05.05.2018 / 21:50

1 resposta

1

Eu fiz alguns testes. Não é (ainda) completamente claro para mim como sudo armazena a capacidade de elevar. Provavelmente tem algo a ver com pseudo-terminal sendo alocado ou não.

Se eu fosse você, eu implementaria o que você pode ler nesta pergunta: Como faço para executar um comando sudo dentro de um script? Especialmente em uma das respostas :

It is rarely a good idea to have sudo inside scripts. Instead, remove the sudo from the script and run the script itself with sudo

exceto no seu caso, é da sua gsudo que estamos falando. Além disso, eu usaria $SUDO_USER , se necessário (de esta outra resposta ).

Exemplo run-something :

#!/path/to/my/gsudo /bin/bash

# The shebang ensures the below code is for sure run with gsudo bash;
# gsudo runs sudo, which sets $SUDO_USER (see 'man sudo').

command1   # This is run with gsudo because the entire script is.

# Get back to the invoking (possibly regular) user for just one command
sudo -u "$SUDO_USER" command_whatever

# Again as root
command2
command3

# Get back to the invoking user for many commands
sudo -u "$SUDO_USER" bash << EOF

foo
bar
baz

EOF

Meu gsudo seria muito simples:

#!/bin/bash
SUDO_ASKPASS='/path/to/my/gsudo_helper' sudo "$@"

e gsudo_helper :

#!/bin/bash
zenity --password --title "Enter your password" 2> /dev/null

Notas:

  • Eu deliberadamente não uso sudo -A no código gsudo . Dessa forma, gsudo usa um terminal, se disponível, zenity caso contrário.
  • A sintaxe sudo "$@" permite que gsudo passe opções de linha de comando (como o mencionado -A ) para sudo . Essa é uma boa ideia, mas se você não quiser, considere sudo -- "$@" .
por 06.05.2018 / 01:02