4

実行する非常に単純なスクリプトがあります。tcpreplay を呼び出し、ユーザーに何か入力するように求めます。その後、読み取りは read: read error: 0: Resource temporary available で失敗します。

ここにコードがあります

#!/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 を実行した後、ハンドルやパイプをクローズまたはクリアする必要があるかどうか疑問に思っています。

4

3 に答える 3

8

どうやら tcpreplay は標準入力に O_NONBLOCK を設定し、それを削除しません。tcpreplay のバグだと思います。これを回避するには、stdin を /dev/null からリダイレクトして tcpreplay を実行します。このような:

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

追加: この tcpreplay の動作は非対話型シェルのみを壊すことに注意してください。

もう 1 つの追加: あるいは、入力を受け取るために 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
于 2013-05-06T16:16:47.670 に答える