Common Name (CN) in String suchen und ausgeben
Hallo,
ein Bisschen Hintergrundwissen (für die eigentliche Frage nicht unbedingt notwendig):
Ich betreibe OpenVPN auf einem Router mit DD-Wrt-Firmware und möchte die "tls-verify"-Option nutzen, um festzulegen mit welchen Zertifikaten ein Zugriff möglich ist. Hierzu werden von OpenVPN Zertifikatsinformationen an ein Skript übergeben, welches überprüft, ob der Client Zugriff bekommt oder nicht. Die Entscheidung ja/nein wird OpenVPN dann per Return-Code mitgeteilt.
Im Netz habe ich bereits ein Shell-Skript gefunden, so wie ich mir das vorstelle: http://robert.penz.name/21/ovpncncheck-an-openvpn-tls-verify-script/
Leider passt die Regular Expression bei mir nicht.
Übergeben werden Zertifikatsinformationen, die etwa so aussehen:
C=DE, ST=North Rine-Westphalia, L=Stadt, O=Martin Muster, OU=IT, CN=Max Muster, emailAddress=max@muster.com
Für eine Überprüfung wird nur der Common Name (also alles zwischen "CN=" und ",emailAddress=....") benötigt.
Wie erhalte ich den Wert des CN? Ich habe schon ein paar Stunden probiert, bin aber noch nicht zum Ziel gekommen. Bisher habe ich folgende RegEx, bei der zumindest die Mailadresse nicht mehr mit ausgegeben wird: '.*CN=([^,]*)'
Aufgrund der Betriebsumgebung kann nur mit der Linux-Shell und Standard-Tools wie grep gearbeitet werden, Python oder ähnliches steht nicht zur Verfügung.
Gruß
PSaR04
ein Bisschen Hintergrundwissen (für die eigentliche Frage nicht unbedingt notwendig):
Ich betreibe OpenVPN auf einem Router mit DD-Wrt-Firmware und möchte die "tls-verify"-Option nutzen, um festzulegen mit welchen Zertifikaten ein Zugriff möglich ist. Hierzu werden von OpenVPN Zertifikatsinformationen an ein Skript übergeben, welches überprüft, ob der Client Zugriff bekommt oder nicht. Die Entscheidung ja/nein wird OpenVPN dann per Return-Code mitgeteilt.
Im Netz habe ich bereits ein Shell-Skript gefunden, so wie ich mir das vorstelle: http://robert.penz.name/21/ovpncncheck-an-openvpn-tls-verify-script/
Leider passt die Regular Expression bei mir nicht.
Übergeben werden Zertifikatsinformationen, die etwa so aussehen:
C=DE, ST=North Rine-Westphalia, L=Stadt, O=Martin Muster, OU=IT, CN=Max Muster, emailAddress=max@muster.com
Für eine Überprüfung wird nur der Common Name (also alles zwischen "CN=" und ",emailAddress=....") benötigt.
Wie erhalte ich den Wert des CN? Ich habe schon ein paar Stunden probiert, bin aber noch nicht zum Ziel gekommen. Bisher habe ich folgende RegEx, bei der zumindest die Mailadresse nicht mehr mit ausgegeben wird: '.*CN=([^,]*)'
Aufgrund der Betriebsumgebung kann nur mit der Linux-Shell und Standard-Tools wie grep gearbeitet werden, Python oder ähnliches steht nicht zur Verfügung.
Gruß
PSaR04
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 218694
Url: https://administrator.de/contentid/218694
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
12 Kommentare
Neuester Kommentar
Hi, wenn in den Daten neue Muster auftauchen, muss Regex halt angepasst werden.
ZB so:
Vor allem da das Komma ja ein wichtiger Anker im vorherigen Regex war.
Und hier auch wieder ist. Es ginge deshalb auch so, was mir fast noch besser gefällt:
Das geht davon aus, dass CN immer zwei Wörter sind.
lg.
ZB so:
| sed -r 's/.*CN=(.*),\s?email.*/\1/'
Und hier auch wieder ist. Es ginge deshalb auch so, was mir fast noch besser gefällt:
| sed -r 's/.*CN=([[:alnum:]]+,?\s[[:alnum:]]+),?\s.*/\1/'
lg.
Hi,
wenn du häufiger mit
Hier noch ein abschliessender Vorschlag, der alle Leerzeichen und Kommas zwischen den Namen erhält und auch mit einem Namen klar kommt:
lg.
wenn du häufiger mit
sed
arbeitest, solltest du dir eine aktuelle GNU-Version besorgen. Vielleicht ist die auch schon installiert und wird nur nicht benutzt.Hier noch ein abschliessender Vorschlag, der alle Leerzeichen und Kommas zwischen den Namen erhält und auch mit einem Namen klar kommt:
|sed -r 's/.*CN=([^[:space:]]+[[:space:],]*[^[:space:],]*),+.+/\1/'