【发布时间】:2013-07-29 12:47:18
【问题描述】:
我有一个期望脚本,我需要登录到远程系统并执行命令。除了向 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 帐户一起使用。它总是产生Login failed. Password incorrect 超时错误。更改密码不是一种选择。我试图在密码定义中提供\ 转义字符,如下所示:
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 的任何地方都去掉引号。查看我的答案。
-
我认为
set password {Pas$word}应该足够了。使用expect -d ssh-ls.sh运行您的脚本,看看后台发生了什么。
标签: bash authentication ssh expect remote-server