Estou tendo uma saída semelhante ao arquivo (nome do arquivo qualquer.com) abaixo...
[...]~ # tmsh list sys file ssl-cert whatever.com_2024
sys file ssl-cert whatever.com_2024 {
certificate-key-size 2048
checksum SHA1:2520:ab40df7776dbbccb62345560511f2205d
create-time 2024-08-12:19:34:07
created-by x.y
expiration-date 1754956799
expiration-string "Aug 11 23:59:59 2025 GMT"
fingerprint SHA256/D8:57:8E:8E:4A:1A:C3:3C:1B:6F:32:59:A7:36:66:92:6C
issuer "CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US"
key-type rsa-public
last-update-time 2024-08-12:19:34:07
mode 33188
revision 1
serial-number 0a:1d:ca:c7:09:7b:49:59:b2
size 2520
source-path /var/run/key_mgmt/RvGubB/ssl.crt/whatever.com_2024
subject "CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"
subject-alternative-name "DNS:whatever.com"
updated-by x.y
version 3
Estou tentando gerar uma saída de comando com base nas informações acima na linha 17 (começando com o assunto)
cat whatever.com | awk 'BEGIN {F=" "; FS = "\n"; RS = ""; OFS = "\n"} { print "openssl req -new -nodes -sha256 -newkey rsa:2048 -out "substr($1,RSTART+19,length($1)-25)"_2025.csr -keyout "substr($1,RSTART+19,length($1)-25)"_2025.key -subj "/"substr($17,RSTART+14,length($17)-14)"\""}'
A saída está parecendo boa
openssl req -new -nodes -sha256 -newkey rsa:2048 -out whatever.com_2025.csr -keyout whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"
No entanto, ele está usando uma substring da linha 1 que pode ser diferente da linha 17, então eu gostaria de obter o nome do arquivo em vez de usar substr($1,RSTART+19,length($1)-24) para ser gerado com base na string do formulário $17 entre "CN=" e ",O=".
Também seria possível modificar a saída para ficar assim se a linha 18 contivesse a string "DNS"...
openssl req -new -nodes -sha256 -newkey rsa:2048 -out whatever.com_2025.csr -keyout whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA" -addext "subjectAltName = DNS:whatever.com"
Obrigado por todas as respostas rápidas. Os nomes de arquivo devem ser gerados dinamicamente a partir do arquivo. O exemplo incluso é apenas uma pequena seção da saída maior. A configuração BEGIN está lá para criar essas seções que, nesse ponto, podem ser manipuladas individualmente por linha.
Lidando com balanceadores de carga F5. Eles são baseados em Linux, mas não são exatamente construídos como servidores normais, o que torna alguns dos scripts desafiadores.
Eu encontrei uma solução usando split() mas agora tenho um problema diferente. Quando eu executo o comando sozinho, parece funcionar
~ # cat whatever.com | awk 'BEGIN {F=" "; FS = "\n"; RS = ""; OFS = "\n"} {split($17,a,/,/); print substr(a[1],RSTART+17)}'
whatever.com
Entretanto, quando adicionado ao script original, ele acrescenta o número "5" na frente.
~ # cat whatever.com | awk 'BEGIN {F=" "; FS = "\n"; RS = ""; OFS = "\n"} { print "openssl req -new -nodes -sha256 -newkey rsa:2048 -out "split($17,a,/,/); print substr(a[1],RSTART+17)"_2025.csr -keyout "split($17,a,/,/); print substr(a[1],RSTART+17)"_2025.key -subj \"/"substr($17,RSTART+14,length($17)-14)"\""}'
openssl req -new -nodes -sha256 -newkey rsa:2048 -out 5
whatever.com_2025.csr -keyout 5
whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"
Eu provavelmente processaria as linhas uma por uma como de costume, e olharia para o primeiro campo separado por espaços para identificar as linhas de assunto e alt-name. Então, você pode dividir a linha em outro array usando a pontuação e escolher a parte certa de lá. (Isso pressupõe que não haja nada antes da
CN
parte -- não consigo lembrar se isso seria permitido.) Se você quiser realmente verificar o texto ao redor (as partesCN=
e ),então eu mudaria para Perle veria a resposta do meuh .DNS:
Use GNU awk's
match(string, regexp, arrayresult)
com a()
no regexp para capturar a parte desejada. Por exemploPara responder à pergunta do OP sobre por que seu código está usando dados de
line 1
... verifique o conteúdo deRSTART
. Você deve encontrarRSTART=0
porque nenhuma função (por exemplo,match()
) foi executada para realmente preencherRSTART
.Em vez de tentar processar a saída inteira como um parágrafo, sugiro processá-la como linhas individuais.
Uma
awk
abordagem diferente:Isso gera:
Isso pressupõe que você pode processar linha por linha e não fazer todas as contorções de campo e registro que você fez. Também pressupõe que
subject-alternative-name
está sempre presente:Com a
DNS
palavra-chave:Sem a
DNS
palavra-chave:Isso usa subexpressões de expressão regular para capturar a parte relevante. A
match
função faz uma correspondência de expressão regular e atribui as subexpressões (aquelas entre parênteses) a um array (aqui,arr
para osubject
campo ealtarr
para osubject-alternative-name
campo). Usamos duas subexpressões (sobrepostas) parasubject
: uma para o valor do campo e uma para o nome do domínio dentro do valor do campo.A primeira
/.../ {
linha corresponde ao campo assunto (note os espaços para que não corresponda ao outro campo que começa com 'assunto'). O primeiro parêntesis domatch
extrai o conteúdo do campo, e o segundo o nome do domínio.O propósito do
[^,]+
é combinar tudo até e excluindo o (próximo) delimitador de vírgula de uma forma não gananciosa. Se você usasse.+,
, ele capturaria tudo atéC=CA
.Na conclusão desta correspondência,
arr
contém o regex inteiro, a string de campo e a string de domínio.Ainda não imprimimos porque ainda não sabemos o que incluir. (Você também pode imprimir uma linha parcial, se quiser, e adicionar um
END { printf "\n"}
.)A correspondência do
/ +subject-alternative-name
analisa o segundo campo para aDNS
palavra-chave, capturando todo o valor do campo e, se corresponder, imprime o comando estendido apropriado; caso contrário, imprime o comando regular.Bom despertar!