LINUX.ORG.RU

передать перл скрипту переменную телнетом.


0

0

Привет всем. Суть задачи такая: перловому скрипту на вход (пока через STDIN) приходит переменная в определенном формате, которая затем им распарсивается и на основе ее данных запускаются шейпера (tc) с указанными в этой переменной параметрами. Локально запущенный скрипт работает, но основная проблема в том, что эта переменная должна приходить с удаленного хоста. Я прописал запуск скрипта в сервисах xinetd на определенном порту. Хожу на этот порт, скрипт ожидает ввода и чтобы я ни ввел, он вылетает, потому что переменная оказывается пустой. Мне казалось, что в данном варианте это должнео быть равносильно <STDIN>. Помогите решить проблему. Это моя первая программа на перле и не хочется бросать и метаться, когда почти все сделано.. Спасибо!

anonymous

В такой комплектации у меня все работает из xinetd точно так же,
как из командной строки:

$ cat /home/Onanim/test.pl 
#!/usr/bin/perl

use warnings;
use strict;

use IO::Handle;

open(LOG, '>>/tmp/test.pl.log')  or die "cannot open: $!\n";
LOG->autoflush(1);
 
while (<STDIN>) {
    tr/\r\n//d;
    print LOG ">>>$_<<<\n";
}
$
$
$ cat /etc/xinetd.d/test 
service test
{
    type                = UNLISTED
    socket_type         = stream
    protocol            = tcp
    wait                = no
    server              = /home/Onanim/test.pl
    port                = 12345
    user                = root
    disable             = no
}
$

Так что давай скрипт показывай.

HTH


Onanim
()

>Хожу на этот порт, скрипт ожидает ввода и чтобы я ни ввел, он вылетает, потому что переменная оказывается пустой.

Вроде телнет в начале согласовывает параметры терминала, соответственно скрипт в начале получит не вашу строку, а служебную информацию, поэтом если нужно просто передать строку в tcp-соединение, то лучше использовать nc.

mky ★★★★★
()
Ответ на: комментарий от Onanim

vot kusok skripta;

#!/usr/bin/perl

use strict;
use Log::Handler;

#Параметр передаем через ключи ком.строки, иначе ожидаем с STDIN (таймаут 20 сек).
if (!$ARGV[0]) {
vec(my $rin = '',fileno(STDIN),1) = 1;
    if ( select($rin,undef,undef,20) ) {
    $value =<STDIN>;chomp $value;
} else {
    print "Timeout\n";
    exit;
}
} else {
$value=$ARGV[0];
}

print ("your variable is: $value");
exit;

anonymous
()
Ответ на: комментарий от PoMbl4

#!/usr/bin/perl
use warnings;
use strict;

vec(my $rin = '',fileno(STDIN),1) = 1;

if ( select($rin,undef,undef,5) ) {
    my $value = <STDIN>;
    $value =~ s/\r\n//; #удаляем \r\n
    print `ls` if ($value eq 'ls'); #выводим результат некоторых команд
    print `date` if ($value eq 'date'); #^
} else {
    print "Timeout\n";
}
exit 0;

PoMbl4
()
Ответ на: комментарий от mky

> Вроде телнет в начале согласовывает параметры терминала,
> соответственно скрипт в начале получит не вашу строку, а служебную
> информацию, поэтом если нужно просто передать строку в tcp-
> соединение, то лучше использовать nc.

Обычно

- When connecting to a non-standard port, telnet omits any
- automatic initiation of TELNET options.
-

(from man telnet).

Onanim
()
Ответ на: комментарий от PoMbl4

$value =~ s/\r\n//; #удаляем \r\n
Помогла эта строчка.
Если писать просто chomp $value то не помогает.
Так что теперь все работает!
Спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.