我正在使用 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 才会以不同用户身份运行程序:
- 指定了 NOPASSWD 选项
- 用户输入了正确的目标密码
- 用户输入了正确的源密码
由于选项 2 和 3 需要 TTY(sudo 不会从管道读取),如果找不到 TTY,它将无法运行。如果您在任何时候使用 ssh 远程运行脚本,请检查您的脚本,因为它可能不会为非交互式远程命令分配 TTY。
来源: 帖子 #2(经过普鲁迪) 在sudo:没有 tty 存在并且没有指定 askpass 程序(经过linux极客)
有关此解决方案的更多信息,请参阅论坛讨论。