Я занимаюсь разработкой проекта с использованием скрипта Python в Ubuntu 10.04. В моем проекте мне нужно автоматически перезагрузить систему в определенный период времени. Таким образом, я написал следующую команду в своем скрипте Python.
passwd = "my system password"
os.system('echo %(passwd)s | sudo reboot -f' %locals())
Она работала нормально, но сегодня, когда я запускаю свой скрипт, он выдает следующую ошибку.
sudo no tty present and no askpass program specifiedКак решить эту проблему. Мне нужно перезагрузить систему с помощью скрипта Python. Если вы знаете, дайте мне, ваш ответ очень полезен для меня.
Вы можете перезагрузить компьютер через 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()
Я нашел очень интересную информацию, которая могла помочь Вашей проблеме.
sudo только запустит программу как другого пользователя, если одно из этих 3 условий соблюдали (что касается паролей):
- опция NOPASSWD указана
- пользователь ввел корректный целевой пароль
- пользователь ввел корректный исходный пароль
Так как опции 2 и 3 требуют TTY (sudo, не будет читать из канала), он не будет работать, если он не может найти тот. Проверьте свой сценарий, если в какой-либо точке Вы запускаете скрипт удаленно с помощью ssh, поскольку возможно, что это не выделит TTY для неинтерактивной удаленной команды.
Источник: Сообщение № 2 (pludi) на sudo: никакой подарок tty и никакая askpass программа не указаны (linuxgeek)
Для получения дополнительной информации об этом решении, посмотрите то обсуждение форума.