我有一個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抱怨無效計數器(與超時命令有關)。
這個腳本是用Perl寫的嗎? 'my $ answer = <$socket>;'上的左/右尖括號是什麼?另外,在shell腳本中,什麼時候它正在終止,因爲你從標準輸入('cat -')接收數據? – Rubens 2013-02-10 01:00:36
是的,測試腳本是用perl編寫的。括號意味着「讀取任何可讀的內容」,即使只讀一個字節,我也會很高興。是的,當測試腳本被殺時,我從stdin中得到了整個事情。 – gege 2013-02-10 01:17:51
對不起,我一定不清楚;我的第二個問題是,你什麼時候在標準輸入流上有終止?如果你沒有收到'EOF',是的,'cat'會被卡住,直到你按Ctrl + c,如你所說。 – Rubens 2013-02-10 15:59:56