繁体   English   中英

从python运行需要用户输入的linux命令

[英]Run linux command from python which needs user input

我有以下python代码:

import subprocess
p=subprocess.Popen(["openssl","genrsa","-aes256","-out","ise.key.pem","2048"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
inputdata="123456"
p.communicate(input=inputata)
p.communicate(input=inputata)

上面代码的输出是:

    pan@pan:~/python-scripts$ Generating RSA private key, 2048 bit long modulus
........................+++
...................................+++
e is 65537 (0x10001)
Enter pass phrase for ise.key.pem:
User interface error
140617148802712:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:pem_lib.c:379:

我希望输入应该由python提供,不应有任何用户交互:

我知道证书可以由python pyOpenSSL库生成,但是我想使用普通的linux命令

我的python版本是

Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "enter code here`license" for more information.

我看到了以下链接,但没有帮助

Python执行命令行,发送输入并读取输出

如果您在Shell中运行命令,则其运行如下:

pan@pan:~/python-scripts$ openssl genrsa -aes256 -out ise.key.pem 2048
Generating RSA private key, 2048 bit long modulus
..............................................................+++
..+++
e is 65537 (0x10001)
Enter pass phrase for ise.key.pem:
Verifying - Enter pass phrase for ise.key.pem:

Jean-FrançoisFabre在他的评论中对此是正确的:

但是真正的问题是,输入密码输入例程的管道输入并不总是有效。

但与此无关:

您必须在较低级别上生成键盘事件。

虽然通常是正确的,但在手头的情况下,命令openssl genrsa …提供选项-passout stdin 从标准输入读取密码

openssl genrsa -aes256 -out ise.key.pem -passout stdin 2048

因此,此Python脚本有效:

import subprocess
p=subprocess.Popen(["openssl","genrsa","-aes256","-out","ise.key.pem",
                    "-passout","stdin","2048"], stdin=subprocess.PIPE,
                                                stdout=subprocess.PIPE)
inputdata="123456"
p.communicate(input=inputdata)

请注意,一次调用timeout = None不能再调用communicate() ,因为它等待进程终止 但这也不是必须的,因为使用-passout stdin命令不会要求验证,因此无需再次输入密码。

我通常不喜欢执行此类任务的子流程...我宁愿使用pexpect来模仿人类行为(键入数据等)。

这是完成工作的一个粗糙的例子

import pexpect

def main():
        inputdata="123456"
        c = pexpect.spawn("/usr/bin/openssl", ["genrsa","-aes256","-out","ise.key.pem","2048"])
        c.expect("Enter.*:")
        c.sendline(inputdata)
        c.expect("Verifying.*:")
        c.sendline(inputdata)
        c.expect(pexpect.EOF)
        c.close()
        c.kill(0)
        print "Done"

if __name__=='__main__':
        main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM