EXPECT如何将转义字符解释为命令字符

时间:2010-11-24 00:34:51

标签: linux unix tcl expect

我希望能够传递一个长期的命令。不知怎的,它是一个多命令。首先,这是我的期望脚本


#!/usr/bin/expect -f
set timeout -1
spawn telnet xxx.xxx.xxx.xxx
expect "*?username:*"
send "someusername\r"
expect "*?assword:*"
send "somepassword\r"
# Here's the command I'd like to pass from the command prompt
set command [lindex $argv 0]
send "$command\r"
send "exit\r"

然后我会这样运行这个脚本:

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile"

请注意,我使用“\ n”来启动输入,就好像我正在处理命令,然后再移动到下一个命令。

我知道你可以用“;”分隔命令,但是对于这个特定的练习,我希望能够用“\ r”来解释“\ n”,这样,期望会表现得好像它是这样的:

send "mkdir /usr/local/dir1\r"
send "cd /usr/local/dir1\r"
send "touch testfile\r"

那么问题就变成了如何将“\ n”解释为“\ r”?我试过在参数中加上“\ r”而不是“\ n”,但这不起作用。

感谢您的投入。

2 个答案:

答案 0 :(得分:3)

当我做一个简单的实验时,我发现参数中的\n没有被我的shell(bash)转换成换行符;它仍然是字面意思。您可以通过使用puts打印命令行参数来自行检查,如下所示:

puts [lindex $argv 0]

解决这个问题需要一些工作来分解事物。唉,Tcl的split命令分裂多字符序列(它一次分裂许多不同的字符),所以我们需要一个不同的方法。但是,Tcllib正是我们所需要的:splitx命令。有了这个,我们这样做(基于@ tensaix2j的回答):

#!/usr/bin/expect -f
package require Expect;            # Good practice to put this explicitly
package require textutil::split;   # Part of Tcllib

# ... add your stuff here ...
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] {
    send "$line\r"
    # Wait for response and/or prompt?
}
# ... add your stuff here ...

如果您没有安装Tcllib并配置为与Expect一起使用,您也可以直接从代码中搜索splitx的代码(在线查找here),只要您在内部承认它的许可(标准Tcl许可规则)。

答案 1 :(得分:0)

foreach cmd [ split $command \n ] {
send "$cmd\r\n"
}