2016-12-29 37 views
1

所以這是我的代碼:https://github.com/trisimix/serialcontrol/blob/master/serialcontrol.py避免將密碼存儲爲明文?

import subprocess 
import os 
import stat 
dmi = subprocess.check_output('dmidecode', shell=True) 
#print(variable) 
#run program once as root then cron it as root 
try : 
    file = open("/var/log/serialcontrol/dmidecode.txt", "r") 
    file.close() 
except FileNotFoundError: 
    script = '/var/tmp/serialcontrol.bash' 
    with open(script, 'w') as file: 
     file.write("#!/bin/bash/\nif [ ! -d /var/log/serialcontrol/ ]\nthen\n\tmkdir /var/log/serialcontrol/\nfi"); 
    #st = os.stat(script) 

    #os.chmod(script, st.st_mode | stat.S_IEXEC) 

    subprocess.call(["bash", script]) 
    subprocess.call(["rm", script]) 
#with open('/var/log/serialcontrol/dmidecode.txt' , 'w') as file: 
#  file.write(dmi); 
file = open("/var/log/serialcontrol/dmidecode.txt" , "w"); 
dmi = str(dmi) 
dmi = dmi.replace('\\n', '\n') 
dmi = dmi.replace('\\t', '\t') 
file.write(dmi) 
file.close() 
script2 = '/var/log/serialcontrol/serialcontro1.bash' 
#with open(script2, 'w') as file: 
# file.write('#!/bin/bash\nrecipients="[email protected]"\nsubject="...Subject..."\necho -e "to: $recipients\nsubject: $subject\n"| (cat - &&uuencode /var/log/serialcontrol/dmidecode.txt) | ssmtp [email protected]') 
import smtplib 
sender = '[email protected]' 
receivers = '[email protected]' 
message = "\r\n".join([ 
    "From: [email protected]", 
    "To: [email protected]", 
    "Subject: SerialControl", 
    "", 
    dmi 
    ]) 
username = '[email protected]' 
password = '' 
server = smtplib.SMTP('smtp.gmail.com:587') 
server.ehlo() 
server.starttls() 
server.login(username,password) 
server.sendmail(sender, receivers, message) 
server.quit() 
#subprocess.call(["bash", script2]) 
#this sub is supposed to /n with actual /n's 
#subprocess.run(["sed -i 's/\\n/\n/g' /var/log/serialcontrol/dmidecode.txt"], shell=True) 
#except FileNotFoundError: 
#file = open('/var/tmp/serialcontrol.bash', 'w') 
#file.write("#!/bin/bash/\nif [ ! -d /var/log/serialcontrol/]\nthen\n\tmkdir /var/log/serialcontrol/\nfi"); 
#file.close() 
#st = os.stat("/var/tmp/serialcontrol.bash") 
#os.chmod("/var/tmp/serialcontrol.bash", st.st_mode | stat.S_IEXEC) 
#subprocess.call("/var/tmp/serialcontrol.bash") 

我知道這是真的,真的,真的,真的,真的,壞,但在密碼段我必須輸入我的密碼,然後我cron利用此腳本和密碼獲取以明文形式存儲,如何修復?

+0

鑰匙圈是一個可行的選擇嗎? – Marat

+0

服務器代碼是否超出了您的控制範圍?你不能嘗試發送服務器可以進行身份​​驗證的加密密碼嗎? –

+0

**另請參閱**:http://stackoverflow.com/questions/157938 – dreftymac

回答

0

當你用bash標記問題時,我將假設你使用的是Linux或類Unix系統。

這就是我所說的機器密碼。如果您希望通過cron啓動的腳本使用它,則可以在磁盤上的某處訪問必須的

正確的(或不那麼糟糕)的辦法是:

  • 使用專用的郵件帳戶關於那種用法 - 您的個人電子郵件帳戶(但archmachine9是,你已經做了一個伏筆。 ..) - 最好應該是不可能用這種帳戶登錄(a single *`在例如密碼字段)
  • 在機器上使用系統帳戶 - 既不是根,也不您的主要本地帳戶
  • 店裏的T他的密碼位於該系統帳戶主目錄下的文件中。密碼應被讀/只寫所有者
  • 提取環境
  • 的用戶名,密碼和最終服務器,如果你不能找到其中的一個,從文件中讀取它們
  • 或者嵌入的腳本在發射從文件中讀取憑證,並在啓動真實腳本(我最喜歡的選項)之前將它們放入環境中。

即使郵件帳戶是通過不同腳本共享的,您也將擁有一箇中心點要更改密碼,並且存儲在只能由系統帳戶訪問的文件中,只有機器管理員(root)sh應該可以讀取它。並且您不必知道它是如何開發,維護和測試腳本的,您只需將測試郵件帳戶放入您的開發環境

TL/DR:密碼必須作爲明文存儲在機器上腳本可以通過cron啓動,但它不應該在腳本本身

相關問題