Variablen in der richtigen Reinenfolge verknüpfen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von HelsAett » 04.02.2022 14:58:36

zahlen="1 2 3"
buchstaben="a b c"

mit a b c wird zusätzlich eine aktion ausgeführt

gewünschtes Ergebnis:
1a ergebnis aus Aktion a,
2b ergebnis aus Aktion b,
3c ergebnis aus Aktion c,

Am ende geht es mit darum, einen Keystore auszulesen. Wobei ich Alias und Gültigkeitsdatum erhalte.
In etwa so:
Alias = 1
Gültig = a
Alias = 2
Gültig = b

Eigentliche Code

Code: Alles auswählen

#!/bin/bash

unixtime=$(date +%s)
for i in $(find . -name "*.jks"); do
        zertifikat=$(echo '' | keytool -list -v -keystore $i | grep "Alias name:\|Valid from: " )
        aliasnames=$(echo -e "$zertifikat" | grep "Alias name:")
        ablaufdatum=$(echo -e "$zertifikat" | grep "Valid from:" | cut -d ":" -f5-)


        echo "$aliasnames" | while read -r zertifikatsname; do

        echo "$ablaufdatum" | while read -r restlaufzeit; do
                #berechnung restlaufzeit des zertifikates
                expired=$(date -d "${restlaufzeit}" +%s)
                difference=$((expired - unixtime))
                days=$((difference / 86400))

                        if [ $days -lt 6000 ]
                        then
                                echo -e "$i enthaelt ein Zertifikat $zertifikatsname \n gueltig bis $ablaufdatum \n welches in $days ablaeuft"
                        fi

        done
        done
done
Ich weiß meine Idee mit den 2 While ist für den Eimer. Ich möchte am Ende aber "letzte Echo Ausgabe: mein 1a Aktion " als Ausgabe haben. Jemand eine Idee. Ich scheiter am Verbinden der besagten Variablen. Im Script wäre es dann den richtigen Alias mit den richten Ablaufdatum und der richtigen Restlaufzeit in Verbindung zubringen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von Meillo » 04.02.2022 19:07:58

Ich verstehe leider nicht wirklich um was es dir geht. Was sind 1 2 3 und was a b c? Sind das Strings, die du kombinieren willst? Was meinst du dann damit, dass eine Aktion damit verknuepft ist? Kann es auch 1b 1c 2a 2c 3a 3b geben?

Ich wuerde dir gerne helfen, wenn du normal erklaeren konntest um was es geht.
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von HelsAett » 04.02.2022 19:28:16

Ich dachte ich versuche es mit 123 und abc einfach zu halten. Das war woll nichts. Sorry wenn das eher verwirrt hat.

Ich will einen keystore auslesen und verarbeiten.
Die Ausgabe, der rohe Daten sieht in etwas so aus:
Alias Name: Zertifikat1
Valied: 08-20-2022 CERT 09:10:11
Alias Name: Zertifikat2
Valied: 03-21-2040 CERT 20:10:11
usw. usw.

Das ganze "siehe code oben" will ich dann gerne in eine Ausgabe auf den Screen ausgeben. In folgendem Format:
Alians Name: Zertifikat Valied: 08-20-2022 CERT 09:10:11 Läuft in 157 Tagen ab
Alias Name: Zertifikat2 Valied: 03-21-2040 CERT 20:10:11 Läuft in 3564 Tagen ab

Die Berechnung, mache ich im Code "siehe erster Post" und mein Problem ist dabei, die Ausgabe lässt sich nicht so aufbauen, wie gewünscht.
Ich benötige am Ende den Richtigen Alias Name zugeordnet zum Richtigen Valied Plus die errechneten Tage.

Um meine Rechnung durchzuführen, muss ich quasi
Alias Name: Zertifikat1
Valied: 08-20-2022 CERT 09:10:11
Voneinander trennen, zur Berechnung der Tage, benötig ich nur den Valied aber am Ende in der Ausgabe, brauche ich wieder den passenden Alias Name zum entsprechenden Valied. Damit die Zuordnung der errechneten Tage auch wieder passt.

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von Meillo » 04.02.2022 20:17:48

Mal ganz simpel angesetzt:

1) Zeilen aufteilen:

Code: Alles auswählen

grep '^Alias Name:' <input.txt >alias-name.txt
grep '^Valied:' <input.txt >valied.txt
2) Berechnung auf valied.txt ausfuehren:

Code: Alles auswählen

script.sh <valied.txt >valied2.txt
3) Dateien zusammenfuehren:

Code: Alles auswählen

paste alias-name.txt valied2.txt
Waere das eine Option oder soll dein Script so erweitert werden, dass es alles auf einmal macht?
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von HelsAett » 04.02.2022 21:31:13

optimal wäre natürlich alles in einen abwasch erledigen zu können. Also alles aufeinmal im Script.

Script:
script.sh

Code: Alles auswählen

#!/bin/bash

unixtime=$(date +%s)
for i in $(find . -name "*.jks"); do
        #zertifikat=$(echo '' | keytool -list -v -keystore $i | grep "Alias name:\|Valid from: " )
        zertifikat=$(cat $i | grep "Alias name:\|Valid from: " )
        aliasnames=$(echo -e "$zertifikat" | grep "Alias name:")
        #ablaufdatum=$(echo -e "$zertifikat" | grep "Valid from:" | cut -d ":" -f5-)
        ablaufdatum=$(echo -e "$zertifikat" | grep "Valid from:")


        echo "$aliasnames" | while read -r zertifikatsname; do

        echo "$ablaufdatum" | while read -r restlaufzeit; do
                #berechnung restlaufzeit des zertifikates
                expired=$(date -d "${restlaufzeit}" +%s)
                difference=$((expired - unixtime))
                days=$((difference / 86400))

                        if [ $days -lt 6000 ]
                        then
                                echo -e "$i enthaelt ein Zertifikat $zertifikatsname \n gueltig bis $ablaufdatum \n welches in $days Tagen ablaeuft"
                        fi

        done
        done
done
Test JKS File
test.jks

Code: Alles auswählen

Alias name: Cert1
Valid from: Datum1
Alias name: Cert2
Valid from: Datum2
Alias name: Cert3
Valid from: Datum3
Alias name: Cert4
Valid from: Datum4
Alias name: Cert5
Valid from: Datum5
Alias name: Cert6
Valid from: Datum6
Alias name: Cert7
Valid from: Datum7
Fehlerhaftes Output Example:
./test.jks enthaelt ein Zertifikat Alias name: Cert1
gueltig bis Valid from: Datum1
Valid from: Datum2
Valid from: Datum3
Valid from: Datum4
Valid from: Datum5
Valid from: Datum6
Valid from: Datum7
welches in -19027 ablaeuft
Richtig wäre:
./test.jks enthaelt ein Zertifikat Alias name: Cert1
gueltig bis Valid from: Datum1 welches in -19027 Tagen ablaeuft

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von Meillo » 04.02.2022 22:21:58

Hier ein awk-Script, das Stdin liest und die Ausgabe entsprechend macht:

Code: Alles auswählen

#!/bin/sh

awk '

BEGIN {
        "date +%s" | getline timenow
}

/^Alias Name:/ {
        name = $0
}

/^Valied:/ {
        valied = $0
        date = $2
        gsub(/-/, "/", date)

        "date -d "date" +%s" | getline timecert
        expdays = (timecert - timenow) / 86400

        printf("%s %s Laeuft in %d Tagen ab\n", name, valied, expdays)
}
'
Wenn du mehrere Dateien bearbeiten willst, dann kannst du das drumherum bauen.

Wenn du nur manche Werte ausgeben willst, dann kannst du das printf() noch in ein if setzen. (In awk ist die if-Syntax wie in C, Java, PHP.)

Ich hoffe, das hilft weiter.

Natuerlich koennte man es auch in der Shell selbst machen statt in awk. Da koennen dir andere User besser weiterhelfen.
Use ed once in a while!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Variablen in der richtigen Reinenfolge verknüpfen

Beitrag von HelsAett » 04.02.2022 22:57:32

@Meillo vielen Dank, mit awk schaue ich mir auch nochmal an. Ich bin mit meinen Script mitlerweile auch so weit das es das tut was es soll.

Code: Alles auswählen

#!/bin/bash

unixtime=$(date +%s)
for i in $(find . -name "*.jks"); do
        #zertifikat=$(echo '' | keytool -list -v -keystore $i | grep "Alias name:\|Valid from: " )
        zertifikat=$(cat $i | grep "Alias name:\|Valid from: " )
        aliasnames=$(echo -e "$zertifikat" | grep "Alias name:")
        #ablaufdatum=$(echo -e "$zertifikat" | grep "Valid from:" | cut -d ":" -f5-)
        ablaufdatum=$(echo -e "$zertifikat" | grep "Valid from:")



        echo -e "$ablaufdatum" | while read -r restlaufzeit; do
                #berechnung restlaufzeit des zertifikates
                expired=$(date -d "${restlaufzeit}" +%s)
                difference=$((expired - unixtime))
                days=$((difference / 86400))

                        if [ $days -lt 6000 ]
                        then    
                                certname=$(echo -e "$zertifikat" | grep -B1 "${restlaufzeit}" | grep "Alias name:")
                                echo -e "der Keystore $i enthaelt ein Zertifikat $certname welche gueltig ist bis $restlaufzeit und in $days Tagen ablaeuft"
                                #done
                        fi
        done
done
Der Trick war:

Code: Alles auswählen

certname=$(echo -e "$zertifikat" | grep -B1 "${restlaufzeit}" | grep "Alias name:")
hat Allerdings das Risiko, dass wenn mehrere Zertifikate im Keystore existieren, mit exakt den selben Ablaufdatum, kann da mal schnell das falsche Zertifikat erwischt werden. Vielleicht hat hier noch jemand einen entsprechenden Tipp.

Antworten