期望脚本 - 发送字符串所需的引号与expect所需的引号冲突

时间:2016-08-30 23:25:03

标签: linux bash expect

我正在尝试使用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""

我做错了什么?

2 个答案:

答案 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)

这很简单:

  1. 创建密码变量: set password {etdgsfdh$}

  2. 然后将密码发送到系统: send "CHANGEUSERPASSWORD $username PASSWORD ${password}\r"

这对我有用。