gpg –passphrase-fd не работает с подпроцессом python 3
Следующий скрипт encrypt_me.py
( измененный из другого сообщения ) шифрует себя с помощью gpg и выводит зашифрованный текст в бронированной форме.
Однако он работает только на python2.7, но не на python3? Вы знаете, что не так, когда он работает на 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:
$ 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
- Запуск сценариев powershell из Python без повторной передачи модулей при каждом запуске
- Python считывает из подпроцесса stdout и stderr отдельно при сохранении порядка
- Как получить информацию «в реальном времени» из подпроцесса. Открыть в python (2.5)
- Прослушивание сбоя подпроцесса в python
- Использование mmap с popen
close_fds=True
в системах POSIX на Python 3. Используйте pass_fds
для передачи дескриптора файла входного файла:
#!/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:
#!/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'))
- Как передать команды в приложение из python
- Запустить встроенные команды BASH в Python?
- Компиляция и вывод make make-файла в Python
- Почему Python зависает при запуске mpirun в рамках подпроцесса?
- Использование python для выдачи команд
- Совместимость с несколькими линиями Python
- Python общается с omxplayer
- вызов php-функции из python
- Python, mpg123 и подпроцесс неправильно использовать stdin.write или общаться