ubuntuusers.de

Mit sed aus einer Datei zwischen zwei Zeichen auslesen

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

toadie78

Anmeldungsdatum:
11. Dezember 2013

Beiträge: 7

Hallo zusammen, Ich habe ein kleines Problem mit großer Wirkung. ☺

Ich möchte aus einer PHP Datei Inhalt auslesen.

1
2
3
public $password = 'WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"';
oder
public $password = "WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"";

"Test Passwort, sollte klar sein" Mein Bash Code.

1
DATENBANK_P=$(grep -w '$password' "Datei" | sed -r "s/^.*=\s*'(.*)'.*$/\1/g" | sed -r "s/^.*=\s*\"(.*)\".*$/\1/g")

Klappt auch so weit. Nur machen die Sonderzeichen Probleme im Passwort.

Habt Ihr eine Idee wie ich sagen kann, alles was Zwischen den ersten und letzten " " oder ' ' steht Text ist. So das die Passwörter korrekt ausgelesen werden?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

Oh, das ist schön!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cat x
public $password = 'WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"';
oder
public $password = "WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"";
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x
$password = 'WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"'
$password = "WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\""
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x | egrep -o '['\''"].*['\''"]'
'WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"'
"WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\""
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x | sed -re 's#^.*[[:space:]]*=[[:space:]]*##'
'WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"'
"WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\""
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x | sed -re 's#^.*[[:space:]]*=[[:space:]]*##;s#^.(.*).$#\1#'
WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"
WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x | sed -re 's#^.*[[:space:]]*=[[:space:]]*##;s#^.(.*).$#\1#'
WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"
WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\"
$ egrep -o '\$password[[:space:]]*=[[:space:]]*('\''([^'\\\']'|\\.)*'\''|"([^\\"]|\\.)*")' x | sed -re 's#^.*[[:space:]]*=[[:space:]]*##;s#^.(.*).$#\1#;s#\\##g'
WQzF5fJY&Q-f"bxJY7ZeP7@dnUj;GuZWk7"
WQzF5fJY&Q-f"bxJY7ZeP7@dnUj;GuZWk7"

😉

robert

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

oder im Script auch so:

#! /usr/bin/awk -f
BEGIN { FS="="; }
/\$password/  { $1=""; }
  { sub(/^\s*[\'\"]/,"");  sub(/[\'\"]\s*;\s*$/, ""); print $0; }

Als Einzeiler wird das Quoting sonst eher lästig.

toadie78

(Themenstarter)

Anmeldungsdatum:
11. Dezember 2013

Beiträge: 7

Danke für die schnelle Antworten.

@rklm ich glaube Du hast mich falsch Verstanden. Es geht nicht nur um dieses Passwort sondern Global alle Passwörter.

@theinlein ich frage sicherheitshalber nach wie muss der Code in die *.sh Datei integriert werden?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Ich bin, was PHP betrifft, nicht so bewandert, aber kann es sein, dass folgendes zutrifft:

Nach dem Gleichheitszeichen dürfen beliebig viele Whitespaces folgen, inklusive 0? Und vor dem terminierenden Semikolon, dem selbst WS folgen kann, kann auch beliebig viel davon stehen?

Dass sogar nach dem gleich und vor dem Zeilenumbruch am Ende weitere Zeilenumbrüche sein könnten - dass wir das aber ebenso ignorieren wie mehrere Passwörter in einer Zeile?

1
2
3
a = 
    "foo"
   ;

Also ".*=[ \t]*.(.*).[ \t]*;.*$/\1/"

Ohne g, weil Du nur einmal, nicht global also mehrfach pro Zeile das Pattern suchst. Den Punkt als Platzhalter für ein Zeichen kannst Du noch strenger fassen, der Ausdruck wäre dann:

1
.*=[ \t]*["'](.*)["'][ \t]*;.*$/\1/

Wenn wir doppelte Anführungsstriche verwenden wollen um diesen zu fassen, dann müssen solche innerhalb des Ausdrucks noch maskiert werden:

1
".*=[ \t]*[\"'](.*)[\"'][ \t]*;.*$/\1/"

Auch möglich wäre \"|' als dies-oder-das.

Man kann damit nicht spezifizieren, dass das zweite Zeichen wie das erste sein muss, aber die weniger strenge Eingrenzung sollte auch funktionieren, wenn der PHP-Code funktionstüchtig ist.

Kommentare werden allerdings so nicht erkannt.

1
cat phpfile | sed -r "s/.*=[ \t]*[\"'](.*)[\"'][ \t]*;.*$/\1/"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

toadie78 schrieb:

@rklm ich glaube Du hast mich falsch Verstanden. Es geht nicht nur um dieses Passwort sondern Global alle Passwörter.

Du bekommst doch alle Zeilen, die so formatiert sind. Was fehlt Dir da?

Ciao

robert

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Wenn der vorhandene PHP Code es zulässt, direkt als PHP Script auf die Variablen zugreifen, wäre sauberer als das irgendwie selber parsen zu wollen.

Oder wenn du den PHP-Code ändern kannst, das Passwort so speichern daß das Shellscript es leicht lesen kann und das PHP-Script dann halt auch.

toadie78

(Themenstarter)

Anmeldungsdatum:
11. Dezember 2013

Beiträge: 7

Hallo zusammen,

sorry für meine späte Antwort.

ich habe mal folgendes gemacht

1
DATENBANK_P=$(cat "$DATEI" '$password' | sed -r "s/.*=[ \t]*[\"'](.*)[\"'][ \t]*;.*$/\1/")

Leider liesst er nun nix mehr aus. Könnt Ihr mir vieleicht sagen warum?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Nee, bei mir klappt's nämlich:

track@lucid:~$ echo "public $password = 'WQzF5fJY&Q-f\\\"bxJY7ZeP7@dnUj;GuZWk7\\\"';"  |  sed -r "s/.*=[ \t]*[\"'](.*)[\"'][ \t]*;.*$/\1/"
WQzF5fJY&Q-f\"bxJY7ZeP7@dnUj;GuZWk7\" 

Eventuell müsstest Du mal gucken, was da vor dem sed ankommt.

Übrigens: warum nimmst Du hier cat und nicht grep, wie oben ?

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13217

toadie78 schrieb:

1
DATENBANK_P=$(cat "$DATEI" '$password' | sed -r "s/.*=[ \t]*[\"'](.*)[\"'][ \t]*;.*$/\1/")

Leider liesst er nun nix mehr aus. Könnt Ihr mir vieleicht sagen warum?

Vielleicht, weil cat '$password' als Dateinamen betrachtet.

Ciao

robert

Antworten |