解析来自expect命令的信息

时间:2013-11-07 10:30:36

标签: linux ssh tcl expect

我需要从telnet/ssh命令解析结果数据并对数据进行操作。

作为示例,我想与一个spawn会话(此处为ssh)进行交互,列出当前目录中的文件并仅收集某个扩展名的文件以便稍后执行命令那些文件。

到目前为止我得到了什么:

#!/usr/bin/expect

set timeout 3
match_max 10000
set prompt {$ }

spawn ssh $user@$host
expect "password: "
send $pw\r
expect $prompt

# here's the command I need to parse resulting data
send "ls -1\r"
expect -re {(.*)\.log} {
    set val $expect_out(1,string)
    puts "LOG file: $val"
    exp_continue
}

该脚本打开ssh会话,发送命令并在当前目录(日志和其他)中显示全部文件,但我需要处理与给定模式匹配的每个文件,如何我可以这样做吗?

脚本输出:

$  DATA: 
0_system.log
1_system.log
2_system.log
3_system.log
a.log
a.sh
blah
b.sh
data.csv

2 个答案:

答案 0 :(得分:1)

首先......不会ls -1 *.log更容易,并且可以做到这一点吗?

那就是说,我发现通常你在使用(.*)时必须非常小心,它有时会产生意想不到的结果。

我会选择“任何字母数字字符加下划线”(如果适用于您的文件名) - 请参阅下面的建议预期块。此外,请注意,使用$expect_out(1,string)您只保存文件名,而不使用扩展程序 - 不确定这是否是您想要的。如果你想要整个事情,$expect_out(0,string)是这种情况下的方法。

这样做:

expect -re "(\[a-zA-Z0-9_\]*)\.log" {
    set val $expect_out(1,string)
    puts "LOG file: $val"
    exp_continue
}

希望有所帮助! 詹姆斯

答案 1 :(得分:0)

更正期望可能应该是:

expect {
    -re {(.*)\.log} {
        set val $expect_out(1,string)
        puts "LOG file: $val"
        exp_continue;
    }
}