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

标签 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”,这样,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/

相关文章:

perl - 在单次迭代中提取同一模式第一次出现和最后一次出现之间的所有内容

r - 在 MacBook Pro 上安装 Rcmdr 包时出现 Tcl Tk 库问题

linux - Yocto 自定义层在 mkfs.ext4 之后在 do_rootfs 上运行 Tune2fs

linux - ld 忽略库

MySQL UDF 库安装

unix - select、epoll、kqueue 和 evport 之间的根本区别是什么?

c++ - 在多台机器上分布状态

linux - 将多个 SFTP 命令行转换为单行命令行

c++ - NS [网络模拟器] TCL和C++

tcl - tcl 中是否有类似实用程序的 C 作用域