2010-09-13 84 views
0

下面的脚本以root身份登录并且从 命令行运行很好,但在第一次启动时使用/etc/rc.local在Ubuntu 10.04中运行时,它会失败大约25%的时间 - 系统根目录,mysql root和 某些mysql用户密码设置正确,但是一个会失败,并且 控制台日志报告标准mysql登录错误:“ERROR 1045(28000): 访问被用户'root'@'localhost'拒绝(使用密码: YES)“为什么在第一次启动时从rc.local运行Python脚本不可靠?

是否有一些关于从初始化作业运行python脚本,我 应考虑,如环境变量?

#!/usr/bin/env python 
# Randomizes and outputs to files the system root and mysql user passwords 
files = ['/home/ubuntu/passwords','/opt/data1/alfresco/extensions/ 
extension/alfresco-global.properties','/opt/data/etc/mysql/ 
debian.cnf','/home/ubuntu/duncil'] 
userpasswords = {'root':'ROOTPASSWORD'} 
mysqlpasswords = 
{'root':'MYSQLPASSWORD','alfresco':'alfrescoPASSWORD','debian-sys- 
maint':'debian-sys-maintPASSWORD'} 
otherpasswords = ['OTHERPASSWORD'] 
log = '/var/log/firstrun' 
import random, string 
import crypt 
import re 
from subprocess import PIPE, Popen 
def getsalt(chars = string.letters + string.digits): 
    # generate a random 2-character 'salt' 
    return random.choice(chars) + random.choice(chars) 
def getpwd(chars = string.letters + string.digits, len = 12): 
    retval = ""; 
    for i in range(0, len): 
    # generate 12 character alphanumeric password 
     retval += random.choice(chars) 
    return retval 
def replace_pass(filename): 
    handle = open(filename, 'r') 
    hbuf = handle.read() 
    handle.close() 
    for placeholder, password in pdict.iteritems(): 
     hbuf = re.sub(placeholder, password, hbuf) 
    try: 
     # Output file 
     handle = open(filename, 'w') 
     handle.write(hbuf) 
     handle.close() 
    except: 
     pass 
     #logh.write('failed to update ' + filename + "\n") 
     #logh.write('maybe you don\'t have permision to write to it?\n') 
logh = open(log, "a") 
logh.write("Starting...\n") 
# Generate passwords 
pdict = {} 
for user, placeholder in userpasswords.iteritems(): 
    syspass = getpwd() 
    Popen(['usermod', '--password', crypt.crypt(syspass, getsalt()), user]) 
    logh.write(placeholder + ": User " + user + " --> " + syspass + "\n") 
    pdict[placeholder] = syspass 
# Whats the MySQL Root password placeholder? 
mplace = mysqlpasswords['root'] 
for user, placeholder in mysqlpasswords.iteritems(): 
    mpass = getpwd() 
    if (("root" in mysqlpasswords) and (mysqlpasswords['root'] in pdict)): 
     mrootpass = pdict[mysqlpasswords['root']] 
    else: 
     mrootpass = "" 
    Popen(['mysql', '-uroot', "--password=" + mrootpass, "-e", "UPDATE user SET Password = PASSWORD('" + mpass + "') WHERE User = '" + user + "';FLUSH PRIVILEGES;","mysql"]) 
    logh.write(placeholder + ": MySQL " + user + " --> " + mpass + "\n") 
    pdict[placeholder] = mpass 
for placeholder in otherpasswords: 
    opass = getpwd() 
    logh.write(placeholder + ": " + opass + "\n") 
    pdict[placeholder] = opass 
# Update passwords 
for file in files: 
    logh.write("Replacing placeholders in " + file + "\n") 
    replace_pass(file) 
logh.write("Finished\n") 
logh.close 

回答

2

Popen是不是异步执行?

似乎在启动过程中,负载很高,您在设置根密码和使用它设置下一个密码(下一个命令)之间会出现竞争状态。

尝试

p = Popen(['mysql', '-uroot', "--password=" + mrootpass, "-e", "UPDATE user SET Password = PASSWORD('" + mpass + "') WHERE User = '" + user + "';FLUSH PRIVILEGES;","mysql"]) 
p.wait() 

,看看有没有做它。

+0

感谢Emilio-你的建议没有奏效,但让我寻找其他方法给mysql创建空间创造空间,并在密码设置部分完成后添加:“import time”和“sleep(3)”。 – 2010-09-18 20:37:09

+0

@CloudController:请将您的解决方案作为答案。所以你可以接受。 – Kritzefitz 2014-08-17 22:42:16

相关问题