Como edito / etc / sudoers a partir de um script?

116

Eu preciso editar /etc/sudoers um script para adicionar / remover coisas das listas brancas.

Supondo que eu tenha um comando que funcionaria em um arquivo normal, como poderia aplicá-lo /etc/sudoers?

Posso copiá-lo e modificá-lo e, em seguida, visudosubstituir o original pela cópia modificada? Fornecendo meu próprio script no $EDITOR?

Ou posso apenas usar os mesmos bloqueios e cp?

A questão é mais sobre problemas potenciais do que apenas encontrar algo que funcione.

n-alexander
fonte

Respostas:

146

Tópico antigo, mas e quanto a:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Beckerr
fonte
10
Esta é uma ótima resposta. Todo o subshell deve ser executado como root, por exemplo echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon
3
Esta resposta funciona muito bem! Eu o uso para skripts postinst em pacotes debian. obrigado! Como é sempre o root, fica curto e prático:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen
3
Eu só quero apontar uma nuance principal para a resposta de @ BorisDäppen: o -asinalizador para EDITOR="tee": ele acrescentará uma linha ao arquivo, não apenas sobrescreverá a primeira linha. Eu não percebi a diferença no início e não consegui descobrir uma maneira de acrescentar. Espero encontrar algumas pessoas em algum momento apontando isso diretamente ;-)
Jean-Philippe Murray
3
Alguém pode me explicar como este trabalho, quero dizer, não é o ponto-e-vírgula necessário após EDITOR = 'tee -a'. Eu sei que isso vai quebrar o comando. EDITOR é uma variável de shell e visudo é mais um comando, então aqui estamos passando EDITOR e visudo na mesma linha de comando. como isso realmente funciona?
Sagar
1
Tentei este x = "algo" echo $ x. Isso não funcionou para mim.
Sagar
43

Use visudo para isso com um editor personalizado. Isso resolve todas as condições de corrida e problemas de "hack" com a solução de Brian.

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

Este script adicionará a linha "# Dummy change to sudoers" ao final de sudoers. Sem hacks e sem condições de corrida.

Versão anotada que explica como isso realmente funciona:

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi
Stendal
fonte
5
Isso requer que o sudo tenha sido compilado --enable-env-editor, caso contrário, ele só usará respeitar a variável do editor se ela fizer parte de um pequeno conjunto de valores conhecidos.
Caleb,
Funciona comigo (Ubuntu 12.04), mas não entendo como funciona. Alguém poderia explicar como usá-lo corretamente e como ele realmente funciona? Obrigado
MountainX
Gostaria de observar que isso não parece funcionar para mim exatamente no dia 12.04. Eu criei um script bash, adicionei + x permissões a ele e executei o arquivo com a seguinte saída: visudo: não foi possível executar / tmp / edit_sudoers: Erro de formato Exec visudo: /etc/sudoers.tmp inalterado
Jose Diaz-Gonzalez
Isso funcionou muito bem para mim, embora eu simplesmente tenha feito login como root e removido o sudo -Edo primeiro comando.
merlin2011
Eu realmente gosto dessa resposta, mas não funcionou para mim. Acho que meu sudo não foi compilado com o sinalizador necessário.
Mnebuerquo
30

Você deve fazer suas edições em um arquivo temporário e, em seguida, usar visudo -c -f sudoers.temp para confirmar que as alterações são válidas e copiá-lo por cima de / etc / sudoers

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp
Brian C. Lane
fonte
Parece que você está usando sudoers.tmp como um arquivo de bloqueio, mas não tenho certeza de como isso confirma que as alterações são válidas. Não deveríamos verificar o status de saída do visudo para ter certeza de que não há erros?
converter42
/etc/sudoers.tmp é o arquivo de bloqueio verificado por visudo no modo interativo. visudo -c -f retorna 1 se houver um erro, daí a verificação do código de retorno.
Brian C. Lane
Estou preocupado em usar sudoers.tmp, pois parece que está usando a interface interna do visudo, ou seja, um hack. É padrão, o que significa que sempre será sudoers.tmp usado como bloqueio? Ou eles têm a liberdade de mudar isso no futuro?
n-alexander
2
precisa usar lockfile em vez de test / touch
n-alexander
2
A página de manual diz que usa /tmp/sudoers.tmp, então esse é o padrão atualmente. Claro que isso pode mudar no futuro. E sim, você está certo, há uma condição de corrida.
Brian C. Lane
18

No Debian e seus derivados, você pode inserir um script personalizado no /etc/sudoers.d/diretório, com direitos 0440- para obter mais informações, consulte /etc/sudoers.d/README .

Isso pode ajudar.

Pevik
fonte
Não é comentado embora?
2
@TomDworzanski: IMHO não. Veja man sudoers (5) e outro comentário .
pevik
Você está certo! Obrigado pelos links e ótima resposta.
3
Eu uso esse diretório no centos 7 também
Alexander Bird
Eu acho que essa é a maneira certa de fazer isso.
jansohn
11

visudo é suposto ser a interface humana para edição /etc/sudoers. Você pode conseguir o mesmo substituindo o arquivo diretamente, mas deve ter cuidado com a edição simultânea e a validação de sintaxe. Cuidado com as r--r-----permissões.

ngn
fonte
9

Se você sudopermite a adição de entradas /etc/sudoers.d, pode usar esta resposta por @ dragon788:

https://superuser.com/a/1027257/26022

Basicamente, você usa visudopara verificar o arquivo antes de copiá-lo /etc/sudoers.d, para ter certeza de que não está quebrando sudopara ninguém.

visudo -c -q -f filename

Isso verifica e retorna sucesso (0) se for válido, então você pode usá-lo com if,&& e outras operações de script booleana. Depois de validar, basta copiá-lo para /etc/sudoers.de ele deve funcionar. Certifique-se de que é propriedade do root e não pode ser escrito por outro.

Mnebuerquo
fonte
5

Configure um editor personalizado. Basicamente, será um script que aceita o nome do arquivo (neste caso /etc/sudoers.tmp) e o modifica e salva no local. Então você pode simplesmente escrever nesse arquivo. Quando terminar, saia do script, e o visudo se encarregará de modificar o arquivo sudoers real para você.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Ali Afshar
fonte
Estou correto de que tudo o que o dummy_editor.sh precisa conter é algo assim? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Parece funcionar para mim.
MountainX de
4

Muitas respostas, trabalhei com sudo por yonks, mas não tive a necessidade de automatizar a configuração até agora. Usei uma combinação de algumas das respostas acima, escrevendo minha linha de configuração no local de inclusão /etc/sudoers.d para não ter que modificar o arquivo sudoers principal e, em seguida, verifiquei a sintaxe desse arquivo, exemplo simples abaixo:

Escreva sua linha em um arquivo de inclusão sudoers:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

Verifique se o arquivo sudoers inclui o aprovado nas verificações de sintaxe visudo:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Im-Kirk-Dougla-Cus
fonte
Apenas omita o asterisco, que não deveria estar lá ^^
Sonata
it e retorna sucesso (0) - entendi
Oleg
2

Apenas para adicionar mais uma opção às respostas acima, se a condição de corrida não for uma preocupação importante, o seguinte comando pode ser usado para evitar a cópia manual de um arquivo modificado para /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

Isso garantirá que o novo arquivo seja validado e instalado corretamente com a atualização de permissões.

Observe que, se houver um erro no /tmp/sudoers.newarquivo, visudoserá solicitada a entrada do usuário, portanto, é aconselhável verificar visudo -c -f /tmp/sudoers.newprimeiro.

zelanix
fonte
1

Acho que a solução mais direta é:

Crie um script addudoers.sh

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

e chame-o com os usuários que deseja adicioná-lo como:

root prompt> ./addsudoers.sh user1 user2

Para obter a explicação completa, consulte esta resposta: Adicionando usuários a sudoers por meio de script de shell

Saudações!

Albert Vonpupp
fonte
0

Tente repetir. Você tem que executá-lo em um subshell, entretanto. Exemplo:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"

Apollo
fonte
-2

Isso funcionou para mim com base no que outros postaram aqui. Quando eu usasse o script de outras pessoas, ele abriria visudo para mim, mas não faria a edição. Isso fez a edição necessária para permitir que todos os usuários, incluindo usuários padrão, instalassem o java 7u17 para safari / firefox.

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

Isso adicionou% everyone blah blah blah ao final do arquivo sudoers. Tive que executar o script assim.

sudo sh sudoersedit.sh

Boa sorte: D

Kamal
fonte