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.

Respostas:


146

Tópico antigo, mas e quanto a:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

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

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

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.


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.


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.


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

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

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.


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!


0

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

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


-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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.