sudo: nenhum tty presente e nenhum programa askpass especificado

73

Ao tentar executar um binário remoto usando sudona caixa remota:

ssh remotehost "sudo ./binary"

Eu vejo este erro:

sudo: nenhum tty presente e nenhum programa askpass especificado

Como posso resolver isso?

EDITAR definitivamente não é uma duplicata da pergunta sugerida como tal. As respostas são completamente irrelevantes. De fato, essas alterações no arquivo sudoers já foram aplicadas ao host remoto.

Drew Noakes
fonte
possível duplicata de Como executar o comando sudo sem senha?
kenorb

Respostas:

78

Uma maneira simples é especificar -t:

ssh -t remotehost "sudo ./binary"

Na página do manual:

Forçar alocação pseudo-tty. Isso pode ser usado para executar programas arbitrários baseados em tela em uma máquina remota, o que pode ser muito útil, por exemplo, ao implementar serviços de menu. Várias opções -t forçam a alocação de tty, mesmo se ssh não tiver tty local.

Não sei explicar exatamente por que isso funciona, e pode haver uma maneira melhor. Eu gostaria de ouvir sobre isso, se sim :)

@psusi explica por que isso funciona em um comentário abaixo.

Drew Noakes
fonte
14
Funciona porque sudorequer que um tty solicite uma senha e, ao especificar comandos para executar ssh, não aloca um por padrão, pois isso normalmente é usado para executar comandos não interativos que podem transferir dados binários, o que pode desarmar o tty .
Psr #
@psusi Você sabe a resposta para esta pergunta relacionada? unix.stackexchange.com/questions/110841
trusktr
Há também -tt, necessário ao passar de comando usando heredoc
Rufus
26

Pergunta, questão:

Como posso resolver isso?

sudo: no tty present and no askpass program specified

Resposta Alternativa

Como alternativa, tente:

sudo -S ./binary

Isso instrui o sudo a ler a senha da entrada padrão, stdin.

Cenários em que isso ajuda

Em ambientes chroot, essas outras respostas podem não funcionar corretamente ... talvez porque:

  1. O conflito / etc / shadow vs / etc / passwd não permite que o usuário digite uma senha.
  2. Em um ambiente com chroot, o acesso ao tty1 pode ser um pouco problemático, e ctrl-alt f2 - para tty2 é inviável, porque é um tty do ambiente não com chroot.

Por exemplo: Instalação / reparo manual do linux ou do carregador de inicialização, usando um ambiente chroot (como Archlinux e arch-chroot).

elika kohen
fonte
Eu recebo um erro sudo: ./binary: não encontrado quando executo sudo -S ./binary, o que dá?
Ajit Goel
5

Você precisa definir o terminal / aplicativo que lerá a senha. Existem duas variantes:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (Padrões visíveispw)
user282246
fonte
11
Não é melhor usá-lo em visudovez de a vim /etc/sudoersfim de evitar um possível bloqueio da sua máquina devido a um erro na sua edição?
Drew Noakes
2

Ele falha, porque sudoestá tentando solicitar a senha root e não há pseudo-tty alocado.

Você deve fazer login como root 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).

kenorb
fonte
Embora isso não seja verdade (nenhuma evidência é fornecida para isso, e os usuários do grupo de administração com esse código nos sistemas centos e ubuntu ainda obtêm o erro), é uma ótima dica para criar sistemas remotos para criar grupos e regras com base nesses grupos para tarefas escaladas
MrMesees 2/16/16
2

Você também pode criar um arquivo como "sudo_shutdown" em /etc/sudoers.d, com o conteúdo:

# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

Isso permite que os usuários do grupo adm sejam encerrados sem uma senha.

Peter
fonte
3
Você pretendia editá- lo para cobrir "no tty present"?
Elder Geek
2

No meu caso, recebi esse erro porque não estava especificando um comando que gostaria de usar como root nos sudoers

Algo como

/etc/sudoers.d/myuser:

myuser ALL=(root) NOPASSWD: \
    /bin/ls -la

trabalhou para mim

GarouDan
fonte