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.
Pozbądź cudzysłowów gdziekolwiek używasz zestawu. Sprawdź moją odpowiedź. –
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. –