Как добраться до root, а затем выполнить команды оболочки в Python3 в Ubuntu? - PullRequest
1 голос
/ 30 мая 2020

Я запускаю некоторые команды оболочки с os.system, которые нужно запускать как root.

Я пробовал -

os.system("sudo su")
os.system("other commands")

, а также -

home_dir = os.system("sudo su")
os.system("other commands")

Но оба приведенных выше сценария просто становятся root, а затем перестают выполняться, поэтому остальные мои команды не выполняются.

Я запускаю Python 3.6.9 на виртуальной машине Ubuntu 18.04.

1 Ответ

1 голос
/ 30 мая 2020

Привилегии root, полученные с помощью sudo, применяются только к команде, выполняемой через sudo, и не повышают привилегии вызывающего (в данном случае вашего python скрипта). Итак, ваша первая команда os.system("sudo su") будет запускать интерактивную оболочку root, но после того, как вы выйдете из нее, а затем ваш код python выполнит последующий вызов os.system("other commands"), они будут работать с правами обычного пользователя.

Вы можете запускать каждую команду по одной через sudo:

os.system("sudo some_command")
os.system("sudo some_other_command")

Обратите внимание, что каждая команда будет отдельно регистрироваться sudo в системном журнале, даже если есть несколько команд , sudo не следует запрашивать пароль более одного раза в течение короткого промежутка времени.

Или, если вам нужно выполнить последовательность шагов, таких как изменение каталогов, которые могут быть невозможны в вызывающей стороне (например, , если каталог недоступен для пользователя, отличного от root, который запускает сценарий python), вы можете сделать, например:

os.system("sudo sh -c 'cd some_dir && some_other_command'")

(только для информации, && - это похожа на ;, но другая команда запускается только в случае успешного выполнения cd, поэтому это безопаснее, хотя этот пункт относится к синтаксису оболочки, а не к python.)

Если много c ommands, конечно, у вас также есть возможность просто создать отдельный "вспомогательный" сценарий оболочки и запустить весь сценарий через sudo.

os.system("sudo sh /path/to/myscript.sh")

Наконец, обратите внимание, если вы используете свой python сценарий в неинтерактивной среде вам может потребоваться указать sudo не запрашивать пароль, по крайней мере, для соответствующих вызывающих пользовательских и целевых команд. Для получения дополнительных сведений введите man sudoers и найдите примеры с NOPASSWD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...