Eu preciso executar algo como sudo sem uma senha, então eu usei visudo
e adicionei isso ao meu sudoers
arquivo:
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?
/path/to/my/program
fosse um script python?.bashrc
)? Ou mesmo um script de shell dentro/usr/local/sbin
? Tentar./etc
, mas alguns sistemas colocam isso em outro lugar. Se você não conseguir encontrá-lo, tenteman sudoers
. O local local para esse arquivo deve ser substituído naman
página no momento em quesudo
foi criado para esse sistema.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.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_reset
em/etc/sudoers
ou que esta opção é o padrão de tempo de compilação (sudo sudo -V | grep env
deve incluirReset the environment to a default set of variables
).fonte
john ALL=(ALL) NOPASSWD: all
. Não faz sentido seguir adiantesu
.sudoers
, você não precisa fazer nada de especial:sudo
verifica todas as vezes.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:
Crie um novo arquivo de script (substitua
create_dir.sh
pelo nome do script desejado):O script será criado no diretório inicial do usuário
Adicionar alguns comandos que apenas um
root
ousudo
usuário pode executar como a criação de uma pasta no nível do diretório root:Nota: Não adicione
sudo
a esses comandos. Salvar e sair (usando:wq!
)Atribua permissões de execução a ele usando:
Faça as alterações para que este script não exija uma senha.
Abra o
sudoers
arquivo:Adicione a seguinte linha no final:
Substitua
ahmad
por qualquer que seja o seu nome de usuário. Verifique também se esta é a última linha. Salvar e sair.Agora, ao executar o comando, adicione
sudo
antes dele: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/
fonte
sudo
partesudo 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 gravarcreate_dir.sh
, você efetivamente concedeu um shell raiz gratuito a esse usuário.chmod
é desnecessário, pois você confia emsudo
elevar seus privilégios.Eu acho que sua sintaxe está errada. Pelo menos eu uso o seguinte que funciona para mim:
fonte
(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.Se você deseja evitar ter que usar o sudo nem alterar o arquivo de configuração do sudoers, pode usar:
Isso fará com que o comando seja executado como root sem a necessidade do sudo.
fonte
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 é:
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
ou Ignorar autenticação para um usuário
ou Ignorar a autenticação de um executável para um usuário específico
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.
fonte
Verifique se o sudo não possui alias. Corra assim
Por exemplo, um apelido de shell como este:
pode causar esse comportamento.
fonte
sudoers
sudo. Ou você está falando sobre o redirecionamentosudo
para algo que sempre imprime essa mensagem de erro para obter senhas? Que é improvável o caso aqui ...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.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
.desktop
arquivo que execute seu programa com o sudo, assim como no terminal.Você também pode usar
gtk-sudo
um 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.
fonte
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/bin
um 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
sudo
ao chamar o script. Não usesudo
o 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.fonte
sudo
perfeitamente dentro de um script é ótimo, desde que você tenha os direitos apropriados (configuradossudoers
) para executar o comando em questão sem uma senha. Isso torna as coisas um pouco mais seguras.Outra possibilidade pode ser instalar, configurar e usar o super comando para executar seu script como
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/sudo
e/bin/su
esuper
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 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.
fonte
Idealmente, se você estiver personalizando os comandos que podem ser executados,
sudo
faça essas alterações em um arquivo separado em/etc/sudoers.d/
vez de editar osudoers
arquivo diretamente. Você também deve sempre usarvisudo
para editar o (s) arquivo (s). NUNCA deve concederNOPASSWD
emALL
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
avisará se você tiver algum erro de sintaxe.Você pode executar
sudo -l
para ver as permissões concedidas ao usuário, se algum dosNOPASSWD
comandos específicos do usuário aparecer ANTES de qualquer%groupyouarein ALL=(ALL) ALL
comando 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.
Tente executar
printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
eprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
verifique se o seu idioma atual é impressoAaBbCc
etc. ouABC
entãoabc
para determinar qual seria o melhor prefixo de "última" letra a ser usado.fonte
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.
fonte
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 option1
mas nãocommand option2
usar:user_name ALL=(root) /usr/bin/command option1
mas se a estrutura for
command option1 value1
, ondevalue1
pode variar, você precisará ter linhas explícitas de sudoers para cada valor possível devalue1
. 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.
sudo
./usr/local/bin/
), torne o arquivo de propriedade da raiz (por exemplochown root:wheel /usr/local/bin/script_name
) sem acesso de gravação para outras pessoas (por exemplochmod 755 /usr/local/bin/script_name
).Adicione a exceção aos sudoers usando o visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.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
pmset
pode 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
: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, 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:
fonte