[GELÖST] Mit sed ein Passwort in einer Datei ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

[GELÖST] Mit sed ein Passwort in einer Datei ersetzen

Beitrag von pixelpirat » 27.02.2021 16:01:24

Hallo,

Ich kämpfe mit einer kleiner Ersetzung eines Passwortes in der konfig-datei. Es ist ein Bash-script.
Das Problem taucht immer dann auf, wenn im PW Symbole wie `´'& " und ' enthalten sind. Dann funktioniert es mit sed nicht.

Code: Alles auswählen

if [ ${#my_admin_pass} -le 8 ]; then
        echo -e "Das Passwort muss mindestens aus 8 Zeichen bestehen. Das vorgegebene ist zu kurz."
        echo -e "Ein neues, sicheres Passwort wird erstellt und in der Konfig-Datei eingetragen"
        my_admin_pass="$(pwgen 16 -By)" && sed -i -e 's/(my_admin_pass=).*/\1"'$my_admin_pass'"/' $conf_file
fi
Sobald ich nur alphanumerische Zeichen zulasse läuft alles bestens.

Woran liegt es?

Danke für Eure Unterstützung
Zuletzt geändert von pixelpirat am 28.02.2021 19:19:28, insgesamt 1-mal geändert.

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

Re: Mit sed ein Passwort in einer Datei ersetzen

Beitrag von Meillo » 27.02.2021 16:48:57

pixelpirat hat geschrieben: ↑ zum Beitrag ↑
27.02.2021 16:01:24
Das Problem taucht immer dann auf, wenn im PW Symbole wie `´'& " und ' enthalten sind. Dann funktioniert es mit sed nicht.

Code: Alles auswählen

if [ ${#my_admin_pass} -le 8 ]; then
        echo -e "Das Passwort muss mindestens aus 8 Zeichen bestehen. Das vorgegebene ist zu kurz."
        echo -e "Ein neues, sicheres Passwort wird erstellt und in der Konfig-Datei eingetragen"
        my_admin_pass="$(pwgen 16 -By)" && sed -i -e 's/(my_admin_pass=).*/\1"'$my_admin_pass'"/' $conf_file
fi
Sobald ich nur alphanumerische Zeichen zulasse läuft alles bestens.

Woran liegt es?
Woran es liegt ist einfach: Diese Zeichen bringen das Quoting der Shell durcheinander oder werden von ihr sonst ungewuenscht interpraetiert.

Interessanter ist die Frage, wie du das verhinderst. ;-)

Helfen wuerde schon mal die Variablenexpansion zu quoten:

Code: Alles auswählen

        my_admin_pass="$(pwgen 16 -By)" && sed -i -e 's/(my_admin_pass=).*/\1"'"$my_admin_pass"'"/' $conf_file
Aber das aendert auch nichts daran, dass ein &-Zeichen im Ersatztext durch den gematchten String ersetzt wird (weil das von sed und nicht von der Shell gemacht wird). Um das zu verhindern muesstest du das neue Passwort zuvor passend escapen:

Code: Alles auswählen

my_admin_pass="$(echo "$my_admin_pass" | sed 's/&/\\&/g')"
Folglich beides zusammen etwa in der Art:

Code: Alles auswählen

my_admin_pass="$(pwgen 16 -By) | sed 's/&/\\&/g')" && sed -i -e 's/(my_admin_pass=).*/\1"'"$my_admin_pass"'"/' $conf_file
Use ed once in a while!

pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

Re: Mit sed ein Passwort in einer Datei ersetzen

Beitrag von pixelpirat » 28.02.2021 16:22:14

Hi,

danke für deine ausführliche Erklärung. Das hat mir seht geholfen.
In der Zwischenzeit hatte ich mich selbst auch noch weiter informiert und experimentiert. Meine Lösung sieht jetzt so aus.

Code: Alles auswählen

        new_pass="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^*_+:<>?=' | head -c 16)" && sed -i -E 's/(my_admin_pass).+/\1="'"$new_pass"'"/' $conf_file
f
Das ich jetzt auf /dev/urandom gewechselt bin, ist der Tatsache geschuldet pwgen muss zusätzlich installiert werden. So bin ich unabhängiger.
Das Entscheidende, dass es jetzt funktioniert, war Dein Hinweis auf das &. Sobald ich es im String enthalten war hat es mir das PW zerlegt.

Vielen Dank für Deine Mühe.

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

Re: Mit sed ein Passwort in einer Datei ersetzen

Beitrag von Meillo » 28.02.2021 17:10:17

pixelpirat hat geschrieben: ↑ zum Beitrag ↑
28.02.2021 16:22:14
In der Zwischenzeit hatte ich mich selbst auch noch weiter informiert und experimentiert. Meine Lösung sieht jetzt so aus.

Code: Alles auswählen

        new_pass="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^*_+:<>?=' | head -c 16)" && sed -i -E 's/(my_admin_pass).+/\1="'"$new_pass"'"/' $conf_file
Das sieht gut aus.

Ich selbst haette es wohl eher in dieser Art gemacht (was aber nur wenig mehr als Stilunterschiede sind):

Code: Alles auswählen

sed -i '/\<my_admin_pass\>.*=/ s/=.*/="'"$new_pass"'"/' $conf_file
In Worten: In Zeile(n) in denen `my_admin_pass' (als ein eigenstaendiges Wort) und ein Gleichheitszeichen vorkommt, ersetzt das Gleichheitszeichen und alles danach mit einem Gleichheitzeichen und dem neuen Passwort in Double-Quotes.

Indem du das s-Kommando nur die passenden Zeilen anwendest, ersparst du dir die einfangende Klammer und den Rueckverweis. Ich finde das angenehmer, das moegen andere aber auch anders sehen.

Die Wortbegrenzer (\< und \>) sind IMO sinnvoll, weil du sonst auch `mummy_admin_pass' und `my_admin_pass_length' ersetzen wuerdest, falls es die gibt. Du kannst die auch bei dir in die runden Klammern einbauen. (Ich weiss nicht, ob die bei `sed -E' gleich sind, weil ich `-E' nie verwende.)

Wenn ich genau wuesste wie die Syntax der Datei aussieht, wuerde ich wohl noch einbauen, dass der Identifier am Zeilenanfang oder nur mit Whitespace eingerueckt stehen muss, um auskommentierte Zeilen nicht nebenbei auch zu veraendern. (Vielleicht ist das fuer deinen Fall aber auch zu defensiv gedacht).



Btw: Wenn sich dein Problem erledigt hat, dann ergaenze noch den Titel deines ersten Beitrags um ein ``[gelöst]''.
Use ed once in a while!

pixelpirat
Beiträge: 158
Registriert: 05.07.2007 17:22:21

Re: Mit sed ein Passwort in einer Datei ersetzen

Beitrag von pixelpirat » 28.02.2021 19:16:44

WOW! Vielen lieben Dank! :THX: :THX: :THX: :THX:
Daran hatte ich noch nicht gedacht.

Das werde ich direkt noch umsetzen

Viele Grüße

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

Re: Mit sed ein Passwort in einer Datei ersetzen

Beitrag von Meillo » 28.02.2021 19:35:14

pixelpirat hat geschrieben: ↑ zum Beitrag ↑
28.02.2021 19:16:44
WOW! Vielen lieben Dank! :THX: :THX: :THX: :THX:
Gerne! Man muss ja auch etwas fuer's gute Image des Forums tun: Hier gibt's das rundum Verwoehnprogramm und lernt nebenher auch noch etwas. :THX: Davon kannst du jetzt allen deinen Freunden vorschwaermen. ;-) :mrgreen:
Use ed once in a while!

Antworten