LINUX.ORG.RU

прочитать пары «PROTOCOL PORT» из файла построчно


0

0

А как можно прочитать последовательно из файла пары PROTOCOL PORT, которые записаны построчно (в каждой строчке одна пара)? К примеру, TCP 21 UDP 53 UDP 2323

Как теперь в шелле можно прочитать протокол и порт в отдельные переменные? В скрипте типа

for DPORT in `cat $file | awk '{print $1 $2}'`; do ... done

в $DPORT попадают оба поля и непонятно как их разделить, так как внутри цикла их надо использовать в команде iptables -p $proto --dport $port

anonymous

Re: прочитать пары "PROTOCOL PORT" из файла построчно

for i in 'TCP 21' 'UDP 53' 'UDP 2323'; do 
    eval `echo $i | awk '{print "iptables -p ",  $1, " --dport ", $2}'`;  done

anonymous ()

Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

Спасибо, но у меня в файле намного больше пар протокол-порт, да и не хотелось бы вводить их все внутрь скрипта, так как в отдельном файле проще проводить добавления и замены.

Возможно ли осуществить вводи информации из файла?

anonymous ()

Re: Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

Надо больше думать самому :) Спасибо за совет, получилось:

for DPORT in "`cat $file | awk '{print $1, " ", $2}'`";

do eval `echo $DPORT | awk '{print "iptables -p ", $1, " --dport ", $2}'`; done

anonymous ()

Re: прочитать пары "PROTOCOL PORT" из файла построчно

cat file | xargs -n2 ./your_script

а в your_script делаешь то что нужно с $1 и $2

dilmah ★★★★★ ()

Re: прочитать пары "PROTOCOL PORT" из файла построчно

Проще всего скрипт сделать полностью на Перл. Заготовка:

open (FL, "./ports.txt");
while (defined($line=<FL>)) {
chomp($line);
@array =split(/ /, $line);
$return=`iptables -p $array[0] --dport $array[1]`;
}
close (FL);

anonymous ()

Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

Не хотелось бы привлекать дополнительные скрипты..

Блин, что то я неправильно делаю, написанный мною выше способ не работает, не работает и вот этот, хотя уже не знаю, почему:

$ echo $SHELL /bin/bash

$ cat aaa TCP 21 TCP 80 UDP 53

$ cat script #!/bin/bash for DPORT in `cat $FILE | awk 'ORS="";OFS="";{print " \"",$1," ",$2,"\""}'`; echo $DPORT; #echo `echo $DPORT | awk '{print "iptables -p ", $1, " --dport ", $2}'`; done

$ FILE="aaa" $ ./script "TCP 21" "TCP 80" "UDP 53"

хотя если запустить само выражение, читающее строки из файла, то оно делает все верно: $ cat $FILE | awk 'ORS="";OFS="";{print " \"",$1," ",$2,"\""}'` "TCP 21" "TCP 80" "UDP 53" (без \n в конце)

почему же при запуске из исполняемого файла данные в кавычках все равно делятся по пробелам, ведь не должны они разделятся (то, что заключено в кавычки)?

anonymous ()

Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

Не хотелось бы привлекать дополнительные скрипты..

Блин, что то я неправильно делаю, написанный мною выше способ не работает, не работает и вот этот, хотя уже не знаю, почему:

$ echo $SHELL
/bin/bash

$ cat aaa
TCP 21
TCP 80
UDP 53

$ cat script
#!/bin/bash
for DPORT in `cat $FILE | awk 'ORS="";OFS="";{print " \"",$1," ",$2,"\""}'`;
echo $DPORT;
#echo `echo $DPORT | awk '{print "iptables -p ",  $1, " --dport ", $2}'`;
done


$ FILE="aaa"
$ ./script
"TCP
21"
"TCP
80"
"UDP
53"

хотя если запустить само выражение, читающее строки из файла, то оно делает все верно:
$ cat $FILE | awk 'ORS="";OFS="";{print " \"",$1," ",$2,"\""}'`
"TCP 21" "TCP 80" "UDP 53"
(без \n в конце)

почему же при запуске из исполняемого файла данные в кавычках все равно делятся по пробелам, ведь не должны они разделятся (то, что заключено в кавычки)?

anonymous ()

Re: Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

На perl то оно все ясно и понятно :)

Но в скрипте куча выховов внешних программ (это rc.firewall), придется заключать каждую из них в обратные кавычки. Не удобно, в общем.

Да и на обычном шелле это должно же реализовыватсья как то, вот только как...

anonymous ()

Re: Re: Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

Дело конечно Ваше насчет прицепляния к шеллу...
Но вот подумайте что такое Перл?
Это всего лишь очень развитый и удобный шелл!
"Никакой разницы, так зачем же платить дороже ...?" :)
В шеле Вам придется в два-три раза больше вызывать внешних программ
типа cat, awk, промежуточный_скрипт и тд. Писать в пятьраз больше текста.

anonymous ()

Re: прочитать пары "PROTOCOL PORT" из файла построчно

Короче самое верное решение - УПРОСТИТЬ
Создать с помощью MS Excel два отдельных текстовых файла с номерами портов один - TCP, а другой - UDP
Там только будут числа с портами. И юзай свой замечательный скпирт два раза.

anonymous ()

Re: Re: Re: Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

> о вот подумайте что такое Перл?

Очень хороший язык с очень тяжелым интертрепатором.

> В шеле Вам придется в два-три раза больше вызывать внешних программ

Децкая боязнь форка?

anonymous ()

Re: Re: прочитать пары "PROTOCOL PORT" из файла построчно

OLDIFS=$IFS
IFS=$'\n'
for line in `cat`; do
        do_it `echo $line | sed -e 's/[ \t]\+/\n/g'`
done
IFS=$OLDIFS

Вызывает do_it с параметрами, заданными в строках stdin.
Параметры разделяются произвольным числом и комбинациями
пробелов и табуляций.

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