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

140

Eu preciso executar algo como sudo sem uma senha, então usei visudo e adicionei isso ao meu arquivo sudoers :

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

Então eu tentei:

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

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

    
por LanceBaynes 16.08.2011 / 12:29

11 respostas

75

Você tem outra entrada no arquivo sudoers que também corresponde ao seu usuário. A regra NOPASSWD precisa ser depois daquela para que ela tenha precedência.

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

    
por 16.08.2011 / 13:32
113

Se houver várias entradas correspondentes em /etc/sudoers , o sudo usa o último. Portanto, se você puder 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 exigido, a menos que você tenha pensado nas implicações.)

Nota para os leitores que não estão executando o Ubuntu ou que mudaram a configuração do sudo padrão (sudo do Ubuntu é ok por padrão) : Executar scripts de shell com privilégios elevados é arriscado, você precisa começar a partir um ambiente limpo (assim que o shell é iniciado, é tarde demais (consulte Permitir o setuid em scripts de shell ), então você precisa do sudo para cuidar disso). Verifique se você tem Defaults env_reset em /etc/sudoers ou se essa opção é o padrão em tempo de compilação ( sudo sudo -V | grep env deve incluir Reset the environment to a default set of variables ).

    
por 12.05.2011 / 13:36
20

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

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

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

    vim ~/create_dir.sh
    

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

  2. Adicione alguns comandos que apenas um usuário root ou sudo pode executar como criar uma pasta no nível do diretório raiz:

    mkdir /abc
    

    Observação: não adicione sudo a esses comandos. Salve e saia (usando :wq! )

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

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

    1. Abra o arquivo sudoers :

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

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

      Substitua ahmad pelo nome de usuário. Também verifique se esta é a última linha. Salve e saia.

  5. Agora, ao executar o comando, adicione sudo antes:

    sudo ./create_dir.sh
    

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

Siga as etapas fáceis mencionadas aqui link

    
por 14.09.2013 / 07:18
8

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

myusername ALL=(ALL) NOPASSWD: /path/to/executable
    
por 12.05.2011 / 10:30
4

Verifique se o sudo não está com alias. Corra assim

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

Por exemplo, um alias de shell como este:

alias sudo="sudo env PATH=$PATH"

pode causar esse comportamento.

    
por 19.07.2014 / 01:54
4

Em algumas distros, Manjaro no meu caso, existe um arquivo que sobrescreve o arquivo / etc / sudoers

sudo cat /etc/sudoers.d/10-installer
  • a ÚNICA maneira de ver isso sob privilégios de root, você não pode listar este diretório sem ele.

Lá você encontrará algo assim:

youruser ALL=(ALL)

Você pode excluir esse arquivo e usar o cfg no arquivo / etc / sudoers

/ etc / sudoers :

No arquivo sudo você deve colocar algo como:

%group ALL=(ALL) NOPASSWD: ALL

ou

youruser ALL=(ALL) NOPASSWD: ALL

ou

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

Espero que isso ajude alguém:).

    
por 17.06.2015 / 22:48
2

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

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

Você também pode considerar usar gtk-sudo para um prompt de senha visual.

Você provavelmente deve considerar a ideia de que não deveria estar executando as coisas como root e que mudar o sistema mais adiante, para que você não precise de permissões de root, seria uma maneira melhor de ir.

    
por 12.05.2011 / 10:31
2

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

O script que eu estava chamando estava em /usr/bin , um diretório para o qual não tenho permissões de gravação (embora normalmente eu possa ler qualquer arquivo lá). O script foi chmodded + x (permisison executável), mas ainda não funcionou. Mover este arquivo para um caminho no meu diretório pessoal, em vez de /usr/bin , finalmente consegui chamá-lo com o sudo sem digitar uma senha.

Também algo de que duvidei (esclarecimento para futuros leitores): você precisa executar seu script como sudo. Digite sudo quando chamando o script. Não use sudo para o comando dentro do seu script que realmente precisa de root (mudando 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 não.

    
por 18.07.2013 / 19:44
2

Se você quiser evitar ter que usar o sudo nem precisar alterar o arquivo de configuração do sudoers, você 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 de sudo.

    
por 25.03.2017 / 10:10
1

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

super /path/to/your/script

Se você quiser executar alguns executáveis binários (por exemplo, compilados em ELF binário de algum código-fonte C) - que não é um script - como root, você pode considerar fazer < href="https://en.wikipedia.org/wiki/Setuid"> setuid (e, na verdade, /bin/login , /usr/bin/sudo e /bin/su e super estão todos usando isso técnica). No entanto, tenha muito cuidado, você poderia abrir um enorme buraco de segurança .

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

Você usará chmod u+s (leia chmod (1) ) quando instalando tal binário.

Mas tenha muito cuidado .

Leia muitas coisas sobre setuid , incluindo Programação Avançada em Linux , antes de codificar tais uma coisa.

Observe que um script, ou qualquer coisa shebang , não pode ser definido. Mas você poderia codificar (em C) um pequeno setuid-binary envolvendo-o.

    
por 24.07.2017 / 13:00
0

Idealmente, se você estiver personalizando quais comandos podem ser executados via sudo , você deve fazer essas alterações em um arquivo separado em /etc/sudoers.d/ , em vez de editar o arquivo sudoers diretamente. Você também deve sempre usar visudo para editar o (s) arquivo (s). Você NUNCA deve conceder os comandos NOPASSWD on ALL .

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

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

Em seguida, salve e saia e visudo avisará se você tiver erros de sintaxe.

Você pode executar sudo -l para ver as permissões concedidas a seu usuário, se qualquer um dos comandos NOPASSWD específicos do usuário aparecer ANTES de qualquer comando %groupyouarein ALL=(ALL) ALL na saída, será solicitada sua senha.

Se você estiver criando muitos desses arquivos sudoers.d, talvez queira criá-los com nomes por usuário, para que sejam mais fáceis de visualizar. Tenha em mente que a ordenação dos NOMES DE ARQUIVO e das REGRAS dentro do arquivo é muito importante, o ÚLTIMO carregado carrega, seja MAIS ou MENOS permissivo que as entradas anteriores.

You can control the file name ordering by using a prefix of 00-99 or aa/bb/cc, though also keep in mind that if you have ANY files that don't have numeric prefix, they will load after the numbered files, overriding the settings. This is because depending on your language settings the "lexical sorting" the shell uses sorts numbers first and then may interleave upper and lowercase when sorting in "ascending" order.

Tente executar printf '%s\n' {{0..99},{A-Z},{a-z}} | sort e printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort para ver se o idioma atual imprime AaBbCc etc ou ABC then abc para determinar qual seria o melhor prefixo de letra "último" a usar.

    
por 22.05.2017 / 23:26

Tags