我该如何解决 tty 问题?

我该如何解决 tty 问题?

我正在使用 Ubuntu 10.04 中的 python 脚本开发项目。在我的项目中,我需要在特定时间段自动重启系统。因此,我在 python 脚本中写了以下命令。

passwd = "my system password"
os.system('echo %(passwd)s | sudo reboot -f' %locals())

它运行正常,但今天当我运行我的脚本时,它抛出了下面的错误。

sudo 没有 tty 存在并且没有指定 askpass 程序
如何解决这个问题。我需要通过 python 脚本重新启动我的系统。如果您知道请告诉我,您的回答对我非常有用。

答案1

您可以通过 dbus 重新启动计算机,无需密码。

(摘自上一个答案我的)

#!/usr/bin/env python

import dbus

def main():
    answer = raw_input("Do you really want to shutdown your computer? (Y/n): ")
    if answer in ('y', 'Y', ''):
        bus = dbus.SystemBus()
        bus_object = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer")
        bus_object.Shutdown(dbus_interface="org.freedesktop.Hal.Device.SystemPowerManagement")

if __name__ == "__main__":
    main()

答案2

我发现了非常有趣的信息,可以帮助解决您的问题。

仅当满足以下 3 个条件之一时(就密码而言),sudo 才会以不同用户身份运行程序:

  1. 指定了 NOPASSWD 选项
  2. 用户输入了正确的目标密码
  3. 用户输入了正确的源密码

由于选项 2 和 3 需要 TTY(sudo 不会从管道读取),如果找不到 TTY,它将无法运行。如果您在任何时候使用 ssh 远程运行脚本,请检查您的脚本,因为它可能不会为非交互式远程命令分配 TTY。

来源: 帖子 #2(经过普鲁迪) 在sudo:没有 tty 存在并且没有指定 askpass 程序(经过linux极客

有关此解决方案的更多信息,请参阅论坛讨论。

相关内容