2013-02-09 64 views
3

我有一個bash腳本的AIX主機上的跟進,myscript.sh:socat阻斷標準輸入

MODE="$1" 
if [ "$MODE" == "start" ]; then 
    socat -T100 -lf $LOGF -d -d -d -x TCP4-LISTEN:$LISTENINGPORT,bind=$LISTENINGADDR,reuseaddr,fork EXEC:"$0 proxy" & 
    PID=$! 
    echo $PID > $PIDFILE 
    echo "$0 $MODE started (pid=$PID)" 

elif [ "$MODE" == "proxy" ]; then 
    cat - > $TMPFILE 
    # process $TMPFILE before the SSL connection. 
    cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST 
    rm -f $TMPFILE 

一切都很好,當我運行:

$ cat somefile | myscript.sh proxy | xxd 

問題加薪當我連接爲與測試腳本的socat聽者:

my $file = $ARGV[0]; 
my $fsize = -s $file; 
my $socket = IO::Socket::INET->new("127.0.0.1:$port") 
    or die "Couldn't connect to remote host: $!"; 
$socket->autoflush(1); 
binmode($socket); 
open (FILE,$file); 
binmode(FILE); 
my $buffer ; 
while(sysread(FILE, $buffer, $blocksize)) { 
    print $socket $buffer ; 
} 
print "sent\n" ; 
close (FILE) ; 

my $answer = <$socket>; 
if (defined($answer)) { 
    print $answer; # never reached 
print "...\n" ; 
} else { 
    die "connection reset by peer\n"; 
} 

在myscript.sh,就行了塊:

cat - > $TMPFILE 

在測試腳本中,它的塊就行:

my $answer = <$socket>; 

此時,該數據已經由socat監聽器(使用tcpdump選中)接收。

然而,當我的socat超時之前Ctrl鍵 + Ç測試腳本,數據過管子(即,SSL服務器最終接觸)。

我在做什麼錯?

更新: 感謝有關貓和EOF的提示。從目前來看,我已經解決該問題的工作就像這樣:

timeout 0.2 cat -u - > $TMPFILE 2>>/dev/null 
# process $TMPFILE before the SSL connection. 
cat $TMPFILE | socat -T 100 -lf $LOGF -d - OPENSSL:$HOST 

它是醜,而且是浪費0.2秒,我希望能找到一個更好的解決方案。 但它現在完成這項工作。 2 >>/dev/null部分是因爲AIX抱怨無效計數器(與超時命令有關)。

+0

這個腳本是用Perl寫的嗎? 'my $ answer = <$socket>;'上的左/右尖括號是什麼?另外,在shell腳本中,什麼時候它正在終止,因爲你從標準輸入('cat -')接收數據? – Rubens 2013-02-10 01:00:36

+0

是的,測試腳本是用perl編寫的。括號意味着「讀取任何可讀的內容」,即使只讀一個字節,我也會很高興。是的,當測試腳本被殺時,我從stdin中得到了整個事情。 – gege 2013-02-10 01:17:51

+0

對不起,我一定不清楚;我的第二個問題是,你什麼時候在標準輸入流上有終止?如果你沒有收到'EOF',是的,'cat'會被卡住,直到你按Ctrl + c,如你所說。 – Rubens 2013-02-10 15:59:56

回答

1

我首先想到的是,您試圖通過cat -<STDIN>收到的數據中沒有換行。處於缺省行爲狀態的這兩個命令一旦有換行符或文件描述符的緩衝區已滿(在Linux中默認爲4KB),將返回數據。

+0

事實上,沒有換行。這是需要通過SSL傳輸的二進制協議聊天 – gege 2013-02-10 16:41:31

+0

您發送了多少數據?在perl中嘗試'read',長度爲1,在這種情況下,它應該返回非常快。 – 2013-02-10 18:18:27

+0

數據量在0.5k到3k之間變化。你將如何從bash調用「perl read」? – gege 2013-02-10 20:29:23