2011-03-04 22 views
19

我遇到問題。我正在編寫一個軟件,這是執行需要用戶處於sudo模式的操作所需的軟件。運行'sudo python filename.py'不是一個選項,這導致我的問題。是否有通過python腳本改爲須藤一半的方式,安全性是不是一個問題,因爲用戶將知道輸入sudo密碼的程序應以下列方式運行來說明這個問題正在作爲更改爲python腳本中的sudo用戶

  1. 程序正常用戶
  2. ......執行操作
  3. 用戶輸入密碼須藤
  4. 用戶改變爲須藤
  5. 子節目需要須藤權限運行觸發甚至(子節目的結束)
  6. 用戶再次成爲普通用戶
  7. ......執行操作

我的問題就出在步驟3,任何指針或構架,你可以提議將有很大的幫助。

乾杯

克里斯

+0

我認爲,一個完美的解決方案將具有以下品質,無論它是否可行:1.它不涉及重新啓動腳本。 2.它不涉及在Python腳本中調用第二個Python腳本。 3.根特權僅適用於腳本的指定部分(而不是開始,不一定是結束)。 – Shule 2014-09-10 09:28:51

回答

2

使用Tcl和Expect,加上子進程來提升自己。所以基本上是這樣的:

sudo.tcl

spawn sudo 
expect { 
    "Password:" { 
     send "password" 
    } 
} 

sudo.py

import subprocess 
subprocess.call(['tclsh', 'sudo.tcl']) 

然後運行sudo.py.

+0

當我運行Python腳本時,我得到'無效命令名'spawn「'(正如你在這裏所做的一切一樣) 。我應該做什麼不同? – Shule 2014-09-12 22:47:52

+0

也許使用Python的'pexpect'模塊和'pexpect.spawnu'類將有助於創建一個全Python解決方案。如果您知道如何使用它,請隨時將其編輯到您的答案中。 (並不是說我需要一個全Python解決方案,只要它適用於我,這太好了。) – Shule 2014-09-12 22:56:36

+0

我需要一個全部python解決方案。你是否有一個? – answerSeeker 2017-01-14 04:23:36

8

不要試圖讓自己須藤只是檢查,如果你是,如果你的錯誤不

class NotSudo(Exception): 
    pass 

if os.getuid() != 0: 
    raise NotSudo("This program is not run as sudo or elevated this it will not work") 
+3

不應該是'os.geteuid()!= 0'嗎? – 2012-08-30 21:37:52

+15

這不是一個很好的解決方案 - 如果只有部分腳本需要root權限,該怎麼辦? – Timmmm 2012-10-06 10:51:26

+1

@Timmmm這是一年前的事。另一方面,如果腳本的單個部分需要sudo,那麼該腳本將失敗,更好地清除錯誤。 – 2012-10-06 13:00:03

0

可以使用的setuid來設置用戶的UID。但出於明顯的安全原因,只有在root用戶的情況下才能執行此操作(或者該程序具有suid root權限)。這兩個都可能是一個壞主意。

在這種情況下,您需要sudo權限才能運行特定的程序。在這種情況下,代之以「sudo theprogram」。

17

最好使用提升的權限盡可能少地運行程序。您可以通過subprocess.call()函數運行需要更多特權的小部分,例如

import subprocess 
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"]) 
4

我最近在製作系統安裝腳本時處理了這個問題。要切換到超級用戶的權限,我用subprocess.call()與「須藤」:

#!/usr/bin/python 

import subprocess 
import shlex 
import getpass 

print "This script was called by: " + getpass.getuser() 

print "Now do something as 'root'..." 
subprocess.call(shlex.split('sudo id -nu')) 

print "Now switch back to the calling user: " + getpass.getuser() 

請注意,你需要使用shlex.split(),使您的命令可用於subprocess.call()。如果你想使用命令的輸出,你可以使用subprocess.check_output()。還有一個名爲'sh'的包(http://amoffat.github.com/sh/),可以用於此目的。

0

如果能夠封裝只是需要在一個單獨的可執行權限提升必要的功能,你可以使用上的可執行程序的setuid位,並從用戶級的Python腳本調用它。

這樣,只有setuid可執行文件中的活動以root身份運行,但是執行此操作不需要sudo,即root權限。只有創建/修改setuid可執行文件需要sudo。

有一些安全隱患,如確保您的setuid可執行程序正常進行消毒任何用戶輸入(例如,參數),所以它不能被欺騙,做一些不應該(副混淆的問題)。

裁判: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

編輯:setuid的似乎只用於編譯的可執行文件(二進制),而不是解釋腳本工作,所以你可能需要使用編譯setuid的包裝。

-4

您是否在談論在執行過程中讓用戶輸入密碼的一半? raw_input()可以從控制檯獲取用戶輸入,但不會屏蔽密碼。

>>>> y = raw_input() 
somehting 
>>> y 
'somehting' 
+0

不,我們在談論權限,雖然授予權限的程序往往會要求輸入密碼(但這不是關鍵要素)。 (比如在不使用第二個腳本的情況下使用'sudo'中途執行某個程序,等等。) – Shule 2014-09-10 22:38:22

0
import subprocess 
subprocess.check_output("sudo -i -u " + str(username) + " ls -l", shell=True).decode("utf-8").strip() 
+1

雖然我的答案沒有看到任何問題,但您可能需要專注於回答最近的問題;這個是5歲 – 2016-04-11 17:27:54