我有一个expect脚本,需要登录到远程系统并执行命令。这个脚本可以正常工作,但无法提供root帐户的密码。root密码包含一个美元符号,我似乎无法让它工作。以下是代码:
#!/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 $username@$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" }
我已经验证了,当提供的凭据密码不包含美元符号时可以工作,但我无法让它在root帐户上运行。它总是会产生“登录失败。密码不正确”超时错误。更改密码不是一个选项。我尝试在密码定义中提供\
转义字符,像这样:
set password "Pas\$word"
我得到了相同的结果...你有什么想法,我错在哪里了吗?
谢谢
编辑 就像我说的,我已经尝试转义$字符。但为了澄清,我添加了一个打印语句,在脚本启动时验证变量是否正确地包含了密码...以下是更改内容:
set password "Pas\$word"
...
send_user "\n#####\n# $hostname\n#####\n"
send_user "Using password: $password\n"
...
这里是控制台输出:
njozwiak@ubuntu:~$ ./ssh_ls.sh 192.168.5.93
#####
# 192.168.5.93
#####
Using password: Pas$word
Login failed. Password incorrect.
set password {Pas$word}
应该足够了。使用expect -d ssh-ls.sh
运行你的脚本,以查看后台发生了什么。 - glenn jackman