不能再 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 程序”的主要内容,如果未能解决你的问题,请参考以下文章