我正在自动完成一些需要在某些.pcap文件上调用tcpdump -nn -tt -r
的工作。
要做到这一点,我使用以下tcl代码:
set magic_dir "results/pcap/";
set magic_filename "data"
set magic_node_count 16
set magic_command "tcpdump"
for {set i 0} {$i <= $magic_node_count} {incr i} \
{
set filename "${magic_dir}${magic_filename}-${i}-0.pcap"
if {[file exists $filename]} \
{
set dest_dir "${magic_dir}\.\./tmp/tmp_${i}"
exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir}
} \
}
这可行(第一个文件被转换)但tcl报告该行中的错误。
当我尝试使用grep时,在脚本中稍后会发生同样的事情。我通过使用catch
来避免这种情况,但我想知道如何正确使用此命令。
答案 0 :(得分:2)
默认情况下,如果
,Tcl的exec
会生成错误
在这两个中,您几乎必须使用catch
(或Tcl 8.6中的try
/ trap
)处理第一个问题,因为这几乎总是一个真正的错误。 (或者不是; grep
是一个经典问题。)但是使用标准错误处理,你有更多选择(假设你是using 8.5)。
例如,您可以重定向到终端:
exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>/dev/tty
或正常的标准错误频道:
exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@stderr
或者你可以告诉Tcl扔掉它:
exec -ignorestderr ${magic_command} -nn -tt -r ${filename} > ${dest_dir}
甚至将其组合成标准输出:
exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@1
通过引入额外的管道(例如,使用8.6 chan pipe
或通过外部cat -u
处理棘手)可以获得更多异国情调但是开始让真正复杂快速。既然你正在自动化tcpdump,你可能最好只将所有东西合二为一并使用它。或者使用Expect包的相当大的功能和复杂性。