无法再使用SUDO SU,提示“no tty present and no askpass program specified”。

7

我有一个根服务器,禁用了 root 用户登录,并创建了另一个用户并添加到 sudoer 列表中。因此,当我想在服务器上工作时,我会执行以下操作:

ssh myusername@IP_ADDRESS

在服务器上:
sudo su

输入我的密码以获取root权限。这个方法在过去的6个月中一直有效。今天我执行sudo su时遇到了这个消息:

sudo: no tty present and no askpass program specified

发生了什么鬼?这个错误是什么意思,为什么我会收到它?没有root权限,我在服务器上无法做太多事情。有什么办法可以解决这个问题吗?


尝试使用ssh -t用户名@主机登录,并且请不要使用"sudo su",因为有一个专门用于此目的的sudo开关。请改用sudo -s,或者如果您想输入root密码,只需使用su即可。 - superjedi
@superjedi也不起作用。即使使用root密码也是如此。我想今晚我必须重置服务器,因为我不知道为什么它不工作。 - DarkLeafyGreen
1
当您登录远程服务器(并在运行sudo之前),您是否实际上有一个tty? 运行“tty”应该会打印出您的tty名称。然后,我会检查您的tty设备以及“/ dev / tty”的权限,以查看它们是否出了问题。 - Kenster
@Kenster 我得到了 crw--w---- 1 用户名 tty 136, 2 Sep 24 2014 /dev/pts/2 - DarkLeafyGreen
sudo 实际上是打开 "/dev/tty" 进行读写操作,并在失败时打印该错误。请检查其权限。 - Kenster
显示剩余2条评论
3个回答

20

sudo 尝试读写打开 /dev/tty ,如果失败会打印该错误信息。根据您在评论中的指示,您的系统上缺少 /dev/tty。

Sudo 有一个选项 -S ,可以从标准输入读取密码而不是使用 /dev/tty。您应该可以运行 sudo -S 以成为 root。

关于如何恢复 /dev/tty,重新启动服务器可能就足够了;系统可能会在启动过程中重新创建 /dev 中的所有设备。或者,您可以使用 mknod 命令来创建设备,但您需要知道 tty 设备的正确主设备号和次设备号。在我可用的 Ubuntu 系统中,在 /dev 中看到以下条目:

crw------- 1 root root      5,   1 Apr 16 18:36 console
crw-rw-rw- 1 root tty       5,   2 Sep 24 15:35 ptmx
crw-rw-rw- 1 root tty       5,   0 Sep 24 14:25 tty

在这种情况下,主要号码是5,次要号码是0。/dev/console和/dev/ptmx具有相同的主要号码。因此,我将检查/dev/console或/dev/ptmx以找到正确的主要号码,然后运行:

mknod /dev/tty c major 0

“major”是正确的主设备号。

重新创建/dev/tty后,请确保权限设置正确:

chmod 666 /dev/tty

1
我正在使用Debian 7。在我的系统上,-S命令不可用,请参见http://dpaste.com/3E430WH以查看我的输出。今晚我将重新启动系统并回报结果。 - DarkLeafyGreen
你试过了吗?我看到里面有一个大写字母S:sudo [-AbEHknPS] - Kenster
是的,我尝试过了,它只是显示了sudo命令的帮助指南(即我之前评论的输出)。 - DarkLeafyGreen
你是否指定了sudo要运行的命令?例如sudo -S su - Kenster
1
太好了,它起作用了。我现在已经以root身份登录了。你有想法如何找出minor/major吗? - DarkLeafyGreen
只要你在http://unix.stackexchange.com/上提出问题并注明你正在运行的Linux具体版本,就会有人帮助你。 - Kenster

7

这个失败是因为sudo正在尝试提示输入root密码,但没有虚拟终端分配。

您需要以root身份登录或在/etc/sudoers(或:sudo visudo)中设置以下规则:

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

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

理想情况下(更安全),应该仅将root权限限制为特定命令,这些命令可以指定为%admin ALL=(ALL) NOPASSWD:/path/to/program


0

需要检查的一件事是操作系统是否认为各个进程“有一个tty”。如果您仍然遇到问题,最好在运行ssh的shell和运行sudo的shell中都执行此操作。检查的简单方法是使用命令“tty” - 如果返回“not a tty”,则该shell没有“控制tty”,即使它存在于文件系统中也无法打开/dev/tty。

各种情况可能导致shell未使用控制tty运行,并且其中一些情况不提供任何可见警告。例如,我最近在High Sierra上使用Emacs shell窗口时遇到了问题(Cannot open pty under Mac OS High Sierra) - High Sierra使用与早期Mac OS X版本不同的机制来分配pty,因此如果您的代码未针对其进行重新配置,则将无法分配pty。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接