python os.system: синтаксическая ошибка рядом с неожиданным токеном `(‘- вложенные скобки

Я читал, что я могу поставить bash скобки в кавычки при отправке команды из Python. В этом случае я пытаюсь создать ключ и csr для openssl, используя команду, которая работает в оболочке, но не при запуске из python. Я пробовал несколько комбинаций, но продолжаю сталкиваться с дополнительными проблемами.

Следующая команда python завершается неудачно:

import os os.system('openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/emailAddress=administrators@my.com" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth"))') 

Основная команда openssl успешно выполняется:

 openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/emailAddress=administrators@my.com" -reqexts OPTS -config <(cat /etc/pki/tls/openssl.cnf <(printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth")) 

Это должно быть что-то простое, но ответ ускользает от меня.

2 Solutions collect form web for “python os.system: синтаксическая ошибка рядом с неожиданным токеном `(‘- вложенные скобки”

< (…) - это подстановка процесса, которая существует в bash (и ksh и zsh), но не в простой sh. system функция вызывает sh, а не bash.

Вы можете использовать канал вместо подстановки процесса на openssl и упростить подстановку вложенного процесса в простую последовательность команд.

 { cat /etc/pki/tls/openssl.cnf; printf "[OPTS]\ basicConstraints = CA:FALSE subjectAltName = DNS:mynode,DNS:myf5 keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth"; } | openssl req -nodes -newkey rsa:2048 -sha256 -keyout mynode.key -out mynode.csr -subj "/C=US/ST=Florida/L=St Petersburg/O=MyCompany/OU=MyOU/CN=mynode/emailAddress=administrators@my.com" -reqexts OPTS -config - 

(разрывы строк необязательны)

Спасибо за ответы. Я немного подумал и решил поискать способ сделать это на Python. На веб-сайте, посвященном криптографии Python, и другим пользователям было достаточно информации, чтобы я смог собрать код Python для генерации CSR.

 requires pyOpenSSL from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend()) with open('mycert.key', 'wb') as f: f.write(key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption())) from OpenSSL import crypto # load private key ftype = crypto.FILETYPE_PEM with open('mycert.key', 'rb') as f: key = f.read() key = crypto.load_privatekey(ftype, key) req = crypto.X509Req() alt_name = [ b"DNS:mynode", b"DNS:myF5", b"email:administratore@email.com" ] key_usage = [ b"Digital Signature", b"Key Encipherment" ] key_usage = [ b"digitalSignature", b"keyEncipherment" ] ext_key_usage = [ b"serverAuth", b"clientAuth" ] # country (countryName, C) # state or province name (stateOrProvinceName, ST) # locality (locality, L) # organization (organizationName, O) # organizational unit (organizationalUnitName, OU) # common name (commonName, CN) req.get_subject().C = "US" req.get_subject().ST = "Florida" req.get_subject().L = "St Petersburg" req.get_subject().O = "myCompany" req.get_subject().OU = "MyOU" req.get_subject().CN = "mynode" req.add_extensions([ crypto.X509Extension( b"basicConstraints", False, b"CA:FALSE"), crypto.X509Extension( b"keyUsage", False, b",".join(key_usage)), crypto.X509Extension( b"subjectAltName", False, b",".join(alt_name)) ]) req.set_pubkey(key) req.sign(key, "sha256") csr = crypto.dump_certificate_request(ftype, req) with open("mycert.csr", 'wb') as f: f.write(csr) 
  • bash: невозможно установить переменную в сплошную строку
  • Найти файлы, созданные за определенное время после или до создания определенного файла
  • Анализ паролей Apache для исключения диапазонов IP-адресов
  • Сценарий оболочки не запущен в crontab
  • Передача аргументов в оболочку su-provided
  • Настройка пользовательской скорости передачи на консоли
  • определять оболочку в скрипте во время выполнения
  • В чем разница между «du -sh *» и «du -sh ./*»?
  • Как я могу полностью удалить элемент из массива?
  • Gzip большое количество символических файлов
  • Как использовать для вывода dpkg -L с номерами строк?
  • Interesting Posts

    Как настроить пороги зарядки аккумулятора ноутбука?

    Сравнить деревья каталогов относительно имени файла (и размера и даты)

    Запустите getty на последовательном порту при запуске на RHEL

    Как прокси-приложение через обратный SSH-туннель (несколько переходов)

    Как подключиться к bash как другому пользователю

    Почему различное поведение захвата EXIT vs INT

    Как найти подстроку в командной строке?

    Сценарии Bash: использование forinloop с массивом

    Список mimetypes, который по умолчанию соответствует заданному файлу .desktop

    Где должно быть расположено веб-приложение в Linux?

    Внести изменения в плагин регулятора CPU

    Существуют ли какие-либо недостатки или опасности для загрузки всех правил брандмауэра до инициализации интерфейса обратной связи?

    zsh с аргументами

    FreeBSD: добавление псевдонима ip к интерфейсу прерывает сеть на первичном ip

    Журналы ошибок потока

    Linux и Unix - лучшая ОС в мире.