不能再 SUDO SU,“没有 tty 存在,也没有指定 askpass 程序”

Posted

技术标签:

【中文标题】不能再 SUDO SU,“没有 tty 存在,也没有指定 askpass 程序”【英文标题】:Cannot SUDO SU anymore, "no tty present and no askpass program specified" 【发布时间】:2014-11-18 17:32:22 【问题描述】:

我有一个根服务器,我在其中禁用了通过用户 root 登录并在 sudoer 列表中创建了另一个用户。所以当我想在服务器上工作时:

ssh myusername@IP_ADDRESS

在服务器上:

sudo su

输入我的密码以获得 root 权限。这工作正常 6 个月了。今天我在做sudo su:时收到这个消息

sudo: no tty present and no askpass program specified

黑客正在发生什么?这个错误是什么意思,为什么我会得到它?没有 root 权限,我不能在服务器上做这么多。知道如何解决这个问题吗?

【问题讨论】:

尝试使用 ssh -t username@host 登录,请不要使用“sudo su”,为了这个目的可以切换到 sudo。请改用 sudo -s,如果您想输入 root 密码,请使用 su。 @superjedi 也不起作用。即使使用root密码。我想我今晚必须重置服务器,因为我不知道它为什么不工作。 当你登录到远程服务器时(并且在运行 sudo 之前),你真的有一个 tty 吗?运行“tty”应该会打印出你的 tty 的名称。之后,我会检查您的 tty 设备和“/dev/tty”上的权限,看看它们是否搞砸了。 @Kenster 我得到crw--w---- 1 username tty 136, 2 Sep 24 2014 /dev/pts/2 sudo 实际上会打开“/dev/tty”进行读写,如果失败则打印该错误。检查那个烫发。 【参考方案1】:

sudo 尝试打开/dev/tty 进行读写,如果失败则打印该错误。您已在 cmets 中指出您的系统上缺少 /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

其中“主要”是正确的主要号码。

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

chmod 666 /dev/tty

【讨论】:

我在 debian 7 上。 -S 命令在我的系统上不可用,请参阅 dpaste.com/3E430WH 我的输出。我今晚要重新启动系统并报告。 你试过了吗?我在那里看到一个大写的 S:sudo [-AbEHknPS] 是的,我试过了,它只是向我展示了 sudo 命令的帮助指南(我之前评论的输出)。 您是否也指定了 sudo 运行的命令? sudo -S su 例如? 效果很好。我现在以 root 身份登录。您知道如何计算次要/主要吗?【参考方案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)。

理想情况下(更安全)是将 root 权限仅限于可以指定为 %admin ALL=(ALL) NOPASSWD:/path/to/program 的特定命令

【讨论】:

【参考方案3】:

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

各种情况都可能导致 shell 没有使用控制 tty 运行,其中一些不提供任何可见的警告。例如,我最近在使用 Emacs shell 窗口 (Cannot open pty under Mac OS High Sierra) 的 High Sierra 上遇到了一个问题——High Sierra 使用与早期 Mac OS X 版本不同的分配 pty 的机制,所以如果你的代码没有为它重新配置,它将无法分配 pty。

【讨论】:

以上是关于不能再 SUDO SU,“没有 tty 存在,也没有指定 askpass 程序”的主要内容,如果未能解决你的问题,请参考以下文章

linux su和sudo命令的区别

因修改/etc/sudoers权限导致sudo和su不能使用的解决方法

su命令 sudo命令 限制root远程登录

在Linux系统中应用su和sudo

在Linux系统中应用su和sudo

Linux系统中切换用户身份su与sudo的用法与实例