gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:11 26 4
gpt4 key购买 nike

我希望能够传递一个很长的命令来期待。不知何故这是一个多重命令。首先是我的期望脚本


#!/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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com