2016-12-29 98 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启动,但它不应该在脚本本身