我正在尝试使用expect远程登录服务器更改用户密码。如果要更改的密码包含引用的特殊字符,则应用程序要求该应用程序。问题是,期望发送语句也需要引用,当我尝试将两者结合时,脚本失败。如果我从密码周围删除引号并且不使用特殊字符,则运行正常。
send "CHANGEUSERPASSWORD $username PASSWORD "etdgsfdh$"\r"
如果我使用上面的那行并运行我得到的脚本
extra characters after close-quote
while executing
"send "CHANGEUSERPASSWORD $username PASSWORD "e"
此外,它似乎不喜欢$字符,因为我可以将@附加到密码的末尾,而不用引号括起来,脚本运行正常。如何使用包含$的密码来使用它,这需要我将其包装在引号中,然后显然与期望引用冲突?请注意,$可以是密码中的任何位置,而不仅仅是在我的示例中。
这是我完整的上下文脚本:
#!/usr/bin/expect -f
set password [lindex $argv 0];
spawn telnet 192.168.100.100 106
expect "200 PWD Server ready"
send "USER user\r"
expect "300 please send the PASS"
send "PASS pass\r"
expect "200 login OK, proceed"
send "CHANGEUSERPASSWORD $username PASSWORD "etdgsfdh$"\r"
expect "200 OK"
send "quit\r"
interact
我还尝试使用以下行将密码设置为变量:
set password [lindex $argv 0];
改变这一行:
send "CHANGEACCOUNTPASSWORD user PASSWORD $password;" send "\r"
然后我跑
./script password
我收到此错误:
usage: send [args] string
while executing
"send "CHANGEUSERPASSWORD user PASSWORD $password;" send "\r""
我做错了什么?
答案 0 :(得分:2)
您可以简单地转义内部引号
send "CHANGEUSERPASSWORD $username PASSWORD \"etdgsfdh$\"\r"
请注意,$
仅在其后跟有效变量名称(可能在大括号中)时才是特殊的 - 请参阅http://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm#M12
我假设你引用了密码,因为远程系统需要引用密码。要回答你的问题,你可以这样做:
lassign $argv username passwd # grab the command line arguments
...
send "CHANGEUSERPASSWORD $username PASSWORD \"$passwd\"\r"
如果远程系统不需要文字引号,那么只需
send "CHANGEUSERPASSWORD $username PASSWORD $passwd\r"
答案 1 :(得分:1)
这很简单:
创建密码变量:
set password {etdgsfdh$}
然后将密码发送到系统:
send "CHANGEUSERPASSWORD $username PASSWORD ${password}\r"
这对我有用。