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

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

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

Então experimentei:

$ 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 pedir uma senha?

Resposta

Você tem outra entrada no arquivo sudoers , normalmente localizado em /etc/sudoers , que também corresponde ao seu usuário. A NOPASSWD regra precisa ser posterior a essa regra para ter 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.

Comentários

  • isso ainda funcionaria se o /path/to/my/program fosse um script python?
  • O programa pode em vez disso, seja um alias, definido para bash (ou seja, em .bashrc)? Ou mesmo um script de shell dentro de /usr/local/sbin? Para experimentar.
  • Nikos – não, não pode ser um pseudônimo. Deve apontar para um caminho real.
  • sudoers? Onde é? difícil de usar sua resposta (
  • @VasiliiSuricov: é ‘ s geralmente em /etc, mas alguns sistemas o colocam em outro lugar. Se você não puder ‘ encontrá-lo, tente man sudoers. O local desse arquivo deve ser substituído em man página no momento em que sudo foi construída para esse sistema.

Resposta

Se houver várias entradas correspondentes em /etc/sudoers, sudo usará a última. Portanto, se você puder executar qualquer comando com um prompt de senha, e você deseja ser capaz de executar um determinado comando sem um prompt de senha, você precisa da exceção por último.

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 referência aders que não estão executando o Ubuntu ou que mudaram a configuração sudo padrão (o sudo do Ubuntu está ok por padrão) : Executar scripts de shell com privilégios elevados é arriscado, você precisa iniciar de um ambiente limpo (uma vez que o shell foi iniciado, é tarde demais (consulte Permitir setuid em scripts de shell ), então você precisa do sudo para cuidar disso. Certifique-se de ter Defaults env_reset em /etc/sudoers ou que esta opção seja o padrão em tempo de compilação (sudo sudo -V | grep env deve incluir Reset the environment to a default set of variables).

Comentários

  • ex para fazer root de jhon com sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Se você deseja permitir comandos arbitrários como root, faça isso john ALL=(ALL) NOPASSWD: all. Não ‘ não há sentido em ir via su.
  • 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? Eu ‘ estou pensando em um invasor modificando o script, que tem todas as permissões concedidas sem a necessidade de uma senha, para que faça o que quiser. Obviamente, o invasor pode ‘ nem mesmo ler o arquivo sudoers para saber quais scripts têm esse privilégio, mas ainda pode tentar com todos os meus scripts personalizados assim que encontrar a pasta em que eles estão armazenado na esperança de que alguns sejam permitidos ou algo parecido.
  • @JeffreyLebowski Se você tiver uma regra sudo que executa o script (direta ou indiretamente), então ‘ É vital que apenas o root (ou pessoas que tenham privilégios de root) possam gravar no arquivo de script e no diretório que contém o arquivo de script e em seu diretório pai e assim por diante. Não ‘ não importa que qualquer pessoa possa ler o arquivo de script (a menos que contenha uma senha ou algo assim, mas isso ‘ é uma má ideia, se houver ‘ uma senha, ela deve estar em seu próprio arquivo, caso contrário, haverá ‘ muito risco de vazá-la acidentalmente, por exemplo, por cópia- colando essa seção do código em uma pergunta neste site).
  • @alper Não. Muito poucas coisas requerem reinicialização. Depois de alterar sudoers, você não ‘ não precisa fazer nada de especial: sudo verifica cada vez.

Resposta

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

Solução completa: As etapas a seguir o ajudarão a obter o resultado desejado:

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

    vim ~/create_dir.sh 

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

  2. Adicione alguns comandos que apenas root ou sudo o usuário 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 este script não exija uma senha.

    1. Abra o sudoers arquivo:

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

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

      Substitua ahmad por seu nome de usuário. Certifique-se também de que esta é a última linha. Salve e saia.

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

    sudo ./create_dir.sh 

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

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

Comentários

  • Seria melhor se você fornecesse as etapas relevantes aqui e usasse o link como um backup para informações mais detalhadas. Dessa forma, sua resposta terá valor possível, mesmo que o link não seja mais válido.
  • Este conselho é inseguro. A sudo parte de sudo chmod u+x create_dir.sh é desnecessária, pois o usuário tem (presumivelmente) propriedade sobre seu diretório inicial. Uma vez que o usuário pode escrever para create_dir.sh, você efetivamente deu um shell de root gratuito para esse usuário.
  • @Lekensteyn O que significa também para qualquer programa executado como o usuário . Pode muito bem permitir que o usuário execute qualquer coisa com sudo sem uma senha.
  • Estou faltando alguma coisa? Acredito que todo o chmod seja desnecessário, já que você está contando com sudo para elevar seus privilégios.

Resposta

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

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

Comentários

  • O (ALL) parte é opcional, deixá-la de fora tem exatamente o mesmo efeito. Ter (root) seria melhor, mas sua ausência não ‘ não explica o problema.
  • +1 para sudo por este comando e nada mais! Não há razão para quebrar todo o sistema …
  • @Johan: Isso já estava em questão.

Resposta

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

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

Isto fará com que o comando seja executado como root sem a necessidade de sudo.

Comentários

  • Uau, nunca ouvi falar dessa solução antes, incompreensível
  • @RyanNerd: Esta não é uma solução segura. O OP agora não apenas pode executar o comando como root sem uma senha, mas qualquer um pode agora executar o comando como usuário root.
  • ” chmod 4775 filename ” é unilateral. Em segundo lugar, talvez a melhor maneira de SETUID , sem redefinir as permissões do arquivo inteiro, é ” chmod u + s nome do arquivo ”
  • sudo chmod 005 é seguro. Você não ‘ não quer dar permissões de escrita ao usuário atual. Caso contrário, qualquer pessoa em sua sessão poderia fazer qualquer coisa com seu script.

Resposta

Se você tiver uma distribuição como Manjaro , você deve primeiro lidar com um arquivo que substitui a definição de / etc / sudoers, você pode excluí-lo 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 ver isso é com privilégios de root, você não pode listar este diretório sem ele, este arquivo é específico do Manjaro, você pode encontrar esta configuração com outro nome , mas no mesmo diretório.

No arquivo de sua escolha, você pode adicionar a (s) seguinte (s) linha (s) para obter as configurações desejadas:

Ignorar autenticação para um grupo

%group ALL=(ALL) NOPASSWD: ALL 

ou Ignorar a autenticação de 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 SUDO sem autenticação, isso significa que você pode executar tudo modificando tudo em seu sistema, use-o com responsabilidade.

Resposta

Verifique se sudo não tem um alias. Execute assim

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

Por exemplo, um alias de shell como este:

alias sudo="sudo env PATH=$PATH" 

pode causar este comportamento.

Comentários

  • Você está certo, meu comentário estava fora de ordem aqui , desculpe por isso . No entanto, eu ‘ estou intrigado – como você espera que o aliasing altere o processamento de sudoers por sudo. Ou você está falando sobre redirecionar sudo para algo que sempre imprime esta mensagem de erro para retirar senhas? É improvável que seja o caso aqui …
  • Eu estava tendo o mesmo problema que o OP. Descobriu-se que era causado por ter alias sudo="sudo env PATH=$PATH" em meu ~/.bashrc. Em vez de apenas resolver sozinho e cuidar cegamente dos meus negócios, enviei minha resposta como uma possível solução para qualquer pessoa que participe deste tópico.
  • Que ‘ tudo bem, mas quando não for óbvio (que neste caso não ‘ t pelo menos para algumas pessoas), é bom colocar uma explicação na resposta para fornecer algum contexto e evitar que as pessoas usem cegamente encantamentos mágicos. +2 (- (- 1) + +1). 🙂

Resposta

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

Editar: Com base no seu comentário para outra resposta, você deseja executar a partir de um ícone. Você precisará criar um arquivo .desktop que execute seu programa com sudo, assim como no terminal.

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

Você provavelmente deve considerar a ideia de que não deve executar as coisas como root e que alterar o sistema mais adiante para evitar precisar de permissões de root seria a melhor maneira de prosseguir.

Comentários

  • Não crie scripts de shell como setuid . Consulte Permitir setuid em scripts de shell .
  • Considerei nem mesmo mencioná-lo porque ‘ é uma opção tão ruim. Acabei de excluí-lo porque ‘ estou preocupado que o questionador possa usar o conselho mesmo com o aviso de que era um conselho ruim!

Resposta

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ão de gravação (embora normalmente possa ler qualquer arquivo lá). O script foi chmodded + x (permissão executável), mas ainda não funcionou. Movendo este arquivo para um caminho em meu diretório inicial, em vez de /usr/bin, finalmente consegui chamá-lo com sudo sem digitar uma senha.

Também algo que eu duvidoso (esclarecendo para futuros leitores): Você precisa executar seu script como sudo. Digite sudo ao chamar o script. Não use sudo para o comando dentro de seu script que realmente precisa de root (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 não.

Comentários

  • O segundo parágrafo tinha a resposta para o meu problema
  • @MuhammadAhmadZafar Glad ajudou!
  • Na verdade, usar sudo dentro de um script é perfeitamente adequado, desde que você tenha os direitos apropriados (definidos em sudoers) para executar o comando em questão sem uma senha. Isso torna as coisas um pouco mais seguras.
  • realmente poderia usar esta resposta reescrita como um passo a passo ‘ é assim que você faz ‘ ao invés de um diálogo com as outras respostas
  • @WalrustheCat Bom argumento. Relendo minha resposta, acho que também posso ter ficado um pouco confuso. No momento, porém, não ‘ não me lembro qual era a situação exata, então não posso ‘ realmente fazer uma redação melhor. Se você descobrir, talvez uma combinação de várias respostas, envie uma nova resposta!

Resposta

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

super /path/to/your/script 

Se você deseja executar algum binário executável (por exemplo, que você compilou no binário ELF de algum código-fonte C), que é não um script – como root, você pode considerar torná-lo setuid (e na verdade /bin/login, /usr/bin/sudo e /bin/su e super estã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 paranoicamente codificado (portanto, verifique todos os argumentos, o ambiente e as condições externas antes de ” agir “, assumindo um usuário potencialmente hostil), então você poderia usar seteuid (2) e amigos (consulte também setreuid (2) ) com cuidado ( veja também recursos (7) & credenciais (7) & execve (2) …)

Você “vai use chmod u+s (leia chmod (1) ) ao instalar esse binário.

Mas tenha muito cuidado .

Leia muitas coisas sobre setuid , incluindo Linu Avançado x Programação , antes de codificar tal coisa.

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

Esteja ciente de que no Linux, o código do aplicativo interage com o kernel do Linux usando syscalls (2) . A maioria deles pode falhar, consulte errno (3) . Muitos aplicativos Linux (por exemplo, GNU bash , GNU make , GNU gdb , GNOME ) são de código aberto: você tem permissão para baixar, estudar e contribuir com seu código-fonte.

Comentários

  • Programação Linux avançada é um link morto.

Resposta

Idealmente, se você estiver personalizando quais comandos podem ser executados por meio de 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 NOPASSWD em ALL comandos.

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 visudo irá avisá-lo se houver algum erro de sintaxe.

Você pode executar sudo -l para ver as permissões que o seu usuário recebeu, se alguma das informações específicas do usuário NOPASSWD comandos aparecem ANTES de qualquer %groupyouarein ALL=(ALL) ALL comando na saída, você será solicitado a fornecer sua senha.

Se você encontrar Se você mesmo criar muitos desses arquivos sudoers.d, talvez queira criá-los nomeados por usuário para que sejam mais fáceis de visualizar. Lembre-se que a ordenação dos NOMES DE ARQUIVOS e das REGRAS dentro do arquivo é muito importante, o ÚLTIMO carregado vence, seja MAIS ou MENOS permissivo que as entradas anteriores.

Você pode controlar a ordem do nome do arquivo usando um prefixo de 00-99 ou aa / bb / cc, embora também tenha em mente que se você tiver QUALQUER arquivo que não tenha prefixo numérico, eles será carregado após os arquivos numerados, substituindo as configurações. Isso ocorre porque, dependendo das configurações de idioma, a “classificação lexical” que o shell usa primeiro classifica os números e depois pode intercalar letras maiúsculas e minúsculas ao classificar em ordem “crescente”.

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 seu idioma atual imprime AaBbCc etc ou ABC e abc para determinar qual seria o melhor prefixo da “última” letra a ser usado ser.

Resposta

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

em /etc/sudoers

Observe que % sudo consegue.

Comentários

  • Embora essa ‘ seja uma maneira de cumprir uma regra sudo, não ‘ t responda à pergunta sobre por que definir o sinalizador NOPASSWD nesta regra ainda resultou em um prompt de senha. Veja a resposta aceita para ter uma ideia de por que isso aconteceu.

Resposta

O seguinte é para o caso em que você deseja executar um comando sem senha apenas se ele tiver um conjunto específico de opções, onde uma parte das opções é variável . AFAIK, não é possível usar variáveis ou intervalos de valores em declarações sudoers, ou seja, você pode permitir o acesso explicitamente a command option1, mas não command option2 usando:

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

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

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

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

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

  4. Execute seu script sudo script_name.

Por exemplo, eu quero alterar o tempo limite de hibernaçã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 pmset posso fazer muitas coisas e “gostaria de manter essas outras coisas atrás da senha do sudo.

Portanto, 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 sudoers arquivo, tenho a seguinte linha:

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

Para definir o tempo limite em 3 minutos, 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, que não é obrigatória, então o seguinte também funcionaria:

 #!/bin/bash pmset displaysleep $1  

Resposta

Como alternativa, você pode usar python pudo pacote.

Instalação:

user$ sudo -H pip3 install pudo # you can install using pip2 also 

Abaixo está o trecho de código para usar em automação Python para executar comandos com privilégio de root:

user$ python3 # or python2 >>> import pudo >>> (ret, out) = pudo.run(("ls", "/root")) # or pudo.run("ls /root") >>> print(ret) >>> 0 >>> print(out) >>> b"Desktop\nDownloads\nPictures\nMusic\n" 

Abaixo está o exemplo cmd para executar comandos com privilégio de root:

user$ pudo ls /root Desktop Downloads Pictures Music 

Resposta

No script sudoers que está dentro de / etc / descomente a linha fornecida abaixo:

#includedir /etc/sudoers.d

Crie um arquivo com qualquer nome dentro do diretório /etc/sudoers.d/ e adicione o conteúdo conforme dado nas respostas máximas. Como para todos os usuários como root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Esta é a maneira mais segura de executar o script com permissão de root.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *