2013-07-29 43 views
5

Mam skrypt, którego oczekuję, aby zalogować się do systemu zdalnego i wykonać polecenia. Ten skrypt działa z wyjątkiem podania hasła do konta root. Hasło roota zawiera znak dolara, którego nie mogę dostać do pracy. Oto kod

#!/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" } 

I sprawdzeniu działa to w przypadku dostarczania poświadczeń, których hasła nie zawierają znak dolara, ale nie mogę zmusić go do pracy z konta root. Zawsze generuje błąd przekroczenia limitu czasu Login failed. Password incorrect. Zmiana hasła nie jest opcją. Próbowałem dostarczyć znak \ ucieczki w definicji hasło tak:

set password "Pas\$word" 

i uzyskać takie same wyniki ... jakieś pomysły na to, co robię źle?

Dzięki

EDIT Jak powiedziałem. Próbowałem już uciec od znaku $. Ale do wyjaśnienia, dodałem oświadczenie druku dla hasła gdy skrypt rozpoczyna się w celu sprawdzenia zmienna zawiera hasło poprawnie ... Oto zmiana:

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

Tutaj jest wyjście konsoli:

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

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

Login failed. Password incorrect. 
+0

Pozbądź cudzysłowów gdziekolwiek używasz zestawu. Sprawdź moją odpowiedź. –

+0

Myślę, że 'set password {Pas $ word}' powinno wystarczyć. Uruchom skrypt za pomocą 'expect -d ssh-ls.sh', aby zobaczyć, co dzieje się w tle. –

Odpowiedz

-1

ta powinna zdecydowanie pomóc -

set username root 
set password Pas\$word 

Pozbądź cudzysłowów.

Mam nadzieję, że to pomoże.

+0

Brak ofert daje takie same wyniki, jak w przypadku ofert. 'Logowanie nie powiodło się. Niepoprawne hasło. " – linsek

+0

Należy pamiętać, że bez cudzysłowu hasło jest wyświetlane tak samo na wyświetlaczu konsoli, jak w cudzysłowie. "Używanie hasła: Pas $ word" – linsek

+0

@njozwiak - A co z ustawieniem nazwy użytkownika root? Czy pozbyłeś się tam również cytatów? –

-1

Ostatnio miałem podobny problem. To zadziałało dla mnie:

$ PASS = "pa \ $ \ $ słowo"; somecommand --user uname --password $ PASS

Uwaga Podwójne cudzysłowy i średnik.

+0

1) Twoje rozwiązanie jest dla 'pa $$ word', a nie dla' pas $ word', i 2) z _expect_ musisz dwukrotnie uciec z ciągu: 'pas \\\ $ word' –

3

Nie udało mi się uzyskać tego po prostu uciekając przed znakiem dolara. Miałem szczęście, używając \ x, aby określić wartość szesnastkową dla znaku dolara.

zestaw hasło "Pas \ x24word"

2

Spróbuj ucieczki backslash, czyli

Pas$word 

staje

Pas\\\$word 

Jest to powszechny problem ze skryptów (nawet PHP, Python), w którym sznur staje się niezwyciężony dwukrotnie lub nawet więcej razy!

pełnowymiarową przykład jak używać expect z SFTP, wewnątrz skryptu bash:

#!/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

Znalazłem to pytanie, ponieważ miałem ten sam problem, wiem, że to stare pytanie, ale dla ktokolwiek nadal szuka szybkiego rozwiązania:

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

Słowo $ CorrectedPassword jest następnie akceptowane przez procedurę logowania. Opcja -nocase nie jest potrzebna, ale domyślnie domyślam się, że jest bezpieczniej.

0

miałem podobny problem, gdzie chciałem przekazać nazwę z „$” w scenariusz i oczekują następujące pracował dla mnie

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

Znalazłem prowizoryczne rozwiązanie tego problemu. Jestem pewien, że ten problem został rozwiązany dawno temu, tylko wspomnieć, jak to rozwiązać Mine:

Rzeczywista hasło:
Pas$word

Przypisanie do zmiennej Hasło:
set password {Pas\$word}

W TCL (lub oczekują na swój kod), grupowanie wyrazów w podwójnych nawiasach klamrowych {} wyłącza podstawianie w nawiasach klamrowych, a zatem twoje hasło będzie przechowywane jako: Pas\$word
Teraz na koniec, kiedy wyślesz hasło za pomocą Pas\$word zostanie przetłumaczone jako Pas$word, które jest faktycznym hasłem.

Problem polega na tym, że hasło jest nieznane, na przykład hasło znajduje się w zaszyfrowanym pliku lub musi zostać pobrane jako dane wejściowe użytkownika. Szukałem tego typu przypadków, w których nie wiem, gdzie i ile $ śpiewa w haśle.

0

Użyłem poniżej i pracował dla mnie:

send \"Pas\\\$word\"