gpt4 book ai didi

bash - tcpreplay 后读取失败,错误为 : 0: Resource temporarily unavailabl

转载 作者:行者123 更新时间:2023-11-29 09:36:51 31 4
gpt4 key购买 nike

我有一个非常简单的脚本要运行。它调用 tcpreplay 然后要求用户输入一些东西。然后读取将失败并读取:读取错误:0:资源暂时不可用。

这是代码

#!/bin/bash

tcpreplay -ieth4 SMTP.pcap

echo TEST
read HANDLE
echo $HANDLE

输出是

[root@vse1 quick_test]# ./test.sh 
sending out eth4
processing file: SMTP.pcap
Actual: 28 packets (4380 bytes) sent in 0.53 seconds. Rated: 8264.2 bps, 0.06 Mbps, 52.83 pps
Statistics for network device: eth4
Attempted packets: 28
Successful packets: 28
Failed packets: 0
Retried packets (ENOBUFS): 0
Retried packets (EAGAIN): 0
TEST
./test.sh: line 6: read: read error: 0: Resource temporarily unavailable

[root@vse1 quick_test]#

我想知道在运行 tcpreplay 后是否需要关闭或清除任何句柄或管道?

最佳答案

显然 tcpreplay 在 stdin 上设置了 O_NONBLOCK 然后没有删除它。我会说这是 tcpreplay 中的错误。要解决这个问题,您可以使用从/dev/null 重定向的标准输入运行 tcpreplay。像这样:

tcpreplay -i eth4 SMTP.pcap </dev/null

补充:请注意,此 tcpreplay 行为只会破坏非交互式 shell。

另一个补充:或者,如果你真的需要 tcpreplay 来接收你的输入您可以编写一个重置 O_NONBLOCK 的简短程序。像这个(reset-nonblock.c):

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int
main()
{
if (fcntl(STDIN_FILENO, F_SETFL,
fcntl(STDIN_FILENO, F_GETFL) & ~O_NONBLOCK) < 0) {
perror(NULL);
return 1;
}
return 0;
}

使用“make reset-nonblock”创建它,然后将其放入您的 PATH 中并像这样使用:

tcpreplay -i eth4 SMTP.pcap
reset-nonblock

关于bash - tcpreplay 后读取失败,错误为 : 0: Resource temporarily unavailabl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16402363/

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