2013-02-09 5 views
3

У меня есть Баш скрипт, как следовать на AIX хоста, myscript.sh:Сокат блокировки на стандартный ввод

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 слушателя (проверено с ТСРйитр).

Однако, когда я Ctrl + с тестовым скриптом до истечения времени ожидания SOCAT, данные идут через трубу (то есть, сервер 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>;'? Кроме того, в сценарии оболочки, когда он заканчивается, когда вы получаете данные со стандартного ввода ('cat -')? – Rubens

+0

Да, тестовый скрипт написан на perl. Скобки означают «читать все, что можно прочитать», я был бы рад прочитать хотя бы один байт. И да, когда тестовый скрипт убит, я получаю все от stdin. – gege

+0

Извините, я, должно быть, не был чист; мой второй вопрос, когда это у вас есть прекращение на стандартном потоке ввода? Если вы не получите 'EOF', да,' cat' будет застревать в его исполнении - пока вы не нажмете Ctrl + c, как вы сказали. – Rubens

ответ

1

Моя первая мысль заключается в том, что в данных, которые вы пытаетесь получить с помощью cat - или <STDIN>, нет перевода строки. Обе команды в своем поведении по умолчанию возвратят данные после того, как у них будет строка перевода, или их буферы файлового дескриптора заполнены (по умолчанию в Linux - 4 КБ).

+0

Действительно, нет перевода строки. Это бинарный протокол чата, который нужно передавать по SSL – gege

+0

, сколько данных вы отправляете? Попробуйте 'read' в perl, с длиной 1, в этом случае он должен вернуться очень быстро. –

+0

Объем данных варьируется от 0,5 до 3 тыс. Как бы вы нарисовали «perl read» от bash? – gege

Смежные вопросы