[英]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.
我看到了以下链接,但没有帮助
如果您在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.