У меня есть Баш скрипт, как следовать на 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 жалуется на недопустимый счетчик (связанный с командой таймаута).
Этот сценарий написан на Perl? Каковы угловые скобки влево/вправо для 'my $ answer = <$socket>;'? Кроме того, в сценарии оболочки, когда он заканчивается, когда вы получаете данные со стандартного ввода ('cat -')? – Rubens
Да, тестовый скрипт написан на perl. Скобки означают «читать все, что можно прочитать», я был бы рад прочитать хотя бы один байт. И да, когда тестовый скрипт убит, я получаю все от stdin. – gege
Извините, я, должно быть, не был чист; мой второй вопрос, когда это у вас есть прекращение на стандартном потоке ввода? Если вы не получите 'EOF', да,' cat' будет застревать в его исполнении - пока вы не нажмете Ctrl + c, как вы сказали. – Rubens