sudo:不存在tty且未指定askpass程序


73

尝试在远程设备上使用运行远程二进制文件时sudo

ssh remotehost "sudo ./binary"

我看到此错误:

sudo:不存在tty且未指定askpass程序

我该如何解决?

编辑这绝对不是这样提出的问题的重复。那里的答案是完全不相关的。实际上,对sudoers文件的那些更改已应用于远程主机。


Answers:


78

一种简单的方法是指定-t

ssh -t remotehost "sudo ./binary"

从手册页:

强制伪tty分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用,例如在实现菜单服务时。即使ssh没有本地tty,多个-t选项也会强制tty分配。

我无法确切解释为什么这样做,也许会有更好的方法。如果是这样的话,我想听听:)

@psusi在下面的评论中解释了为什么这样做。


14
它之所以有效,是因为sudo需要tty来提示输入密码,并且在指定要运行的命令时ssh,默认情况下它不会分配一个,因为它通常用于运行可能传输二进制数据的非交互式命令,这可能会使tty跳闸。
psusi 2013年

@psusi您知道这个相关问题的答案吗?unix.stackexchange.com/questions/110841
trusktr 2014年

-tt当使用heredoc传递命令时,还需要,
Rufus

26

题:

我该如何解决?

sudo: no tty present and no askpass program specified

替代答案

或者,尝试:

sudo -S ./binary

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

有帮助的方案

在chroot环境中,这些其他答案可能无法正常工作……可能是因为:

  1. / etc / shadow与/ etc / passwd冲突,不允许用户输入密码。
  2. 在基于chroot的环境中,对tty1的访问可能会有点麻烦,而对tty2的ctrl-alt f2则是不可行的,因为它是非基于chroot的环境中的tty。

例如:使用chroot环境(例如Archlinux和arch-chroot)手动安装/修复linux或bootloader。


我在运行sudo -S ./binary时遇到sudo:./binary:命令未找到错误,这有什么用?
Ajit Goel

5

您需要定义将读取密码的终端/应用程序。有两种变体:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (默认为visiblepw)

11
是不是最好使用visudo而不是vim /etc/sudoers为了避免由于编辑错误而将自己锁定在计算机之外?
Drew Noakes 2014年

2

失败,因为sudo试图输入root密码,并且没有分配伪tty。

您必须以root用户身份登录或在/etc/sudoers (或:)中设置以下规则sudo visudo

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

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


虽然这是不正确的(没有证据表明这一点,并且在centos和ubuntu系统中具有该代码的admin组中的用户仍然会收到错误),但它是远程创建基于这些组的组和规则的一个很好的技巧升级的任务
MrMesees '16

2

您还可以在/etc/sudoers.d中创建一个文件,例如“ sudo_shutdown”,其内容为:

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

这使adm组中的用户无需密码即可关机。


3
您是否打算编辑此内容以涵盖“不存在任何礼物”
Elder Geek

2

就我而言,我收到此错误是因为我没有在sudoers中指定要用作root用户的命令

就像是

/etc/sudoers.d/myuser

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

为我工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.