sudo: 没有 tty 存在,也没有指定 askpass 程序

尝试在远程主机上使用sudo运行远程二进制文件时:
ssh remotehost "sudo ./binary"

我看到这个错误:
sudo: no tty present and no askpass program specified

如何解决这个问题?
6个回答

一种简单的方法是指定-t
ssh -t remotehost "sudo ./binary"

从手册页上可以看到:
强制伪终端分配。这可用于在远程机器上执行任意基于屏幕的程序,非常有用,比如实现菜单服务。多个-t选项会强制分配tty,即使ssh没有本地tty。
我无法准确解释为什么这样会起作用,可能有更好的方法。如果真有更好的方法,我很想听听您的意见。
@psusi在下面的评论中解释了为什么这样起作用。

18这能够工作是因为 sudo 需要一个 tty 来提示输入密码,而当在使用 ssh 指定运行的命令时,默认情况下并不分配 tty,因为通常用于运行可能传输二进制数据的非交互式命令,这可能会导致 tty 出错。 - psusi
@psusi 你知道这个相关问题的答案吗?http://unix.stackexchange.com/questions/110841 - trusktr
3在使用heredoc传递命令时,还需要使用-tt参数。 - Rufus
这是最好的方法。对我来说很有效。 - Divyanshu Kushwaha

问题:
我该如何解决这个问题?
sudo: no tty present and no askpass program specified

备选答案

作为替代方案,请尝试:

sudo -S ./[yourExecutable]

这将指示sudo从标准输入stdin读取密码。

适用场景

在chroot环境中,其他答案可能无法正常工作...可能是因为以下原因:

  1. /etc/shadow与/etc/passwd冲突,不允许用户输入密码。
  2. 在chroot环境中,访问tty1可能会有些问题,并且ctrl-alt f2 -- 切换到tty2是不可行的,因为它是非chroot环境的tty。

例如:手动安装/修复Linux或引导加载程序时,使用chroot环境(如Archlinux和arch-chroot)。


当我运行sudo -S ./binary时,我得到一个"sudo:./binary:命令未找到"的错误信息,这是怎么回事? - Ajit Goel
1@AjitGoel这只是一个例子。将"./binary"替换为您想要运行的命令。 - Monsignor
工作得很顺利,谢谢。 - DimiDak

它失败了,因为sudo试图提示输入root密码,但没有分配伪终端。
你要么以root身份登录,要么在你的/etc/sudoers(或者:sudo visudo)中设置以下规则。
# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

然后确保您的用户属于admin组(或wheel)。

虽然这并不是真实的(没有提供任何证据,而且在CentOS和Ubuntu系统中具有该代码的管理员组用户仍然会出现错误),但这是一个很好的远程操作提示,可以根据组创建规则,并基于这些组进行升级任务。 - MrMesees

你需要定义一个终端/应用程序来读取密码。有两种变体:
1. `export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass` 2. `vim /etc/sudoers`(Defaults visiblepw)

14使用visudo而不是vim /etc/sudoers是否更好,以避免由于编辑错误而被锁定在机器外? - Drew Noakes

在我的情况下,我收到了这个错误,因为我没有指定一个我想要以root身份使用的命令在sudoers中。
类似于这样的东西

/etc/sudoers.d/myuser:

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

对我来说很有效

你还可以在/etc/sudoers.d中创建一个名为"sudo_shutdown"的文件,内容如下:
# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

这允许属于adm组的用户在无需密码的情况下进行关机操作。

3你是不是打算[编辑]这个来解决"没有tty存在"的问题? - Elder Geek