簡體   English   中英

使用 python 腳本以超級用戶身份運行 linux 系統命令

[英]Run a linux system command as a superuser, using a python script

我已經在我的機器上安裝了 postfix,並且我正在以編程方式(使用 python)(在某些操作上)即時更新 virtual_alias。 更新 /etc/postfix/virtual_alias 中的條目后,我將運行以下命令:

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
但我收到錯誤:
 sudo: sorry, you must have a tty to run sudo

我想以非人為的方式運行提到的 sudo 命令(意思是,我從 python 腳本運行這個系統命令。)。 那么如何讓這個命令以編程方式運行呢?

您可以以 root 身份運行 python 腳本 - 然后您無需添加權限即可重新加載后綴。

或者您可以將 sudo 配置為不需要/etc/init.d/postfix的密碼。

sudo 配置(通過 visudo)允許 NOPASSWD: 允許沒有密碼的命令。 http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username>  ALL = NOPASSWD: /etc/init.d/postfix

或類似的東西。

#include <unistd.h>
#include <stdlib.h>

// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix

int main( int argc, char **argv ) {
    setuid( geteuid() );
    system("/etc/init.d/postifx reload");
}

將您的命令包裝在 setuid-ed 程序中。 這將讓任何用戶重新啟動 postfix。 您當然可以進一步限制某些組的執行權限。

要回答錯誤:“sudo:抱歉,您必須有一個 tty 才能運行 sudo”,我們在 sudoers 文件中有一個名為“Defaults requiretty”的設置。 我試着把它評論出來,它奏效了:D。

import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

這當然幾乎總是不是一個好主意,因為密碼是純文本的。

如果您要在 python 中執行此操作,您應該執行以下操作:

將此命令寫在調用 shell 命令的行之前

os.setuid(os.geteuid())

然后,您調用不帶“sudo”前綴的 shell 命令

StackLick

您需要授予用戶在沒有密碼的情況下運行sudo 命令

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM