2013-07-29 17 views
5

Ich habe ein Expect-Skript, das ich auf einem Remote-System anmelden und Befehle ausführen muss. Dieses Skript funktioniert mit der Ausnahme, dass das Kennwort für das root-Konto angegeben wird. Das root-Passwort enthält ein Dollarzeichen, das ich nicht zur Arbeit bringen kann. Hier ist der Code

#!/usr/bin/expect 
set timeout 3 
set username "root" 
set password "Pas$word" 
set hostname [lindex $argv 0] 
log_user 0 

send_user "\n#####\n# $hostname\n#####\n" 

spawn ssh -q -o StrictHostKeyChecking=no [email protected]$hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 
    "*assword" 
} 

send "$password\r" 

expect { 
    timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1} 
    "*\$ " 
} 

send_user "\nPassword is correct\n" 

expect "$ " { send "ls" } 

ich überprüft haben, das funktioniert, wenn Anmeldeinformationen, deren Kennwörter Bereitstellung nicht das Dollarzeichen enthält, aber ich kann es nicht mit dem Root-Account zu arbeiten. Es erzeugt immer den Timeout-Fehler Login failed. Password incorrect. Das Ändern des Passworts ist keine Option. Ich habe versucht, wie so die \ Escape-Zeichen in der Passwort-Definition zu liefern:

set password "Pas\$word" 

Und ich bekomme die gleichen Ergebnisse ... irgendwelche Ideen, was ich falsch mache?

Dank

EDIT Wie ich schon sagte. Ich habe schon versucht, dem $ -Zeichen zu entkommen. Aber zu klären, habe ich eine print-Anweisung für das Passwort, wenn das Skript die Variable das Passwort enthält korrekt zu verifizieren anläuft ... Hier ist die Änderung:

set password "Pas\$word" 
... 
send_user "\n#####\n# $hostname\n#####\n" 
send_user "Using password: $password\n" 
... 

Hier wird die Konsolenausgabe:

n[email protected]:~$ ./ssh_ls.sh 192.168.5.93 

##### 
# 192.168.5.93 
##### 
Using password: Pas$word 

Login failed. Password incorrect. 
+0

Sie sich von den Zitaten befreien, wo immer Sie Satz verwenden. Kasse meine Antwort. –

+0

Ich würde denken, 'set password {Pas $ word}' sollte ausreichen. Führen Sie Ihr Skript mit 'expect -d ssh-ls.sh' aus, um zu sehen, was im Hintergrund passiert. –

Antwort

-1

Dies sollte auf jeden Fall helfen -

set username root 
set password Pas\$word 

Sie sich von den Zitaten befreien.

Hoffe das hilft.

+0

Kein Anführungszeichen erzeugt die gleichen Ergebnisse wie Anführungszeichen. 'Anmeldung fehlgeschlagen. Password incorrect.' – linsek

+0

Beachten Sie, dass ohne die Anführungszeichen das Kennwort in der Konsolenausgabe genauso angezeigt wird wie in Anführungszeichen. "Using password: Pas $ word" – linsek

+0

@njozwiak - Was ist mit set username root? Hast du die Zitate dort auch losgeworden? –

-1

Ich hatte vor kurzem ein ähnliches Problem. Dies funktionierte für mich:

$ PASS = "pa \ $ \ $ word"; somecommand --user uname --password $ PASS

Beachten Sie doppelte Anführungszeichen und das Semikolon.

+0

1) Deine Lösung ist für 'pa $$ word', nicht für' pas $ word', und 2) mit _expect_ musst du die Zeichenkette zweimal ausschließen: 'pas \\\ $ word' –

3

Ich konnte das nicht funktionieren, indem ich nur dem Dollarzeichen entging. Ich hatte Glück, indem ich mit \ x den hexadezimalen Wert für das Dollarzeichen vorgab.

set password "Pas \ x24word"

2

Versuchen Sie, den Backslash, das heißt

Pas$word 

wird

Pas\\\$word 

Dies ist ein häufiges Problem mit Scripting (auch mit PHP, Python) wo eine Saite zweimal oder noch öfter unmaskiert wird!

Ein ausgewachsenes Beispiel, wie ich expect mit SFTP, in einem Bash-Skript verwenden:

#!/bin/bash 
host=mysftp.dmz 
port=22 
username=john 

/usr/bin/expect <<EOF 
set timeout -1 
spawn sftp -C -oPort=$port [email protected]$host 
expect "password:" 
send "Pas\\\$word\r" 
expect "sftp>" 
send "get data.txt\r" 
expect "sftp>" 
send "bye\r" 
EOF 
0

ich diese Frage gefunden, weil ich hatte das gleiche Problem, ich weiß es eine alte Frage ist aber für jeden, auch noch auf der Suche nach einer schnellen Lösung:

set CorrectedPassword [ string map -nocase { "\$" "\\\$" } $MyPassword ] 

die $ CorrectedPassword wird dann durch die Login-Prozedur akzeptiert. Die -nocase wird nicht benötigt, aber ich finde es sicherer, sie standardmäßig einzuschließen.

0

ich ein ähnliches Problem hatte, wo ich mit „$“ in erwarten Skript und nach arbeitete für mich

filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g') 
2

ich gefunden habe, eine provisorische Lösung für diese passieren wollte filename. Ich bin sicher, das schon vor langer Zeit gelöst Problem, nur zu erwähnen, wie ich meine gelöst:

Actual Passwort:
Pas$word

Assign Variable Passwort:
set password {Pas\$word}

In TCL (oder erwarten in Ihrem Code), Gruppierung Wörter in Doppelstreben {} deaktiviert Substitution innerhalb der geschweiften Klammern, so wird Ihr Passwort gespeichert als: Pas\$word Jetzt am Ende, wenn Sie das Passwort über expectsendenwird als Pas$word übersetzt, was das eigentliche Passwort ist.

Aber das Problem ist, wenn das Passwort unbekannt ist, zum Beispiel, Passwort ist in einer verschlüsselten Datei oder muss als Benutzereingabe genommen werden. Ich suchte nach dieser Art von Fällen, in denen ich nicht weiß, wo und wie viele $ sings im Passwort sind.

0

habe ich unten und es funktionierte für mich:

send \"Pas\\\$word\"