[gelöst] debian bash script multiple grep in all *.crt.pem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

[gelöst] debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 30.06.2020 16:33:02

Hallo zusammen,

ich versuche gerade mittels bash script Inhalte vieler *.pem Dateien in eine Datei zusammenzufassen.
Ich komme jedoch nicht ganz klar damit.

Ich versuche aus den Zertifikaten den Namen, Befor und After herauszuziehen und in eine Zeile zu schreiben.
Ich habe schon folgendes versucht...

Code: Alles auswählen

cat /path/*.crt.pem | grep -e Subject: -e Befor -e After > /tmp/test.txt
Soweit so gut. Hiermit bekomme ich zwar die Informationen in eine Datei, aber nicht wirklich so wie ich das möchte.

Code: Alles auswählen

cat /path/file.crt.pem | grep -e After | awk '{usage=($7 "" $6)} END {print usage}'
Damit bekomme ich die Information After wie gewünscht ausgegeben. Jedoch nicht die zwei weiteren Informationen. Und auch nicht von allen Dateien

Ich weiß jedoch nicht wie ich die beiden Abfragen verbinden kann?
Am liebsten wäre mir eine Ausgabe wie folgt:
<CN name>, <Befor>, <After>

Ich könnte höchstens alles in Variablen schreiben, aber wie arbeite ich anschließend alle vorhandenen Dateien ab?

Code: Alles auswählen

After=$(cat /path/file.crt.pem | grep -e After | awk '{usage=($7 "" $6)} END {print usage}')
Befor=$(cat /path/file.crt.pem | grep -e Befor | awk '{usage=($7 "" $6)} END {print usage}')
usw..
echo "$After $Befor" > /tmp/test.txt
Zuletzt geändert von joe2017 am 02.07.2020 09:26:35, insgesamt 2-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 1678
Registriert: 04.06.2015 01:17:27

Re: debian bash script multiple grep mit suche in suche

Beitrag von heisenberg » 30.06.2020 16:57:45

Deine PEM-Dateien sind wohl schon vorverarbeitet, weil in einer normalen PEM kein Klartext drinsteht.

Das hier geht auf die Rohzertifikate:

certinfo

Code: Alles auswählen

#!/usr/bin/perl
#
use Crypt::OpenSSL::X509;
 
my $cert = Crypt::OpenSSL::X509->new_from_file($ARGV[0]);

print   $ARGV[0]
        .";".   (($cert->subject()=~/CN=(.*)/)[0])
        .";".   $cert->notBefore()
        .";".   $cert->notAfter(). "\n";
Installation/Aufruf:

Code: Alles auswählen

apt-get install libcrypt-openssl-x509-perl
./certinfo www.kernel.org.pem 

# Ausgabe:
www.kernel.org.pem;kernel.org;Sep 27 00:00:00 2019 GMT;Sep 27 23:59:59 2020 GMT



Zuletzt geändert von heisenberg am 01.07.2020 13:20:58, insgesamt 2-mal geändert.
Wenn ich ein Problem gelöst habe, bekomme ich zur Belohnung ein neues, größeres Problem.

Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 30.06.2020 17:04:26

Ich mach die Abfrage direkt am CA Server.
In meinem Certs Verzeichnis kann ich mit cat direkt in die pem Files schauen.

Benutzeravatar
heisenberg
Beiträge: 1678
Registriert: 04.06.2015 01:17:27

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von heisenberg » 30.06.2020 17:30:27

In meinem Certs Verzeichnis kann ich mit cat direkt in die pem Files schauen.
Bei mir sieht ein PEM-File idR so aus(als bis auf die Anfangs- und Endemarker kein lesbarer Text):

Code: Alles auswählen

-----BEGIN CERTIFICATE-----
MIIGszCCBZugAwIBAgIQRF7gFMlJ3UO909a39zv1mzANBgkqhkiG9w0BAQsFADBf
...
gtFRKmvMIUIESh60F91+2AeUfCa/tBfOM+PDpsNNaZ+iHHaicAIw
-----END CERTIFICATE-----
Wenn ich ein Problem gelöst habe, bekomme ich zur Belohnung ein neues, größeres Problem.

eggy
Beiträge: 2198
Registriert: 10.05.2008 11:23:50

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von eggy » 30.06.2020 17:35:02

Poste mal was in Deinen Dateien steht, entsprechend anonymisiert, aber so dass Struktur und Keywords erhalten bleiben.

Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 30.06.2020 17:38:51

ich habe jetzt eine Möglichkeit gefunden.

Code: Alles auswählen

Files=/path/*.crt.pem
for f in $Files
do
	After=$(cat $f | grep -e After | awk '{usage=($7 "" $6)} END {print usage}')
	Befor=$(cat $f | grep -e Befor | awk '{usage=($6 "" $5)} END {print usage}')
	usw..
	echo "$After $Befor" > /tmp/test.txt
done
Jedoch benötige ich noch eine kurze Info. Wenn die Länge einer Zeile abweichend ist, kann ich mit awk nicht arbeiten.
Ich müsste also die ausgegebene Zeile durchsuchen und alles was nach CN= bis zum nächsten Leerzeichen kommt in die Veriable schreiben. Oder geht das auch mit awk?

Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 30.06.2020 17:40:19

heisenberg hat geschrieben: ↑ zum Beitrag ↑
30.06.2020 17:30:27

Code: Alles auswählen

-----BEGIN CERTIFICATE-----
MIIGszCCBZugAwIBAgIQRF7gFMlJ3UO909a39zv1mzANBgkqhkiG9w0BAQsFADBf
...
gtFRKmvMIUIESh60F91+2AeUfCa/tBfOM+PDpsNNaZ+iHHaicAIw
-----END CERTIFICATE-----
Meine Zertifikate sehen ebenfalls so aus. Jedoch stehen vor dem Certifikat noch einige Informationen...

tobo
Beiträge: 795
Registriert: 10.12.2008 10:51:41

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von tobo » 30.06.2020 18:27:38

Das was du oben angegeben hast könnte man schon mal dahingehend verbessern, dass man es so schreibt:

Code: Alles auswählen

for f in /path/*.crt.pem
do
	After=$(cat "$f" | grep -e After | awk '{usage=($7 "" $6)} END {print usage}')    
	Befor=$(cat "$f" | grep -e Befor | awk '{usage=($6 "" $5)} END {print usage}')
	usw..
	echo "$After $Befor" >> /tmp/test.txt
done

wanne
Moderator
Beiträge: 6464
Registriert: 24.05.2010 12:39:42

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von wanne » 01.07.2020 06:26:09

joe2017 hat geschrieben: ↑ zum Beitrag ↑
30.06.2020 17:40:19
Meine Zertifikate sehen ebenfalls so aus. Jedoch stehen vor dem Certifikat noch einige Informationen...
Das ist lediglich ein Kommentar, den der Ersteller da eingefügt hat. Der kann jedes mal anders aussehen und vor allem wenn es dumm läuft schlicht gar nichts mit dem Inhalt zu tun haben. Ich würde davon abraten den zu parsen.
So machst du das richtig, und lässt dir anzeigen was der wirkliche Inhalt des Zertifikates ist:

Code: Alles auswählen

openssl x509 -in /path/file.crt.pem -noout -subject -dates
Eventuell sillst du noch Subject Alternative Names haben:

Code: Alles auswählen

openssl x509 -in \*_news_google_com.crt -noout -subject -dates -ext subjectAltName
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 01.07.2020 09:24:13

Hallo wanne,

da hast du natürlich Recht! Auch wenn die Zertifikate von mir erstellt werden, ist dein Weg ganz sicher der bessere. VIELEN DANK
Jetzt hab ich soweit auch alles mit awk und sed hinbekommen und habe meine Veriablen für die Weiterverarbeitung befüllt.

Jedoch hab ich noch ein kleines Problem mit dem "for f in $FILES".
Das bearbeitet in einer "do" Schleife alle FILES in dem Verzeichnis (FILES=/path/to/*.crt.pem).
Gibt es für diese Schleife auch noch ein Auschlussverfahren? Z.b. Verarbeite alle Files außer die Filenamen mit dem Wort xyz und abc?

eggy
Beiträge: 2198
Registriert: 10.05.2008 11:23:50

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von eggy » 01.07.2020 09:45:52

useless use of cat:
cat datei |grep irgendwas
grep irgendwas datei

useless use of grep:
grep irgendwas datei | awk '{print $0}'
awk '/irgendwas/{print $0;}' datei

In Deinen Fall lässt sich sogar das ganze Konstrukt auf nen awk-Einzeiler einstampen, awk kann nämlich auch mehrere Blöcke und mehrere Eingabedateien.
awk '/After/{a=$7 $6} /Befor/{b=$6 $5)} END{print a " " b}' *.pem
oder so ähnlich, ohne Testdaten macht das keinen Spass
willst Du die Dateien überpringen die nen bestimtem Muster folgen, gibts dafür FILENAME, würde dann zum Beispiel in etwas so aussehen
awk 'FILENAME=="sonicht"{nextfile} FILENAME=="auchnicht.txt"{nextfile} /After/{a=$7 $6} /Befor/{b=$6 $5)} END{print a " " b}' *.pem
das könnt man dann via || noch weiter verkürzen oder gleich entsprechende RegEx für die Dateinamen benutzen

wanne
Moderator
Beiträge: 6464
Registriert: 24.05.2010 12:39:42

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von wanne » 01.07.2020 12:41:48

Gibt es für diese Schleife auch noch ein Auschlussverfahren? Z.b. Verarbeite alle Files außer die Filenamen mit dem Wort xyz und abc?
Du kannst dein Globbing anpassen.
Oder halt ein If einbauen:

Code: Alles auswählen

for f in /path/*.crt.pem
  do if ! echo "$f" | grep -E (xyz|abc)
    then prog "$f"
  fi
done
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
joe2017
Beiträge: 588
Registriert: 07.08.2017 14:29:51

Re: debian bash script multiple grep in all *.crt.pem

Beitrag von joe2017 » 02.07.2020 09:25:59

Ich wollte euch mal mein Ergebnis posten.

Vielleicht hat mal jemand eine ähnliche Anforderung.

Code: Alles auswählen

FILES=/path/to/*.crt.pem
for f in $FILES
do
  if [[ $f != *"chain"* ]]; then
      SUBJE=$(openssl x509 -in $f -noout -subject | sed 's/^.*OU = //' | sed -e 's/\..*$//')
      ALGOR=$(openssl x509 -in $f -noout -text | grep -m1 "Signature Algo" | sed 's/^.*Algorithm: //')
      BEGIN=$(echo "$(openssl x509 -in $f -noout -startdate | sed 's/^.*=//' | awk '{print $2 " " $1 " " $4}')" | awk '{print "date -d\""$1FS$2FS$3"\" +%Y-%m-%d"}' | bash)
      AFTER=$(echo "$(openssl x509 -in $f -noout -enddate | sed 's/^.*=//' | awk '{print $2 " " $1 " " $4}')" | awk '{print "date -d\""$1FS$2FS$3"\" +%Y-%m-%d"}' | bash)
      DIFF=$((($(date -d"$AFTER" +%s)-$(date +%s))/60/60/24))
      MYDATE=$(date +%Y%m%d-%H%M)
      echo "$SUBJE, $ALGOR, $BEGIN, $AFTER, $DIFF, $MYDATE" >> /path/file.txt
  fi
done

wanne
Moderator
Beiträge: 6464
Registriert: 24.05.2010 12:39:42

Re: [gelöst] debian bash script multiple grep in all *.crt.pem

Beitrag von wanne » 02.07.2020 15:00:06

Ich wollte euch mal mein Ergebnis posten.

Vielleicht hat mal jemand eine ähnliche Anforderung.
Danke das ist nett.
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten