variable in sed verwenden

E

EmJay67

Grünschnabel
Hallo

nach stundenlangem erfolglosem googeln, kann mir vielleich hier jemand helfen.

Ich lese den PW-String für User James aus der shadow auf einem entferntem Host aus, und schreibe ihn in eine lokale datei. Dann übergebe ich den String mit "read" in die Variable PASS. Zum Schluss ersetze ich in der lokalen shadow den Platzhalter "!" mit dem Wert der Variable $PASS.

Folgendes Script:

#! /bin/bash

NAME=James
ssh root@192.168.1.1 grep james /etc/shadow |awk -F: '{print $2}' > /tmp/pwd
read PASS < /tmp/pwd
echo $PASS
sed "s/$NAME:!/$NAME:$PASS/g" /etc/shadow > /tmp/file3

Doch leider klappt das nicht. Ersetze ich $PASS mit "geheim" funzt alles wunderbar. Zur Kontrolle lasse ich den Wert der Variable $PASS mit echo ausgeben, was auch hinhaut. Es muss also daran liegen das sed den Wert der Variable $PASS nicht verarbeiten kann.

Hoffe ich habe mich verständlich ausgedrückt.

Danke schon mal vorab für alle Hinweise.
 
Zur temporären Datei und read: kennst Command-Substitution?

Naja, und zum sed Ausdruck: enthält dein Passwort Slashes?
Weißt du, was eine sql-Injection ist? Sowas wäre hier halt möglich (eine sed-Injection quasi, hihi), weil die Variable ja von der Bash interpoliert und damit der sed-Code dynamisch generiert wird.
Wär jetzt so meine erste Idee.
 
Nein mit SQL Injection habe bislang noch nichts gemacht.

Das Passwort kann alle mögliche Zeichen beinhalten, da es ja mit ein Hash verschlüsselt ist. Einfach mal nen Bick in /etc/shadow werfen.

Liegt vielleicht daran das Problem?
Wie verarbeitet den sed die Variable? Ersetzt es erst die Variable mit deren Wert und führt dann den Code aus? Das es dann probleme mit all den Sonderzeichen in dem PW-String geben kann, könnte ich mir zumindest vorstellen. Falls es so ist, wie muss ich denn dann den "Ersetzen-String" schreiben, damit er als Text so übernommen wird, wie er in der /etc/shadow steht?

Hier mal der String den ich aus der alten /etc/shadow auslese, und den ich dann genauso in die neue /etc/shadow rein schreiben will
$1$DzTcm0iX$6C2SQi/kbZdeXRHJIBoZk.

Und hier mal die Fehlermeldung die mir sed dann ausgibt:
sed: -e Ausdruck #1, Zeichen 36: unknown option to `s'

Wie muss ich das formatieren, damit es bei regulären Ausdruck keinen Fehler erzeugt?
 
Zuletzt bearbeitet:
Versuchs mal mit einem anderen Trennzeichen bei sed (z.B. ',' '|' oder '#' statt '/'), also
Code:
sed "s,$NAME:!,$NAME:$PASS,g"
Das sollte dann wenigstens das Problem mit dem '/' in deinem o.a. String vermeiden. Im Prinzip musst du ein Zeichen wählen, das überhaupt nicht in der /etc/shadow vorkommen kann.

Gruss ...
 
das war der entscheidende Tipp !!!!
wer lesen kann ist klar im vorteil :rtfm:
wieder mal ein super beispiel wie man sich in ein problem verrennen und keine lösung finden kann. am ende liegts oft nur an so nem kleinen Sch....

vielen Dank floyd62

habe die Slashes durch # ersetzt. Denn # wird meines Wissens nicht bei der Hash Verschlüsselung in /etc/shadow verwendet.

so funktioniert es nun:

printf "Bitte Username eingeben:";
read $NAME
PASS=$(ssh root@192.168.1.1 grep $NAME /etc/shadow | cut -d : -f 2)
sed "s#$NAME:!#"$NAME:$PASS"#" /etc/shadow > /tmp/file3
cp -rp /etc/shadow /etc/shadow.ORIG
cp /tmp/file3 /etc/shadow
 
Zuletzt bearbeitet:

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

MySQL-Abfrage an Variable übergeben

OpenSUSE 12.1: Gnucash startet nicht mehr

sed: Text ersetzen mit variablen

Jaunty + Zend + Gdata + xampp

Zurück
Oben