Python OS.System: синтаксическая ошибка возле неожиданного токена `('- вложенные скобки

Вот сценарий perl, который считывает каждую строку, разбивает их на поля (в массиве @line) и добавляет их в массив @out. Когда в @out есть 6 полей, он распечатывает их.

Примечание: это очень простой CSV без кавычек строк и т. Д. - кавычки не нужны, если поля не содержат разделитель полей (то есть запятая, , ). Для более продвинутого CSV его необходимо изменить для использования модулей Perl Text :: CSV или DBD :: CSV .

Обратите внимание, что здесь предполагается, что Фамилия, Имя и Отчество состоят только из одного слова.

#! /usr/bin/perl

use strict;

my @out = ();
while(<>) {
    my @line = split /,?\s+/;
    my $numfields=@line - 1;
    if ($line[0] =~ m/^\d+$/) {
        push @out, $line[1];
    } elsif ($numfields > 1) {
        push @out, (@line[0..1], join(" ",@line[2..$numfields]));
    } else {
        push @out, @line
    }

    if ( @out == 6 ) { print join(",",@out),"\n" ; @out=() } ;
}

Пример вывода (используя ваш пример ввода, сохраненный как input.txt :

$ ./convert-to-csv.pl input.txt 
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER
0
11.08.2018, 22:12
2 ответа

<(…)— это замена процесса, которая существует в 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 -

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

2
28.01.2020, 02:42

Спасибо за ответы. Я немного подумал и решил поискать нативный способ для 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)
0
28.01.2020, 02:42

Теги

Похожие вопросы