作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我希望能够传递一个很长的命令来期待。不知何故这是一个多重命令。首先是我的期望脚本
#!/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”,这样,expect 的行为就好像是这样的:
send "mkdir /usr/local/dir1\r"
send "cd /usr/local/dir1\r"
send "touch testfile\r"
那么问题就变成了如何将“\n”解释为“\r”?我试过在参数中使用“\r”而不是“\n”,但这不起作用。
感谢您的输入。
最佳答案
当我做一个简单的实验时,我发现参数中的 \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 许可规则)。
关于linux - EXPECT 如何将转义字符解释为命令字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262472/
我是一名优秀的程序员,十分优秀!