我希望能够传递一个长期的命令。不知怎的,它是一个多命令。首先,这是我的期望脚本
#!/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”,但这不起作用。
感谢您的投入。
答案 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"
}