Como corrigir o erro 'sudo: no tty presente e nenhum programa askpass especificado'?


437

Eu estou tentando compilar algumas fontes usando um makefile. No makefile, existem vários comandos que precisam ser executados como sudo.

Quando eu compilo as fontes de um terminal, tudo corre bem e o make é pausado na primeira vez em que um sudocomando é executado aguardando a senha. Depois de digitar a senha, retome e conclua.

Mas eu gostaria de poder compilar as fontes no NetBeans. Então, iniciei um projeto e mostrei ao netbeans onde encontrar as fontes, mas quando compilei o projeto, ocorreu o erro:

sudo: no tty present and no askpass program specified

A primeira vez que ele atinge um sudocomando.

Procurei o problema na internet e todas as soluções que encontrei apontam para uma coisa: desabilitar a senha desse usuário. Como o usuário em questão aqui é root. Eu não quero fazer isso.

existe alguma outra solução?


3
Estou compilando um sistema operacional de brinquedo. Preciso fazer algumas coisas para configurar a VM, incluindo a criação de um disco rígido virtual com o setor de inicialização.
hebbo


Conforme apontado em serverfault.com/a/597268 , sudo -n my-commandfuncionou para mim. HIH!
55617 Andreyevbr

1
Por favor, escolha uma resposta.
Ichimaru # 11/18

1
@andreyevbr eu acho que não. sudo: a password is required
Ichimaru

Respostas:


260

Conceder ao usuário o uso desse comando sem solicitar a senha deve resolver o problema. Primeiro abra um console do shell e digite:

sudo visudo

Em seguida, edite esse arquivo para adicionar ao final:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

por exemplo

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

vai permitir que o usuário johnpara sudo poweroff, starte stopsem ser solicitado para a senha.

Observe na parte inferior da tela as teclas que você precisa usar no visudo - isso não é vi a propósito - e saia sem salvar ao primeiro sinal de qualquer problema. Aviso de saúde: corromper este arquivo terá sérias conseqüências, edite com cuidado!


4
Sim, a página de manual do sudoers abriu meus olhos para saber como o sudo realmente deve ser usado.
Spencer Williams

6
O visudo deve abrir em qualquer EDITOR que seu ambiente estiver configurado para usar, o que poderia muito bem ser (e deve ser ^ _ ^) vi.
Matt Styles

8
Certifique-se de que a linha de ligação NOPASSWD esteja APÓS qualquer outra linha sudo que possa corresponder (como% wheel) que não possui o sinalizador NOPASSWD.
Anthony

27
eu não posso "sudo visudo" porque eu não posso sudo em primeiro lugar!
Gubatron 23/09/16

8
Considere adicionar um arquivo ao /etc/sudoers.d e deixar o arquivo visudo intocado.
Xlttj #

183

Tentar:

  1. Use NOPASSWDlinha para todos os comandos, quero dizer:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Coloque a linha depois de todas as outras linhas no sudoersarquivo.

Isso funcionou para mim (Ubuntu 14.04).


13
Eu adicionei a linha pela primeira vez após outras configurações do usuário, mas ela só funcionou quando colocada como absolutamente a última linha no arquivo no lubuntu 14.04.1.
user77115

A segunda parte foi a solução que eu era o que estava precisando. Uma linha de configuração existente (para grupo de roda) também correspondia ao meu comando sudo, mas sem a entrada NOPASSWD:. Colocar minha nova linha depois da prioridade, não permitindo o uso de senha para o comando específico que eu precisava.
Anthony

5
Como o @ user77115 havia mencionado, isso só funcionaria se você a colocasse como a última linha no arquivo sudoers, mesmo com o Ubuntu 16.04. Como uma observação lateral, conceder permissões de sudo ao jenkins para todos os comandos é uma grande preocupação de segurança. Considere agrupar seus scripts jenkins e jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
conceda

jenkinsé apenas um nome de usuário? Deve ser o nome do usuário da máquina host? E se o nome de usuário na máquina host corresponder ao nome de usuário do servidor remoto?
Mrgloom 2/17

isso é específico da jenkins, parece que stackoverflow.com/a/22651598/1041319 é uma solução mais genérica.
arntg

167

Tentar:

ssh -t remotehost "sudo <cmd>"

Isso removerá os erros acima.


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machineveja também: sudo-no-tty-present-and-no askpass-program-specific Também sudo -Apermite configurar um sudoprograma askpass, mas apenas vejo GUIs. Alguém conhece um askpass para permitir ssh remotehost sudo -A askpass?
aqui

1
Correção, O -Afor sudonão aceita argumentos e requer um ambiente SUDO_ASKPASSou um sudo.conf So ssh remotehost sudo -A commandainda funcionaria. Ainda curioso sobre um programa askpass baseado em terminal.
aqui

7
isso não funciona para mim (provavelmente porque estou chamando ssh de um script), dando-me o erro Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

Funciona muito bem para mim. Obrigado!
precisa saber é

1
Isso não responde à pergunta.
precisa

125

Depois de todas as alternativas, eu encontrei:

sudo -S <cmd>

A opção -S (stdin) faz com que o sudo leia a senha da entrada padrão em vez do dispositivo terminal.

Fonte

O comando acima ainda precisa da senha a ser inserida. Para remover a inserção manual de senha, em casos como jenkins, este comando funciona:

echo <password> | sudo -S <cmd> 

Isso parece resolver meu problema. Mas existe algum efeito colateral usando esse comando?
Xiaodong Qi 10/10

3
sudo -S <command>- trueacontece de ser um comando fictício que retorna um código de saída 0 ( falseé um comando que retorna 1). Obrigado, esta é a única resposta verdadeira, pois todos os outros esperam que o "sudo" funcione!
Adam Plocher

1
-S: Escreva o prompt para o erro padrão e leia a senha da entrada padrão em vez de usar o dispositivo terminal. A senha deve ser seguida por um caractere de nova linha.
fileinster

Isso funciona imediatamente e pode fazer com que o sudo funcione até o tempo limite, mas não soluciona quaisquer problemas subjacentes que possam existir, e o problema pode voltar.
Nealmcb

Eu não sei se está funcionando, mas está mostrando, Password:então nada acontece. Não consigo digitar a senha.
Ichimaru

43

sudopor padrão, lerá a senha do terminal conectado. Seu problema é que não há um terminal conectado quando ele é executado no console do netbeans. Então você tem que usar uma maneira alternativa de inserir a senha: isso é chamado de programa askpass .

O programa askpass não é um programa específico, mas qualquer programa que possa solicitar uma senha. Por exemplo no meu sistemax11-ssh-askpass funciona bem.

Para fazer isso, você precisa especificar qual programa usar, com a variável de ambiente SUDO_ASKPASSou no sudo.confarquivo (consulte man sudopara detalhes).

Você pode forçar sudoa usar o programa askpass usando a opção -A. Por padrão, ele será usado apenas se não houver um terminal conectado.


A solução atual requer uma GUI. O programa askpass funciona no terminal.
aqui

@here: Bem ... se você executa o ssh em um terminal, ele solicita uma senha diretamente, você não precisa de nada de especial ... Ou está perguntando sobre solicitar a senha em um terminal diferente daquele que será executar a sessão ssh?
Rodrigo

1
ahh agora vejo que -Anão leva argumentos. -Arequer ambiente SUDO_ASKPASSou um sudo.confarquivo. Nesse caso, ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"seria ainda trabalho com um askpass base terminal, no entanto @chandru é muito mais concisa abaixo comssh -t ...
aqui

Existem alguns problemas com o uso de -A. Primeiro, se -A for usado e SUDO_ASKPASS não tiver sido definido, você receberá um erro. Segundo, quando -A for usado, o ssh não usará credenciais em cache, sempre solicitará uma senha.
anthony

Como adendum você pode gostar de olhar para as minhas notas sobre programas de entrada de senha ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony

26

Para usuários do Ubuntu 16.04

Há um arquivo com o qual você precisa ler:

cat /etc/sudoers.d/README

Colocando um arquivo com o modo 0440 em /etc/sudoers.d/myuser com o seguinte conteúdo:

myuser  ALL=(ALL) NOPASSWD: ALL

Deve corrigir o problema.

Não esqueça de:

chmod 0440 /etc/sudoers.d/myuser

Agradável. Solução mais limpa que a popular.
Paul Praet

2
Não siga isso cegamente. Eu criei um novo arquivo no /etc/sudoers.d como descrito aqui e acabei não podendo mais usar o sudo. Tive que excluir o arquivo pelo modo de recuperação.
Stian

25

Tente este:

echo '' | sudo -S my_command

Funciona para mim, mas alguém pode explicar por que ajuda?
Ololobus 17/05

@ololobus você envia uma senha em branco para o primeiro pedido para introduzir a senha
Nikita Koksharov

Trabalhou! Nenhuma das respostas mais bem classificadas resolveu isso para mim.
drerD

1
Retorna o seguinte erro: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper

16

Se, por acaso, você veio aqui porque não pode sudo dentro do Ubuntu que acompanha o Windows10

  1. Edite o arquivo / etc / hosts no Windows (com o Bloco de notas), ele estará localizado em:, %localappdata\lxss\rootfs\etcadd 127.0.0.1 WINDOWS8, isso removerá o primeiro erro que não pode encontrar o host.

  2. Para se livrar do no tty presenterro, sempre façasudo -S <command>


2
Obrigado por fornecer uma resposta para as pessoas que vieram aqui por um motivo não relacionado à descrição da pergunta, mas ao título da pergunta correspondente. +1
Jayant Bhawal 12/11/2016


15

Entre no seu Linux. Dispare os seguintes comandos. Tenha cuidado, pois editar sudoer é uma proposta arriscada.

$ sudo visudo

Quando o vi editor for aberto, faça as seguintes alterações:

  1. Comentar Defaults requiretty

    # Defaults    requiretty
    
  2. Vá para o final do arquivo e adicione

    jenkins ALL=(ALL) NOPASSWD: ALL
    

12

Em Jenkins :

echo '<your-password>' | sudo -S command

Por exemplo : -

echo '******' | sudo -S service nginx restart

Você pode usar o Mask Password Plugin para ocultar sua senha


11

Isso funcionou para mim:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

onde seu usuário é "meu usuário"

para uma imagem do Docker, isso seria apenas:

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

9

Verifique se o comando que você está sudoinserindo faz parte do seu PATH.

Se você tiver uma sudoersentrada de comando única (ou múltipla, mas não ALL) , receberá asudo: no tty present and no askpass program specified quando o comando não fizer parte do seu caminho (e o caminho completo não for especificado).

Você pode corrigi-lo adicionando o comando ao seu PATHou invocando-o com um caminho absoluto, ou seja,

sudo /usr/sbin/ipset

Ao invés de

sudo ipset


1
Isso é realmente bifurcado para mim. no sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gite usando o sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitretorno de gancho pós-atualização no git no tty, mas usando o sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gittrabalho sem senha.
Foton

7

Comando sudo falha ao tentar solicitar a senha root e não há pseudo-tty alocado (como parte do script).

Você precisa fazer login como root para executar este comando ou configurar as seguintes regras em seu /etc/sudoers (ou sudo visudo:):

# Members of the admin group may gain root privileges.
%admin  ALL=(ALL) NOPASSWD:ALL

Em seguida, verifique se o usuário pertence ao admingrupo (ou wheel).

O ideal (mais seguro) seria limitar os privilégios de root apenas a comandos específicos que podem ser especificados como %admin ALL=(ALL) NOPASSWD:/path/to/program


Eu sei, é uma maneira muito mais segura de fazer. Embora, eu escrevi o seguinte comando no sudoersarquivo, apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shmas ele não funciona para mim. dá o seguinte errosudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz 13/06/2015

1
BTW, funciona bem, apache ALL=(ALL) NOPASSWD: ALLmas representa um risco à segurança. :)
muaaz

6

Acho que posso ajudar alguém com o meu caso.

Primeiro, alterei a configuração do usuário /etc/sudoersconsultando a resposta acima. Mas ainda não funcionou.

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

No meu caso, myuserestava no mygroup.

E eu não precisava de grupos. Então, excluiu essa linha.

(Não deve excluir essa linha como eu, apenas marcando o comentário.)

myuser   ALL=(ALL) NOPASSWD: ALL

Funciona!


3

A execução de scripts shell que contenham comandos sudo nos jenkins pode não ser executada conforme o esperado. Para corrigir isso, siga

Passos simples:

  1. Em sistemas baseados no ubuntu, execute "$ sudo visudo"

  2. isso abrirá o arquivo / etc / sudoers.

  3. Se seu usuário jenkins já estiver nesse arquivo, modifique para ficar assim:

jenkins ALL = (ALL) NOPASSWD: ALL

  1. Salve o arquivo

  2. Relançar seu trabalho de Jenkins

  3. você não deve ver essa mensagem de erro novamente :)


3

Consegui fazer isso, mas siga as etapas corretamente. Isso é para quem está recebendo erros de importação.

Etapa 1 : verifique se os arquivos e pastas têm problema de permissão de execução. Uso do usuário Linux:

chmod 777 filename

Etapa 2 : verifique qual usuário tem permissão para executá-lo.

Etapa 3 : abra o terminal, digite este comando.

sudo visudo

adicione estas linhas ao código abaixo

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

isso é para conceder permissão para executar o script e permitir que ele use todas as bibliotecas. O usuário geralmente é 'ninguém' ou 'www-data'.

Agora edite seu código como

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

vá para o terminal para verificar se o processo está em execução, digite isso aqui ...

ps aux | grep python

isso produzirá todo o processo em execução no python.

Add Ons : use o código abaixo para verificar os usuários em seu sistema

cut -d: -f1 /etc/passwd

Obrigado!


2

Este erro também pode ocorrer quando você está tentando executar um comando de terminal (que requer senha de root) de algum script não shell, por exemplo sudo ls(em backticks) de um programa Ruby. Nesse caso, você pode usar o utilitário Expect ( http://en.wikipedia.org/wiki/Expect ) ou suas alternativas.
Por exemplo, no Ruby para executar sudo lssem obter sudo: no tty present and no askpass program specified, você pode executar o seguinte:

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[isso usa uma das alternativas à extensão Expect TCL: gem ruby_expect ].


2

Para referência, no caso de alguém encontrar o mesmo problema, eu fiquei preso durante uma boa hora com esse erro, o que não deveria acontecer, pois eu estava usando o parâmetro NOPASSWD.

O que eu NÃO sabia era que o sudo pode gerar exatamente a mesma mensagem de erro quando não há tty e o comando que o usuário tenta iniciar não faz parte do comando permitido no arquivo / etc / sudoers.

Aqui está um exemplo simplificado do conteúdo do meu arquivo com o meu problema:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

Quando o bguser tentará iniciar "sudo command_b arg_b" sem nenhum tty (o bguser está sendo usado para algum daemon), ele encontrará o erro "no tty present e no askpass program especificado".

Por quê?

Como falta uma vírgula no final da linha no arquivo / etc / sudoers ...

(Eu até me pergunto se esse é um comportamento esperado e não um bug no sudo, pois a mensagem de erro correta para esse caso deve ser "Desculpe, o usuário bguser não tem permissão para executar etc.")


2

Eu estava recebendo esse erro porque limitava meu usuário a apenas um único 'systemctl' executável e configurara incorretamente o arquivo visudo.

Aqui está o que eu tinha:

jenkins ALL=NOPASSWD: systemctl

No entanto, você precisa incluir o caminho completo para o executável, mesmo que esteja no seu caminho por padrão, por exemplo:

jenkins ALL=NOPASSWD: /bin/systemctl

Isso permite que meu usuário jenkins reinicie os serviços, mas não tenha acesso root completo


1

Ninguém disse o que poderia causar esse erro, no caso de migração de um host para outro, lembre-se de verificar o nome do host no arquivo sudoers:

Portanto, esta é minha / etc / sudoers config

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

se não combinar

uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux

irá aparecer este erro:

nenhum presente tty e nenhum programa askpass especificado


1

Outras opções, não baseadas no NOPASSWD:

  • Inicie o Netbeans com privilégios de root ((sudo netbeans) ou similar), que presumivelmente bifurcarão o processo de compilação com o root e, assim, o sudo terá êxito automaticamente.
  • Faça as operações necessárias para executar o suexec - torne-as de propriedade do root e defina o modo para 4755. (Isso obviamente permitirá que qualquer usuário da máquina as execute.) Dessa forma, eles não precisam do sudo.
  • Criar arquivos de disco rígido virtual com setor de inicialização não deve precisar de sudo. Arquivos são apenas arquivos, e setores de inicialização são apenas dados. Até a máquina virtual não deve necessariamente precisar de raiz, a menos que você faça o encaminhamento avançado de dispositivo.

1

Talvez a pergunta não esteja clara: por que nenhuma resposta foi compatível, mas eu recebi a mesma mensagem de erro quando estava tentando montar sshfs que exigiam o sudo: o comando é algo como isto:

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

adicionando a opção -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

Eu tive a mesma mensagem desta pergunta:

sudo: no tty present and no askpass program specified

Então, lendo a resposta de outras pessoas, tornei-me criar um arquivo no /etc/sudoer.d/usermy.server.tld com:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

e agora eu consigo montar a unidade sem dar muito direito extra ao meu usuário.


0

Embora essa pergunta seja antiga, ainda é relevante para o meu sistema mais ou menos atualizado. Após ativar o modo de depuração do sudo ( Debug sudo /var/log/sudo_debug all@infoin /etc/sudo.conf), fui apontado para / dev: " /dev is world writable". Portanto, pode ser necessário verificar as permissões do arquivo tty , especialmente aquelas do diretório em que o nó tty / pts reside.


0

Se você adicionar esta linha ao seu /etc/sudoers(via visudo), ele resolverá o problema sem ter que desativar a digitação da senha e quando um alias para sudo -Snão funcionar (scripts chamando sudo):

Defaults visiblepw

É claro que você mesmo leu o manual para entendê-lo, mas acho que, para meu caso de uso, é executado em um contêiner LXD através do lxc exec instance -- /bin/bashseu bastante seguro, pois não está imprimindo a senha em uma rede.


0

Usando pipeline:

echo your_pswd | sudo -S your_cmd

Usando o documento aqui:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

Abra um terminal para solicitar a senha (o que funcionar):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"

-1

1 aberto / etc / sudoers

tipo sudo vi /etc/sudoers. Isso abrirá seu arquivo no modo de edição.

2 Adicionar / modificar usuário linux

Procure a entrada para usuário do Linux. Modifique como abaixo se encontrado ou adicione uma nova linha.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Salvar e sair do modo de edição

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.