Como executar um programa específico como root sem um prompt de senha?

169

Eu preciso executar algo como sudo sem uma senha, então eu usei visudoe adicionei isso ao meu sudoersarquivo:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Então eu tentei:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Por que ele pede uma senha? Como posso executar / usar comandos como root com um usuário não root, sem solicitar uma senha?

LanceBaynes
fonte

Respostas:

91

Você tem outra entrada no sudoersarquivo que também corresponde ao seu usuário. A NOPASSWDregra precisa ser posterior a essa para ter precedência.

Feito isso, sudoa senha será solicitada normalmente para todos os comandos /path/to/my/program, exceto a que sempre permitirá que você execute sem solicitar sua senha.

Warren Young
fonte
6
isso ainda funcionaria se o /path/to/my/programfosse um script python?
sadmicrowave
O programa pode ser um alias, definido para bash (ou seja, em .bashrc)? Ou mesmo um script de shell dentro /usr/local/sbin? Tentar.
Nikos Alexandris
Nikos - não, não pode ser um pseudônimo. Deve apontar para um caminho real.
Paul Hedderly
sudoers? Onde é? Heawy para usar sua resposta (
Vasilii Suricov
@VasiliiSuricov: Geralmente está dentro /etc, mas alguns sistemas colocam isso em outro lugar. Se você não conseguir encontrá-lo, tente man sudoers. O local local para esse arquivo deve ser substituído na manpágina no momento em que sudofoi criado para esse sistema.
Warren Young
135

Se houver várias entradas correspondentes /etc/sudoers, o sudo utilizará a última. Portanto, se você pode executar qualquer comando com um prompt de senha e desejar executar um comando específico sem um prompt de senha, precisará da última exceção.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Observe o uso de (root), para permitir que o programa seja executado como root, mas não como outros usuários. (Não dê mais permissões do que o mínimo necessário, a menos que você tenha pensado nas implicações.)

Nota para os leitores que não estão executando o Ubuntu ou que alteraram a configuração padrão do sudo (o sudo do Ubuntu está ok por padrão) : A execução de scripts de shell com privilégios elevados é arriscada, você precisa iniciar em um ambiente limpo (depois que o shell for iniciado, é tarde demais (consulte Permitir setuid em scripts de shell ), então você precisa do sudo para cuidar disso). Certifique-se de que você tem Defaults env_resetem /etc/sudoersou que esta opção é o padrão de tempo de compilação ( sudo sudo -V | grep envdeve incluir Reset the environment to a default set of variables).

Gilles
fonte
3
ex para fazer root no jhon com sudo su sem passe -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac
5
@adrian Se você deseja permitir comandos arbitrários como root, faça isso john ALL=(ALL) NOPASSWD: all. Não faz sentido seguir adiante su.
Gilles
Pergunta: devo alterar as permissões do meu script de shell para que ele possa ser modificado e lido apenas pelo usuário root, por segurança? Estou pensando em um invasor modificando o script, que tem todas as permissões concedidas sem a necessidade de uma senha, para que ele faça o que deseja. Obviamente, o invasor não pode nem ler o arquivo sudoers para saber quais scripts têm esse privilégio, mas ainda pode tentar com todos os meus scripts personalizados quando encontrar a pasta na qual estão armazenados, na esperança de que alguns sejam permitidos ou algo assim. .
Jeffrey Lebowski
1
@JeffreyLebowski Se você tem uma regra sudo que executa o script (direta ou indiretamente), é vital que apenas o usuário root (ou pessoas que tenham privilégios de root de qualquer maneira) possa gravar no arquivo de script e no diretório que contém o arquivo de script, e para seu diretório pai e assim por diante. Não importa que alguém possa ler o arquivo de script (a menos que contenha uma senha ou algo assim, mas é uma má idéia, se houver uma senha que deve estar em seu próprio arquivo, caso contrário, há muito risco de vazá-lo acidentalmente, por exemplo, copiar e colar essa seção do código em uma pergunta neste site).
Gilles
1
@alper Não. Poucas coisas exigem a reinicialização. Após a alteração sudoers, você não precisa fazer nada de especial: sudoverifica todas as vezes.
Gilles
24

AVISO : Esta resposta foi considerada insegura. Veja os comentários abaixo

Solução completa: As etapas a seguir ajudarão você a obter a saída desejada:

  1. Crie um novo arquivo de script (substitua create_dir.shpelo nome do script desejado):

    vim ~/create_dir.sh
    

    O script será criado no diretório inicial do usuário

  2. Adicionar alguns comandos que apenas um rootou sudousuário pode executar como a criação de uma pasta no nível do diretório root:

    mkdir /abc
    

    Nota: Não adicione sudoa esses comandos. Salvar e sair (usando :wq!)

  3. Atribua permissões de execução a ele usando:

    sudo chmod u+x create_dir.sh
    
  4. Faça as alterações para que este script não exija uma senha.

    1. Abra o sudoersarquivo:

      sudo visudo -f /etc/sudoers
      
    2. Adicione a seguinte linha no final:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Substitua ahmadpor qualquer que seja o seu nome de usuário. Verifique também se esta é a última linha. Salvar e sair.

  5. Agora, ao executar o comando, adicione sudoantes dele:

    sudo ./create_dir.sh
    

    Isso executará os comandos dentro do arquivo de script sem solicitar uma senha.

Siga as etapas fáceis mencionadas aqui http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

Ahmad Zafar
fonte
Seria melhor se você fornecesse as etapas relevantes aqui e usasse o link como um backup para obter informações mais detalhadas. Dessa forma, sua resposta mantém o valor possível, mesmo que esse link não seja mais válido.
Anthon
15
Este conselho é inseguro. A sudoparte sudo chmod u+x create_dir.shé desnecessária, pois o usuário possui (presumivelmente) a propriedade de seu diretório pessoal. Como o usuário pode gravar create_dir.sh, você efetivamente concedeu um shell raiz gratuito a esse usuário.
21414 Lekensteyn
1
@Lekensteyn O que significa também para qualquer programa em execução como usuário. Também pode permitir que o usuário execute qualquer coisa com o sudo sem uma senha.
Pydsigner 23/05
2
Estou esquecendo de algo? Acredito que o todo chmodé desnecessário, pois você confia em sudoelevar seus privilégios.
G-Man
10

Eu acho que sua sintaxe está errada. Pelo menos eu uso o seguinte que funciona para mim:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
musiKk
fonte
6
A (ALL)peça é opcional, deixando-a de fora tem exatamente o mesmo efeito. Ter (root)seria melhor, porém, mas sua ausência não explica o problema.
Gilles
+1 no sudo para este comando e nada mais! Não há razão para quebrar todo o sistema ...
Johan
3
@ John: Isso já estava em questão.
Gilles
5

Se você deseja evitar ter que usar o sudo nem alterar o arquivo de configuração do sudoers, pode usar:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Isso fará com que o comando seja executado como root sem a necessidade do sudo.

linuxgnuru
fonte
Uau, eu nunca ouvi falar desta solução antes, incompreensível
somethingSomething
Por que preciso rolar para o final dessas coisas para encontrar a melhor resposta? Obrigado por esta solução simples e segura.
RyanNerd
5

Se você tem uma distribuição como o Manjaro, deve lidar primeiro com um arquivo que substitua a definição de / etc / sudoers, excluí-la ou trabalhar diretamente com esse arquivo para adicionar suas novas configurações.

Este arquivo é:

sudo cat /etc/sudoers.d/10-installer

A ÚNICA maneira de vê-lo está sob privilégios de root, você não pode listar este diretório sem ele, esse arquivo é específico do Manjaro, você pode encontrar essa configuração com outro nome, mas no mesmo diretório.

No seu arquivo de escolha, você pode adicionar as seguintes linhas para obter as configurações desejadas:

Ignorar autenticação para um grupo

%group ALL=(ALL) NOPASSWD: ALL

ou Ignorar autenticação para um usuário

youruser ALL=(ALL) NOPASSWD: ALL

ou Ignorar a autenticação de um executável para um usuário específico

youruser ALL=(ALL) NOPASSWD: /path/to/executable

NOTA RÁPIDA: Você está abrindo uma porta para usar o SUDO sem autenticação, o que significa que você pode executar tudo modificando tudo do seu sistema, usá-lo com responsabilidade.

Lyoneel
fonte
4

Verifique se o sudo não possui alias. Corra assim

/usr/bin/sudo /path/to/my/program

Por exemplo, um apelido de shell como este:

alias sudo="sudo env PATH=$PATH"

pode causar esse comportamento.

Sepero
fonte
Você está certo, meu comentário estava fora de ordem aqui , desculpe por isso. No entanto, estou intrigado - como você espera que o aliasing mude o processamento do sudoerssudo. Ou você está falando sobre o redirecionamento sudopara algo que sempre imprime essa mensagem de erro para obter senhas? Que é improvável o caso aqui ...
peterph
2
Eu estava tendo o mesmo problema que o OP. Acabou sendo causado por ter alias sudo="sudo env PATH=$PATH"no meu ~/.bashrc. Em vez de apenas resolvê-lo por mim mesmo e seguir cegamente os meus negócios, enviei minha resposta como uma possível solução para qualquer outra pessoa que acompanhe esse tópico.
Sepero
1
Tudo bem, mas quando não é óbvio (o que neste caso não é pelo menos para algumas pessoas), é bom colocar uma explicação na resposta para fornecer algum contexto e impedir que as pessoas usem cegamente encantamentos mágicos. +2 (- (- 1) + +1). :)
peterph
2

Quando você executa seu script, você precisa executá-lo como sudo /path/to/my/script.

Editar: com base no seu comentário para outra resposta, você deseja executá-lo a partir de um ícone. Você precisará criar um .desktoparquivo que execute seu programa com o sudo, assim como no terminal.

Você também pode usar gtk-sudoum prompt de senha visual.

Você provavelmente deve considerar a idéia de que não deve executar as coisas como root e que mudar o sistema mais adiante, para que você não precise de permissões de root, seria o melhor caminho a percorrer.

Caleb
fonte
7
Não crie scripts de shell definidos . Consulte Permitir setuid em scripts de shell .
Gilles
Eu considerei nem mesmo mencioná-lo porque é uma opção tão ruim. Acabei de excluí-lo porque estou preocupado que esse solicitante possa usar os conselhos, mesmo com o aviso de que foram maus conselhos!
Caleb
2

Isso resolveu o problema para mim (também tentei algumas das outras respostas, que podem ter ajudado):

O script para o qual eu estava chamando era /usr/binum diretório para o qual não tenho permissão de gravação (embora eu possa ler todos os arquivos lá). O script foi chmodded + x (permissão executável), mas ainda não funcionou. Movendo este arquivo para um caminho no meu diretório pessoal, em vez de /usr/bin, finalmente consegui chamá-lo com sudo sem inserir uma senha.

Também algo sobre o qual duvidei (esclarecendo para futuros leitores): Você precisa executar seu script como sudo. Digite sudoao chamar o script. Não use sudoo comando dentro do seu script que realmente precisa de raiz (alterando a luz de fundo do teclado no meu caso). Talvez isso também funcione, mas você não precisa, e parece uma solução melhor para não fazê-lo.

Luc
fonte
O segundo parágrafo tinha a resposta para o meu problema
M. Ahmad Zafar
@MuhammadAhmadZafar Fico feliz que tenha ajudado!
Luc
4
Na verdade, usar sudoperfeitamente dentro de um script é ótimo, desde que você tenha os direitos apropriados (configurados sudoers) para executar o comando em questão sem uma senha. Isso torna as coisas um pouco mais seguras.
Peterph
poderia realmente usar esta resposta re-escrito como um passo-a-passo 'este é como fazê-lo' em vez de como um diálogo com as outras respostas
Walrus o gato
@WalrustheCat Good point. Relendo a minha resposta, acho que eu também poderia ter me confundido um pouco. No momento, não me lembro qual era a situação exata, então não posso realmente escrever melhor. Se você descobrir, talvez uma combinação de várias respostas, envie uma nova resposta!
Luc
1

Outra possibilidade pode ser instalar, configurar e usar o super comando para executar seu script como

super /path/to/your/script

Se você quiser executar algum binário executável (por exemplo, que você tenha compilado em ELF binário de algum código fonte C) -que é não um script- como root, você pode considerar a possibilidade de setuid (e, na verdade /bin/login, /usr/bin/sudoe /bin/sue superestão todos usando essa técnica ) No entanto, tenha muito cuidado, você pode abrir uma enorme falha de segurança .

Concretamente, seu programa deve ser codificado paranoicamente (portanto, verifique todos os argumentos e o ambiente e as condições externas antes de "agir", assumindo um usuário potencialmente hostil); então, você pode usar seteuid (2) e amigos (consulte também setreuid (2) ) com cuidado (veja também capacidades (7) e credenciais (7) e execve (2) ...)

Você usará chmod u+s(leia chmod (1) ) ao instalar um binário desse tipo.

Mas tenha muito cuidado .

Leia muitas coisas sobre o setuid , incluindo a Programação Avançada do Linux , antes de codificar isso.

Observe que um script, ou qualquer coisa relacionada a shebang , não pode ser configurado. Mas você pode codificar (em C) um pequeno binário setuid envolvendo-o.

Basile Starynkevitch
fonte
0

Idealmente, se você estiver personalizando os comandos que podem ser executados, sudofaça essas alterações em um arquivo separado em /etc/sudoers.d/vez de editar o sudoersarquivo diretamente. Você também deve sempre usar visudopara editar o (s) arquivo (s). NUNCA deve conceder NOPASSWDem ALLcomandos.

Exemplo: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Insira sua linha concedendo permissão: myuser ALL= NOPASSWD: /path/to/your/program

Em seguida, salve e saia e visudoavisará se você tiver algum erro de sintaxe.

Você pode executar sudo -lpara ver as permissões concedidas ao usuário, se algum dos NOPASSWDcomandos específicos do usuário aparecer ANTES de qualquer %groupyouarein ALL=(ALL) ALLcomando na saída, você será solicitado a fornecer sua senha.

Se você estiver criando muitos desses arquivos sudoers.d, talvez queira criá-los com o nome de usuário, para facilitar a visualização. Lembre-se de que a ordem dos NOMES DE ARQUIVOS e das REGRAS contidas no arquivo é muito importante; o ÚLTIMO carregado vence, se é MAIS ou MENOS permissivo do que as entradas anteriores.

Você pode controlar a ordem dos nomes de arquivos usando um prefixo de 00-99 ou aa / bb / cc, mas lembre-se de que, se você tiver QUALQUER arquivo que não possua prefixo numérico, eles serão carregados após os arquivos numerados, substituindo as configurações. Isso ocorre porque, dependendo das configurações de seu idioma, a "classificação lexical" usada pelo shell classifica os números primeiro e, em seguida, pode intercalar maiúsculas e minúsculas ao classificar em ordem "crescente".

Tente executar printf '%s\n' {{0..99},{A-Z},{a-z}} | sorte printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortverifique se o seu idioma atual é impresso AaBbCcetc. ou ABCentão abcpara determinar qual seria o melhor prefixo de "última" letra a ser usado.

dragon788
fonte
0

Para permitir que qualquer usuário execute o programa como sudo sem solicitar a senha, você pode adicionar a seguinte linha

%sudo ALL=(root) NOPASSWD: /path/to/your/program

no /etc/sudoers

Note que % sudo faz isso.

ultimatex
fonte
Embora essa seja uma maneira de realizar uma regra sudo, ela não responde à pergunta sobre por que a configuração do sinalizador NOPASSWD nessa regra ainda resultou em um prompt de senha. Veja a resposta aceita para ter uma idéia de por que isso aconteceu.
Jeff Schaller
0

A seguir, é o caso em que você deseja executar um comando sem senha apenas se ele tiver um conjunto específico de opções, em que parte das opções é variável . AFAIK, não é possível usar variáveis ​​ou intervalos de valores nas declarações de sudoers, ou seja, você pode permitir o acesso explicitamente, command option1mas não command option2usar:

user_name ALL=(root) /usr/bin/command option1

mas se a estrutura for command option1 value1, onde value1pode variar, você precisará ter linhas explícitas de sudoers para cada valor possível de value1. O shell script fornece uma maneira de contornar isso.

Essa resposta foi inspirada na resposta de M. Ahmad Zafar e corrige o problema de segurança.

  1. Crie um shell script onde você chama o comando sem sudo.
  2. Salve o script em uma pasta com privilégios de raiz (por exemplo /usr/local/bin/), torne o arquivo de propriedade da raiz (por exemplo chown root:wheel /usr/local/bin/script_name) sem acesso de gravação para outras pessoas (por exemplo chmod 755 /usr/local/bin/script_name).
  3. Adicione a exceção aos sudoers usando o visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Execute seu script sudo script_name.

Por exemplo, quero alterar o tempo limite de suspensão da exibição no macOS. Isso é feito usando:

sudo pmset displaysleep time_in_minutes

Considero alterar o tempo limite de suspensão uma ação inocente que não justifica o incômodo de digitar a senha, mas pmsetpode fazer muitas coisas e eu gostaria de manter essas outras coisas atrás da senha do sudo.

Então, eu tenho o seguinte script em /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

No final do sudoersarquivo, tenho a seguinte linha:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Para definir o tempo limite em 3 minutos, eu executo meu script a partir da conta de usuário comum user_name:

sudo ds 3

PS: A maior parte do meu script é validação de entrada, o que não é obrigatório, portanto o seguinte também funcionaria:

#!/bin/bash
pmset displaysleep $1 
Koit Saarevet
fonte