staging.inyokaproject.org

sed und &

Status: Gelöst | Ubuntu-Version: Server 20.04 (Focal Fossa)
Antworten |

Wutze

Anmeldungsdatum:
16. November 2009

Beiträge: 364

Ich bin da mal ein kleines Problem. Vermutlich sehe ich den Wald vor lauter Bäumen nicht.

Ich will in einer PHP-Konfigurationsdatei per Shell und sed das Passwort zur Datenbank eintragen. Ich könnte als Alternative die Datei neu anlegen lassen, jedoch interessiert mich jetzt mein Denkfehler mit sed.

Das shellscript beinhaltet das.

1
sed -i "s/\$pass = '';/\$pass = '$userpass';/" "config.php"

In der config.php steht unter anderem das als Vorlage drin, in das ich jetzt das Passwort, welches im Shellscript ermittelt wurde, eingetragen wird.

1
$pass = '';

Das funktioniert bis hier her auch alles völlig problemlos. Es sei denn man benutzt ein & innerhalb des Passwortes. Dann passiert das:

Das Passwort welches übergeben wird ist das: dfsSHGDddeAre546987gjw459wf%6dd&dweff

Daraus mach sed dann:

1
$pass = 'dfsSHGDddeAre546987gjw459wf%6dd$pass = '';dweff';

Ich finde meinen Fehler einfach nicht. Hätte bitte jemand einen Ansatz einer Idee, wo mein Fehler ist?

Danke.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Das Ampersand im Ersetzungstext fügt den erkannten Text ein.

1
2
$ echo 1234567 | sed 's#3..#<&>#'
12<345>67

Du musst es escapen:

1
2
$ echo 1234567 | sed 's#3..#<\&>#'
12<&>67

Wenn Du es sauber machen willst, dann musst Du alle Metazeichen des Ersetzungsausdrucks escapen.

1
2
3
4
5
6
$ userpass='dfsSHGDddeAre546\987gjw459wf%6dd&dweff'
$ escaped=$(echo -n "$userpass" | sed 's#\\#\\\\#g;s#&#\\&#g')
$ echo "$escaped"
dfsSHGDddeAre546\\987gjw459wf%6dd\&dweff
$ echo "\$pass = '';" | sed "s/\$pass = '';/\$pass = '$escaped';/"
$pass = 'dfsSHGDddeAre546\987gjw459wf%6dd&dweff';

Wutze

(Themenstarter)

Anmeldungsdatum:
16. November 2009

Beiträge: 364

Is ja irre. Danke, so funktioniert es problemlos.

Mir war nicht klar das Inhalte von Variablen zusätzlich noch Ersetzungen veranlassen können. Da gibt es dann noch etwas Arbeit heute, vermutlich muss einiges verändert werden.

Juchuu, Arbeit! ,o)

Danke noch mal.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Wutze schrieb:

Is ja irre. Danke, so funktioniert es problemlos.

"Irre"? Eigentlich ganz logisch...

Mir war nicht klar das Inhalte von Variablen zusätzlich noch Ersetzungen veranlassen können.

Das hat gar nichts mit Variablen zu tun. Dem sed ist es völlig egal, woher der Inhalt seiner Kommandozeilenargumente kommt. Die Ersetzungen von \1, \2 ... \9 und & sind Eigenschaften des s-Befehls von sed. So etwas ist bei den meisten Regex-Engines üblich, weil man damit den erfassten Text wiederverwenden kann.

Es ist ganz logisch, wenn man sich damit befasst, wie Prozesse unter Unix-artigen Systemen gestartet und mit Argumenten versorgt werden: die main()-Funktion sieht einfach nur ein Array von Zeichenketten. Der aufrufende Prozess (in diesem Fall die Shell, die das Skript ausführt - oder eine interaktive) übergibt diese Zeichenketten einfach nur. Dann muss man sich noch klar machen, wie das Quoting der Shell und die Aufteilung auf verschiedene Kommandozeilenargumente funktioniert. Hier mal ein paar Beispiele als Anregung zu Forschung und eigenen Experimenten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ args.sh 111 222
arg count: 2
arg[1]: '111'
arg[2]: '222'
$ args.sh 111     222
arg count: 2
arg[1]: '111'
arg[2]: '222'
$ args.sh      111 222
arg count: 2
arg[1]: '111'
arg[2]: '222'
$ args.sh "111 222"
arg count: 1
arg[1]: '111 222'
$ args.sh '111 222'
arg count: 1
arg[1]: '111 222'
$ args.sh '111'"222"
arg count: 1
arg[1]: '111222'
$ args.sh '111' "222"
arg count: 2
arg[1]: '111'
arg[2]: '222'
$ args.sh '111''222'
arg count: 1
arg[1]: '111222'
$ args.sh "111""222"
arg count: 1
arg[1]: '111222'
$ args.sh 'a b'\''c d'
arg count: 1
arg[1]: 'a b'c d'
$ args.sh "a b"\""c d"
arg count: 1
arg[1]: 'a b"c d'

Da gibt es dann noch etwas Arbeit heute, vermutlich muss einiges verändert werden.

Schraub, schraub, dengel, dengel. 😉

Juchuu, Arbeit! ,o)

☺

Danke noch mal.

Bitte!

Wutze

(Themenstarter)

Anmeldungsdatum:
16. November 2009

Beiträge: 364

rklm schrieb:

"Irre"? Eigentlich ganz logisch...

Spaßvogel. Logisch! 🙄 ;o)

Ich hasse und liebe Regex. Gleichermaßen! Ich habe aber auch gefühlt ewig gebraucht das System dahinter zu verstehen. Blöderweise gelingt mit das mit sed und/oder awk gar nicht so recht. Wobei Dein angefügtes Beispiel - Danke für diese Online-Lektion - einige meiner Denkfehler aufzeigt.

sed ist es völlig egal, woher der Inhalt seiner Kommandozeilenargumente kommt. Die Ersetzungen von \1, \2 ... \9 und & sind Eigenschaften des s-Befehls von sed. So etwas ist bei den meisten Regex-Engines üblich, weil man damit den erfassten Text wiederverwenden kann.

Mir war schon klar, dass auf der Shell Inhalte von Variablen anders interpretiert werden als zum Beispiel bei PHP. Ich muss hier nur mal einen Umschalter finden, der mir das bei Shell-Scripten auch mal so ins Bewusstsein hebelt.

Da gibt es dann noch etwas Arbeit heute, vermutlich muss einiges verändert werden.

Schraub, schraub, dengel, dengel. 😉

Jepp, es waren insgesamt 3 Scripte davon betroffen.

Du bist der beste! (Muss einfach mal gesagt werden)

Antworten |