Estou fazendo um aplicativo de desktop para Linux que interage com alguns arquivos do sistema Ubuntu. Como tal, durante a instalação do meu software pelo usuário final, preciso gerar um arquivo para /etc/sudoers.d/
dar acesso a vários scripts aos arquivos do sistema sem saber a senha. O usuário inserirá a senha durante a instalação, mas depois disso não será necessário. Durante a instalação, eles serão executados give-sudo.sh
, contendo as seguintes linhas de código Bash:
echo '$USER ALL=(ALL) NOPASSWD: power_off.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: reboot.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: timeout_moss.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: timeout_default.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: set_next_os.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: boot_os_1.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: boot_os_2.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: give_sudo.sh' >> /etc/sudoers.d/moss-priv
Ele deve criar um arquivo chamado moss-priv
e anexar as linhas necessárias para que meus scripts sejam executados sem exigir uma senha. Eu tenho 8 scripts, então adiciono 8 linhas de código. Os echo
comandos funcionam bem, moss-priv
é gerado e seu conteúdo lido:
$USER ALL=(ALL) NOPASSWD: power_off.sh
$USER ALL=(ALL) NOPASSWD: reboot.sh
$USER ALL=(ALL) NOPASSWD: timeout_moss.sh
$USER ALL=(ALL) NOPASSWD: timeout_default.sh
$USER ALL=(ALL) NOPASSWD: set_next_os.sh
$USER ALL=(ALL) NOPASSWD: boot_os_1.sh
$USER ALL=(ALL) NOPASSWD: boot_os_2.sh
$USER ALL=(ALL) NOPASSWD: give_sudo.sh
É quando o problema ocorre. Em vez de fornecer senha sudo
aos scripts, ele imprime um rastreamento de pilha informando que ocorreu um erro em cada linha (1-8). Não apenas isso, mas se eu tentar ligar sudo
por qualquer motivo, ele diz "falha na autorização" e rastreamentos de pilha. Como tal, perdi completamente o sudo
acesso e não consegui nem voltar para excluir o arquivo que estava causando esse problema. Acabei tendo que reinstalar todo o sistema operacional só para voltar ao normal.
Agora que sudo
voltei, estou pronto para tentar novamente assim que descobrir o que há de errado com o moss-priv
arquivo. Mas não consigo entender, acho que parece bom. Ajuda?
Eu ficaria feliz com uma solução para este problema ou um bom método alternativo.
Erro:
\>>> /etc/sudoers.d/moss-priv: syntax error near line 1 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 2 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 3 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 4 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 5 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 6 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 7 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 8 <<<
\sudo: parse error in /etc/sudoers.d/moss-priv near line 1
\sudo: no valid sudoers sources found, quitting
\sudo: unable to initialize policy plugin1\\
ATUALIZAÇÃO: Saindo das correções sugeridas, tenho um arquivo give_sudo.sh
:
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/power_off.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/reboot.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/timeout_moss.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/timeout_default.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/set_next_os.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/boot_os_1.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/boot_os_2.sh" >> /etc/sudoers.d/moss-priv
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/give_sudo" >> /etc/sudoers.d/moss-priv
E um dos scripts, diga timeout_moss.sh
:
sudo sed -i 's/GRUB_HIDDEN_TIMEOUT=10/GRUB_HIDDEN_TIMEOUT=0.01/g' /etc/default/grub
Quando eu o executo, com bash timeout_moss.sh
(quando estou no diretório atual) ele ainda pede minha senha ... por quê?
Depois disso, o arquivo não parece bem. Você precisa fornecer o nome do arquivo totalmente qualificado (abaixo, presumo
/sbin/power_off.sh
). Além disso$USER
, entre aspas simples não é expandido, chega ao arquivo como literal$USER
; Acho que não é isso que você quer. Use aspas duplas e especifique o caminho completo :A linha no arquivo ficará assim:
Dicas:
/sbin/power_off.sh
não for executável. Torne-o executável comchmod
.$USER
de expandir conforme o esperado. Se o seu script de instalaçãosudo
for executado , você provavelmente precisará$SUDO_USER
(consulte Recursosman 8 sudo
). Em qualquer caso, é aconselhável verificar se o valor expandido parece correto antes de gravar no arquivo.Use aqui o documento (com a palavra sem aspas porque você deseja
$SUDO_USER
expandir) para gravar no arquivo de maneira mais elegante. Este exemplo criará o arquivo novamente:sudoers
permite que você especifique um diretório inteiro (por seu caminho completo, ele deve começar/
e terminar com/
). Mova os scripts para um diretório dedicado e você precisará adicionar apenas uma linha a/etc/sudoers.d/moss-priv
. Mas, se você precisar que suas ferramentas sejam acessadas viaPATH
, lembresudo
-se de usar um arquivoPATH
.sudo su -
) e mantenha-o aberto o tempo todo . Teste em um shell regular sesudo
funcionar após as alterações. Se você perder osudo
acesso, use o shell elevado para corrigir o problema (no seu caso, a remoção/etc/sudoers.d/moss-priv
deve ser suficiente).tmux
ouscreen
como usuário regular e abra o shell elevado a partir daí. Dessa forma, mesmo que você perca temporariamente a conexão no momento mais crítico quando for consertar osudo
acesso, o shell sobreviverá. Você será capaz de pular para o shell elevado semsudo
apenas se reconectar atmux
/screen
.Tente com aspas duplas:
Portanto, essa
$USER
variável será substituída por seu conteúdo. As aspas simples impedem que as variáveis sejam interpretadas.