2013-05-06 199 views
1

我有一個非常簡單的腳本來運行。它調用tcpreplay,然後讓用戶輸入一些東西。然後讀取將失敗,讀取:讀取錯誤:0:資源暫時不可用。tcpreplay之後讀取失敗,出現錯誤:0:資源暫時不可用

下面是代碼

#!/bin/bash 

tcpreplay -ieth4 SMTP.pcap 

echo TEST 
read HANDLE 
echo $HANDLE 

,輸出是

[[email protected] 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 

[[email protected] quick_test]# 

我想知道如果我需要關閉或清除任何手柄或管我運行tcpreplay後?

回答

5

顯然tcpreplay在stdin上設置O_NONBLOCK,然後不會刪除它。我會說這是tprep中的一個錯誤。爲了解決它,你可以使用從/ dev/null重定向的stdin運行tcpreplay。像這樣:

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

此外:請注意,此tcpreplay行爲僅打破非交互式shell。

另一個補充:或者,如果您確實需要tcpreplay來接收您的 輸入,您可以編寫一個簡短的程序來重置O_NONBLOCK。像這樣的 (復位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; 
} 

以使其「使復位非塊」,然後把它放在你的路徑並使用這樣的:

tcpreplay -i eth4 SMTP.pcap 
reset-nonblock 
+0

謝謝@spbnick。重置非阻塞適用於此問題。但是第一個使用/dev/null&,這很好。 – 2013-05-06 16:56:39

+0

@ user2355260「tcpreplay spbnick 2013-05-06 17:15:29

+0

我寫了一個運行多個外部進程的bash腳本。我不是哪一個需要管道。在不影響我正在運行的任何程序的情況下,是否有一些提示用戶的簡單方法? – CMCDragonkai 2013-11-10 20:29:38

相關問題