本文介绍了gpg --passphrase-fd不适用于python 3子进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下脚本encrypt_me.py
(从另一篇文章中修改),然后使用gpg对其进行加密,并以铠装形式打印出密文.
The following script encrypt_me.py
(modified from another post) encrypts itself with gpg and prints out the ciphertext in armored form.
但是它仅适用于python2.7而不适用于python3吗?您是否知道在python3上运行时出了什么问题?
However it only works on python2.7 but not python3? Do you have any idea what's wrong when it's running on python3?
import subprocess
import shlex
import os
import sys
in_fd, out_fd = os.pipe()
passphrase = 'passsssphrase'
os.write(out_fd, passphrase.encode('utf-8'))
os.close(out_fd)
cmd = 'gpg --passphrase-fd {fd} -c --armor'.format(fd=in_fd)
with open(__file__,'r') as stdin_fh:
proc=subprocess.Popen(shlex.split(cmd),
stdin=stdin_fh,
stdout=sys.stdout)
proc.communicate()
os.close(in_fd)
使用python2.7:
With python2.7:
$ python encrypt_me.py
Reading passphrase from file descriptor 3
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.12 (GNU/Linux)
jA0EAwMCXrbnOPX+CipgycBD3ErAKmba6UvtA35mjomOlbiOHX2M0bULbV+v8q8U
AJ+sTQcFZK+NoauMgUFm39/ZcNoI7W5u78x8dj5B1N6jLk11C7MgmkNmT5CiliQO
kl/el0fDAMnksrqGFpUC6+4ECOTJPpj0Z/Cn/3/62kLHkkbAxs+wyS8lGxXEIEKH
XFl3OLRlVmCbvtwzrNMFLiD/St6NHu3Wh9S2xt8fe0PAEAZoYlWWx8lnEQEKewq9
EzLlkLldZaDNja3ePzWZ8Z6AeDtowBa8kj+8x/HjxfKLGheBBNQuaeBdcSHgE/OW
esS/tEesQUlfUgqrZc2uBalLTV9xwyIpcV4cg8BubPWFCcBrDQ==
=iziW
-----END PGP MESSAGE-----
使用python3:
$ python3 encrypt_me.py
Reading passphrase from file descriptor 3 ...
gpg: error creating passphrase: invalid passphrase
gpg: symmetric encryption of `[stdin]' failed: invalid passphrase
推荐答案
close_fds=True
在Python 3上的POSIX系统上.使用pass_fds
传递输入管道文件描述符:
close_fds=True
on POSIX systems on Python 3. Use pass_fds
to pass input pipe file descriptor:
#!/usr/bin/env python3
import os
import shlex
import sys
from subprocess import Popen
passphrase = 'passsssphrase'
file_to_encrypt = sys.argv[1] if len(sys.argv) > 1 else 'encrypt_me.py'
in_fd, out_fd = os.pipe()
cmd = 'gpg --passphrase-fd {fd} -c --armor -o -'.format(fd=in_fd)
with Popen(shlex.split(cmd) + [file_to_encrypt], pass_fds=[in_fd]):
os.close(in_fd) # unused in the parent
with open(out_fd, 'w', encoding='utf-8') as out_file:
out_file.write(passphrase)
您还可以通过stdin传递密码:
You could also pass the passphrase via stdin:
#!/usr/bin/env python3
import sys
from subprocess import PIPE, Popen
passphrase = 'passsssphrase'
file_to_encrypt = sys.argv[1] if len(sys.argv) > 1 else __file__
cmd = 'gpg --passphrase-fd 0 -c --armor -o -'.split()
with Popen(cmd + [file_to_encrypt], stdin=PIPE) as process:
process.stdin.write(passphrase.encode('utf-8'))
这篇关于gpg --passphrase-fd不适用于python 3子进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!