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

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

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

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

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

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

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

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

anonymous
()

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

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

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

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

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

$ 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
()
Ответ на: комментарий от anonymous

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

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

$ 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
()
Ответ на: комментарий от anonymous

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

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

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

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

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

anonymous
()

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

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

> Короче самое верное решение - УПРОСТИТЬ
> Создать с помощью MS Excel...
Мда. Это упрощение, так упрощение.

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

#!/bin/bash

OLDIFS=IFS
IFS="\n"

for DPORT in `cat $FILE`;
do
    echo $DPORT
    #echo `echo $DPORT | awk '{print "iptables -p ",  $1, " --dport ", $2}'`;
done

IFS=IFS


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

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

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

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

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

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

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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.