pixelpirat hat geschrieben: 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]''.