如何使用 CreateProcess 调用 tshark 将捕获文件转换为 txt
How to call tshark to convert a capture file to txt with CreateProcess
我正在尝试从使用 Visual Studio 编译的 c++ 程序中调用 tshark。有些电话有效,但其他电话无效。我能够开始捕获到文件:
STARTUPINFO startupInfo={sizeof(startupInfo)};
PROCESS_INFORMATION processInfo;
const char * args = " -i \"Ethernet 9\" -w C:\Users\raymond\Documents\Debug\Ethernet_9.cap -b duration:90 -b files:2\"";
CreateProcess("C:\Program Files\Wireshark\tshark.exe", const_cast<char *>(ss.str().c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);
但是我无法将捕获文件转换为文本:
STARTUPINFO startupInfo={sizeof(startupInfo)};
PROCESS_INFORMATION processInfo;
const char * args = " -i - < \"C:\Users\raymond\Documents\Ethernet_9.cap\" > \"C:\Users\raymond\Documents\Ethernet_9.txt";
CreateProcess("C:\Program Files\Wireshark\tshark.exe", const_cast<char *>(ss.str().c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);
打印出来的都是"Capturing on 'Standard input'",但是和运行命令行的命令相反,什么都不输出,也不会打印处理包的数量。
尝试与 system() 类似的操作在同一个 tshark 调用中也有奇怪的行为。
如果我在程序仍在运行时尝试关闭新窗口 运行,则会打印出:
(tshark.exe:8628): CaptureChild-WARNING **: sync_pipe_stop: 强制 child 退出
您使用了错误的标志。 -i -
在标准输入上捕获,其中 -i
在接口上捕获 。要从文件中读取,请像这样使用 -r <file>
:
const char * args = " -r <src file> > <dest file>";
我强烈建议查看 tshark's manpage。
完整示例
在这个例子中,我们创建一个3包捕获,使用tshark创建一个摘要文件,并打印结果。这应该像 tshark
和 >
一样跨平台(Windows、Linux、Macos、BSD 等)。
// example.cpp
#include <iostream>
#include <fstream>
int main() {
system("tshark -w source.pcap -c 3");
system("tshark -r source.pcap > dest.txt");
std::ifstream dest;
dest.open("dest.txt");
std::cout << dest.rdbuf();
dest.close();
return 0;
}
编译后,我们可以看到 tshark 反馈和前几个数据包。
rj$ ./example.o
Capturing on 'Wi-Fi: en0'
3
1 0.000000 172.31.99.198 → resolver1.opendns.com DNS 80 Standard...
2 0.000026 172.31.99.198 → 217.221.186.35.bc.googleusercontent.co...
3 0.000026 172.31.99.198 → ec2-3-231-46-251.compute-1.amazonaws.c...
您不能将重定向操作与 CreateProcess
一起使用 - 重定向由命令处理器 cmd.exe
处理,当您使用 CreateProcess
.
时会绕过它
您可能只想使用 C 中的 system
命令,它使用系统 shell(Windows 上的 cmd.exe
):
system("C:\Program Files\Wireshark\tshark.exe -r \"C:\Users\raymond\Documents\Ethernet_9.cap\" > \"C:\Users\raymond\Documents\Ethernet_9.txt\"");
正如@RossJacobs 还提到的,您需要使用 -r
而不是 -i
来读取文件。
我正在尝试从使用 Visual Studio 编译的 c++ 程序中调用 tshark。有些电话有效,但其他电话无效。我能够开始捕获到文件:
STARTUPINFO startupInfo={sizeof(startupInfo)};
PROCESS_INFORMATION processInfo;
const char * args = " -i \"Ethernet 9\" -w C:\Users\raymond\Documents\Debug\Ethernet_9.cap -b duration:90 -b files:2\"";
CreateProcess("C:\Program Files\Wireshark\tshark.exe", const_cast<char *>(ss.str().c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);
但是我无法将捕获文件转换为文本:
STARTUPINFO startupInfo={sizeof(startupInfo)};
PROCESS_INFORMATION processInfo;
const char * args = " -i - < \"C:\Users\raymond\Documents\Ethernet_9.cap\" > \"C:\Users\raymond\Documents\Ethernet_9.txt";
CreateProcess("C:\Program Files\Wireshark\tshark.exe", const_cast<char *>(ss.str().c_str()), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);
打印出来的都是"Capturing on 'Standard input'",但是和运行命令行的命令相反,什么都不输出,也不会打印处理包的数量。
尝试与 system() 类似的操作在同一个 tshark 调用中也有奇怪的行为。
如果我在程序仍在运行时尝试关闭新窗口 运行,则会打印出: (tshark.exe:8628): CaptureChild-WARNING **: sync_pipe_stop: 强制 child 退出
您使用了错误的标志。 -i -
在标准输入上捕获,其中 -i
在接口上捕获 。要从文件中读取,请像这样使用 -r <file>
:
const char * args = " -r <src file> > <dest file>";
我强烈建议查看 tshark's manpage。
完整示例
在这个例子中,我们创建一个3包捕获,使用tshark创建一个摘要文件,并打印结果。这应该像 tshark
和 >
一样跨平台(Windows、Linux、Macos、BSD 等)。
// example.cpp
#include <iostream>
#include <fstream>
int main() {
system("tshark -w source.pcap -c 3");
system("tshark -r source.pcap > dest.txt");
std::ifstream dest;
dest.open("dest.txt");
std::cout << dest.rdbuf();
dest.close();
return 0;
}
编译后,我们可以看到 tshark 反馈和前几个数据包。
rj$ ./example.o
Capturing on 'Wi-Fi: en0'
3
1 0.000000 172.31.99.198 → resolver1.opendns.com DNS 80 Standard...
2 0.000026 172.31.99.198 → 217.221.186.35.bc.googleusercontent.co...
3 0.000026 172.31.99.198 → ec2-3-231-46-251.compute-1.amazonaws.c...
您不能将重定向操作与 CreateProcess
一起使用 - 重定向由命令处理器 cmd.exe
处理,当您使用 CreateProcess
.
您可能只想使用 C 中的 system
命令,它使用系统 shell(Windows 上的 cmd.exe
):
system("C:\Program Files\Wireshark\tshark.exe -r \"C:\Users\raymond\Documents\Ethernet_9.cap\" > \"C:\Users\raymond\Documents\Ethernet_9.txt\"");
正如@RossJacobs 还提到的,您需要使用 -r
而不是 -i
来读取文件。