Python 2.7:将值传递给getpass

时间:2016-02-24 20:46:59

标签: python python-2.7

在Windows(特别是Win Server 2008 R2)上,我需要重复执行我们的产品重复附带的现有python脚本。偶尔会调用此脚本的意图,并且输入应该是手动的。但是,我最终不得不多次调用此脚本。

所以,我正在尝试使用额外的python脚本自动调用此脚本(以及其他相关脚本)。我挂断的地方是我打电话的“开箱即用”脚本使用getpass.getpass()来输入密码。

在我的自动化脚本中,我尝试使用子进程pipe.communicate将密码值传递给基本脚本。但我无法让它发挥作用。这是我的自动化脚本中的相关代码:

p = Popen(coreScriptCmd, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
x = p.stdout.readline().rstrip()
print x     #for debugging
x = p.communicate(args.pwd1+"\n"+args.pwd2)[0].rstrip()
print x     #for debugging

正如我所说,当被调用的子进程使用getpass.getpass()来询问它的输入时,这不起作用。这是核心代码中的if语句,我遇到了麻烦:

elif cmd == 'update-user':
if 'password1' not in globals():
    password1 = getpass.getpass(mgmtusername + " password:")
if 'dbpassword' not in globals():
    dbpassword = getpass.getpass(dbusername + " password:")
checkAccessDb(hostname, database, mgmtusername, password1, dbusername, dbpassword)

有没有人对如何以编程方式将值传递给下标中的getpass()有任何建议?

2 个答案:

答案 0 :(得分:1)

好吧,所以我不确定原始剧本的样子。但是,如果仍然需要从命令行使用它,我建议这样做。

我会修改原始脚本以接受参数。例如,假设getpass位于像这样的函数中......

def run_script():
    paswd = getpass.getpass("Please enter the password:")

尝试将其修改为以下内容:

def run_script(cmdlin = True):
    if cmdlin:
        paswd = getpass.getpass("Please enter the password:")
    else:
        # get password using another method

另一种方法可以是你选择的任何方法,将其作为参数传递,从文件中获取等等。

一旦这样设置,只需将其调用为“cmdlin”参数传递为false。

编辑:使用子流程模块,您应该能够使用communicate通过

发送密码

此外,我找到了pexpect库,可能对您的情况有所帮助

答案 1 :(得分:0)

由于您的代码,这可能是可能的  x = p.stdout.readline().rstrip()。 stdout.readline()是一个阻塞调用,只要没有输出就会阻塞它。尝试评论该行并查看它是否有效。还要分享" coreScriptCmd"的内容。将有助于更好地找到根本原因。