2016-04-14 61 views
1

我想讓一個由多個模塊組成的腳本,我需要這些腳本的su/sudo,而不是讓用戶每次都輸入密碼,我只想問一次,然後用它來完成。 (我也不想以明文存儲密碼,因爲它打算用於具有不同用戶/密碼的不同機器上)Python - 共享getpass()用另一個腳本輸入?

好的,所以這是我迄今爲止所做的,但我不斷收到錯誤。我不確定它是否正確,我是python的新手。

在我的文件,main.py:

import getpass 
import subprocess 

suStart = getpass.getpass("please enter your password") 
suPass = suStart 
subprocess.Popen(['python', 'test.py']) 

和test.py:

from manager import suPass 
print suPass 

當主通話測試,它會嘗試再次運行getpass,則我得到IO錯誤errno的5

我想我需要的是如何將suStart保存爲自己的字符串?我認爲使用suPass會做到這一點,但事實並非如此。

謝謝!

+1

1)。你爲什麼試圖通過'subprocess'執行python代碼。爲什麼不把代碼正確地封裝到函數中,導入腳本並調用函數? 2)。一旦你有密碼,你打算如何使用它? 'su' /'sudo'不允許你將密碼作爲變量提交,它**必須通過終端提供,而且你不能將其傳給它們。 –

+0

哦,我在做什麼,是從終端執行腳本,然後我創建一個shell來運行su命令 – JvK92

+0

好的。看起來我錯了:您可以使用'-S'選項將密碼傳遞給'sudo',如[此處](http://superuser.com/a/67766)所示。不過,我認爲只需製作一個運行Python腳本的簡單bash腳本,並使用su或sudo運行該bash腳本會更安全(也更簡單)。 –

回答

1

suPass沒有在test.py的範圍內定義,只有main.py。爲了test.py要注意suPass你初始化子的時候需要在把它作爲一個參數變量,因此,通過它在隨着指定參數和改變test.py,以反映這一點:

from sys import argv 

suPass = argv[1] # we use the second index of argv, as the first index 
        # is actually the name of the script, test.py 

print suPass 

現在,在子電話加入suPass到你的論點:

subprocess.Popen(['python', 'test.py', suPass]) 

現在,如果你想以某種方式保存此密碼安全,你可以使用hashlibbinasciios.urandom來生成密碼哈希值:

import hashlib 
import binascii 
from os import urandom 
import getpass 

salt = os.urandom(64) # where 64 can be any number of bytes, this is just 
         # a random bytes object for making the hash more secure 
         # make sure to keep it when checking a user's password input 
         # or the generated hash will not match! 
# get a new password, and convert it to the bytes type to make it easier later 
new_password = bytes(getpass.getpass('Enter a password: '), encoding='UTF-8') 

# this code generates a bytes object using hashlib.pbkdf2_hmac and 
# converts it to hexadecimal format with binascii.hexlify 
new_hash = binascii.hexlify(hashlib.pbkdf2_hmac('sha512', new_password, salt, 100000) 

print(new_hash) 

new_hashsalt可以保存到一個文件(或數據庫或其他存儲介質),你可以在一個新的程序加密以後,用戶的密碼輸入,然後將哈希與存儲在文件中的內容進行比較。

這裏是Python Docs Example

+0

這工作得很好!謝謝! 此外,關於散列,我能夠只使用new_hash作爲我的密碼輸入或我必須先解密它? 對不起,它聽起來應該是我的規範必不可少的,但我不知道哈希如何工作。 :( – JvK92

+0

哈希不解密,所提出的算法是單向的。爲了比較用戶輸入和存儲的哈希,你需要獲得用戶輸入,用** _加密你用來加密的相同salt _ **第一個哈希值和迭代次數相同 –

+0

啊,我有一種感覺,可能是這樣,我通常是錯誤的,所以我第二次猜測自己,再次感謝! – JvK92

0

下面是一個簡單而有效的方法:爲了讓test.py知道變量suPass,您需要在2個模塊之間稍後分享。

How do I share global variables across modules?

的規範的方式單個 程序內共享跨模塊信息是創建一個特殊的模塊(通常稱爲config或CFG)。 只需在應用程序的所有模塊中導入配置模塊; 模塊將成爲全球名稱。由於每個模塊只有一個實例 ,所以對模塊對象所做的任何更改都得到 無處不在。

因此,這裏是你的模塊:

main.py

import getpass 
import subprocess 

suStart = getpass.getpass("please enter your password") 
suPass = suStart 

test.py

import main 
print main.suPass 

subPass是如何在test.py訪問:調用模塊main.py然後變量本身(main.suPass

+0

當我使用這種方法時, IOError消息,它停止工作:/,但幽靈的答案很好,但感謝您的建議:) – JvK92

相關問題