Python 避免将密码存储为明文?

Python 避免将密码存储为明文?,python,bash,Python,Bash,这是我的代码: 我知道这真的,真的,真的,真的,真的,真的,真的,很糟糕,但在密码部分,我必须先键入我的密码,然后才能cron此脚本,密码将以明文形式存储,如何修复?当您用bash标记问题时,我假设您使用的是Linux或Unix类系统 这就是我所说的机器密码。如果您想从通过cron启动的脚本中使用它,它必须可以在磁盘上的某个地方访问 正确(或不那么糟糕)的方法是: 使用专用邮件帐户进行该用途-不是你的个人邮件帐户(但是archmachine9暗示你已经这样做了…)-理想情况下,不可能使用此帐户

这是我的代码:


我知道这真的,真的,真的,真的,真的,真的,真的,很糟糕,但在密码部分,我必须先键入我的密码,然后才能cron此脚本,密码将以明文形式存储,如何修复?

当您用bash标记问题时,我假设您使用的是Linux或Unix类系统

这就是我所说的机器密码。如果您想从通过cron启动的脚本中使用它,它必须可以在磁盘上的某个地方访问

正确(或不那么糟糕)的方法是:

  • 使用专用邮件帐户进行该用途-不是你的个人邮件帐户(但是
    archmachine9
    暗示你已经这样做了…)-理想情况下,不可能使用此帐户登录
    (例如,密码字段中的单个
    *`
  • 在计算机上使用系统帐户-root帐户和本地主帐户都不可用
  • 将密码存储在该系统帐户主目录下的文件中。对于所有者,密码应为只读/写
  • 从环境中提取用户名、密码和服务器
  • 如果找不到其中一个,请从文件中读取它们
  • 或者,将脚本嵌入从文件读取凭据的启动器中,并在启动真正的脚本之前将其放入环境中(我最喜欢的选项)
这样,即使邮件帐户通过不同的脚本共享,您也将有一个中心点来更改密码,并且由于它存储在一个只能由系统帐户访问的文件中,因此只有机器管理员(root)才能读取它。开发、维护和测试脚本不需要了解它,只需在开发环境中设置一个测试邮件帐户即可


TL/DR:密码必须以明文形式存储在机器上,才能通过cron启动脚本,但它不应存在于脚本本身中,因为您用bash标记了问题。我假设您使用的是Linux或类似Unix的系统

这就是我所说的机器密码。如果您想从通过cron启动的脚本中使用它,它必须可以在磁盘上的某个地方访问

正确(或不那么糟糕)的方法是:

  • 使用专用邮件帐户进行该用途-不是你的个人邮件帐户(但是
    archmachine9
    暗示你已经这样做了…)-理想情况下,不可能使用此帐户登录
    (例如,密码字段中的单个
    *`
  • 在计算机上使用系统帐户-root帐户和本地主帐户都不可用
  • 将密码存储在该系统帐户主目录下的文件中。对于所有者,密码应为只读/写
  • 从环境中提取用户名、密码和服务器
  • 如果找不到其中一个,请从文件中读取它们
  • 或者,将脚本嵌入从文件读取凭据的启动器中,并在启动真正的脚本之前将其放入环境中(我最喜欢的选项)
这样,即使邮件帐户通过不同的脚本共享,您也将有一个中心点来更改密码,并且由于它存储在一个只能由系统帐户访问的文件中,因此只有机器管理员(root)才能读取它。开发、维护和测试脚本不需要了解它,只需在开发环境中设置一个测试邮件帐户即可


TL/DR:密码必须以明文形式存储在机器上,才能通过cron启动脚本,但它不应在脚本本身中

密钥环是否可行?服务器代码是否超出您的控制?难道你不能尝试发送一个加密的密码,服务器可以对其进行身份验证吗?另请参阅:keyring是一个可行的选项吗?服务器代码是否超出了你的控制范围?您不能尝试发送一个加密密码,服务器可以对其进行身份验证吗?另请参阅:
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="archmachine9@gmail.com"\nsubject="...Subject..."\necho -e "to: $recipients\nsubject: $subject\n"| (cat - &&uuencode /var/log/serialcontrol/dmidecode.txt) | ssmtp archmachine9@gmail.com')
import smtplib
sender = 'archmachine9@gmail.com'
receivers = 'archmachine9@gmail.com'
message = "\r\n".join([
    "From: archmachine9@gmail.com",
    "To: archmachine9@gmail.com",
    "Subject: SerialControl",
    "",
    dmi
    ])
username = 'archmachine9@gmail.com'
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")