2015-02-26 3 views
1

У меня есть скрипт python, который должен вызывать системный вызов для спящего режима системы (Ubuntu-Server). Я стараюсьВызов команды hibernate из python

#!/usr/bin/env python 

import os 
os.system('pm-hibernate') 

Если я запускаю это без Sudo-прав, я получаю правильную ошибку:

This utility may only be run by the root user. 

Но при вызове этого сценария с ничего Судо-прав произойдет. Как вызвать команду hibernate из python?

+0

'os.system (" sudo ... ")' и сделать sudo не запрашивать пароль. – ForceBru

+0

как вы даете права sudo? –

+0

o.o это было так просто :) только напишите sudo перед, и это работает. Я достаточно, чтобы вызвать скрипт с помощью 'sudo./Script.py' – alabamajack

ответ

1

Выполнить его Судо:

#!/usr/bin/env python 
from subprocess import check_call 

check_call(['sudo', '/usr/sbin/pm-hibernate']) 

и настройки пользователя, который работает этот скрипт, чтобы иметь возможность запускать pm-hibernate без пароля, например, создать /etc/sudoer.d/pm-hibernate файл и записать %admin ALL = NOPASSWD: /usr/sbin/pm-hibernate в нем (sudo visudo -f /etc/sudoers.d/pm-hibernate).

Убедитесь /etc/sudoers импорта /etc/sudoers.d каталог (sudo visudo) и /etc/sudoer.d/pm-hibernate файл имеет 0440 разрешения:

$ sudo chmod 0440 /etc/sudoer.d/pm-hibernate 

см также sudo less /etc/sudoers.d/README.

Команда позволяет всем членам группы admin запускать sudo pm-hibernate без пароля. Запустите groups, чтобы увидеть группы, в которых вы находитесь.

+0

Я вижу ваше решение, но' check_call' не может выполнить эту команду, потому что 'pm-hibernate' не возвращает статус завершения 0. См. Https://docs.python.org/2/library/subprocess.html#subprocess.CalledProcessError – alabamajack

+0

@alabamajack: [Я знаю, что делает 'check_call()') (http://stackoverflow.com/search?q= % 5Bsubprocess% 5D + пользователь% 3A4279 + является% 3Aanswer). Цель состоит в том, чтобы избежать скрытия ошибки: 'import this' - [Ошибки никогда не должны проходить молча. Если явно не отключено.] (Https://www.python.org/dev/peps/pep-0020/) «pm-hibernate» даже вернется к успеху (при следующем включении)? какой статус он добивается успеха? Вы можете использовать 'subprocess.call ([..])! = Success_status: поднять subprocess.CalledProcessError (...)' – jfs

Смежные вопросы