LINUX.ORG.RU

Вывод awk в несколько строк.


0

1

Добрый день. Поднаписал правило для фаервола (вход по белом списку IP+MAC)

W_FILE=/etc/lists/whitelist.conf
R_FILE=/etc/lists/rules
awk '{
printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n";
printf "iptables        -A input_rule      -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n";
printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n";
printf "iptables        -A input_rule      -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n"
}' $W_FILE | sed '/#/d' > $R_FILE
$R_FILE
Как сделать что бы awk передавал данные переменной в нормальном виде -несколько строк, а не все в одну строку. Я сделал вывод в файл (в файл выводит нормально), а потом брать из файла.

Если просто WHITELIST=`awk........ $WHITELIST - все валит в одну строку.

И еще как сделать фильтр по #. ? А то я сделал | sed '/#/d' :-) но работает. Думал еще что-то типа W_FILE=$(sed 's/#.*//' /etc/lists/whitelist.conf)



Последнее исправление: EXSHL (всего исправлений: 1)

~ > var=`echo -e '1\n2\n3'`
~ > echo $var
1 2 3
~ > IFS='\n'
~ > echo $var
1
2
3

И еще как сделать фильтр по #. ?

grep

GotF ★★★★★
()

Как сделать что бы awk передавал данные переменной в нормальном виде -несколько строк

Он и передаёт.

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

Спасибо большое. пробую. grep почти тоже что и с sed. Я думал может в самом awk както можно указать фильтр.

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

Я думал может в самом awk както можно указать фильтр.

Так и надо, например /#/ { next } в начало.

BTW, почему не iptables-restore? (в смысле ему на врод кинуть, только printf переделать немного).

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

В моем случае если [code] WHITELIST=`awk '{ printf «iptables -t nat -A prerouting_rule -m mac --mac-source » $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; printf «iptables -A input_rule -m mac --mac-source » $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; printf «iptables -t nat -A prerouting_rule -m mac --mac-source » $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n"; printf «iptables -A input_rule -m mac --mac-source » $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n" }' /etc/lists/whitelist.conf` $WHITELIST - тут будет все в одной строке вместо \n будут просто пробелы, фаервол не воспринимает :-) [/code]

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

Это был намек на то, что вывод в строку стыкует не awk. awk делает здесь всё правильно ;)
Погугли на счет IFS и хранения данных в переменных bash.

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

с restore чот не выполняется правило вообще.

iptables-save -> посмотреть в каком формате (там немного по-другому) -> привести в такой же

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

-A i put_rule точнее заменило на пробел, наверно в самом awk надо указать символ новой строки другой не \n

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

!/#/ :) спасибо, чот неподумал про условие

EXSHL
() автор топика
Ответ на: комментарий от malices_gossips

Подскажите, пожалуйста, как теперь в awk заменить символ новой строки \n ? пробовал awk -v FS=«@» и {FS=«@»} не получается

а то IFS заменяет буквы n

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

возми переменную в двойные кавычки, те, например:

$ var=`echo -e '1\n2\n3'`
$ echo $var
1 2 3
$ echo «$var»
1
2
3
$ IFS=$'\t'
$ echo $var
1
2
3
либо установи IFS как другой набор символов (у меня в примере \t)

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

Как-то странно. Если в firewall.user прописываю

f=/etc/lists/rules 
a=`awk '!/#/ { printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; 
printf "iptables -A input_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; 
printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n"; 
printf "iptables -A input_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n" }' /etc/lists/whitelist.conf`

IFS=$'\t' 
echo $a > $f
 $f 
тоесть через эхо в файл, работает нормально, а если
a=`awk '!/#/ { printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; 
printf "iptables -A input_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 22 -j ACCEPT\n"; 
printf "iptables -t nat -A prerouting_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n"; 
printf "iptables -A input_rule -m mac --mac-source " $2 " -s " $1 " -p tcp --dport 80 -j ACCEPT\n" }' /etc/lists/whitelist.conf`

IFS=$'\t' 
$a 
Выдает ошибку «/etc/rc.common: /etc/firewall.user iptables...... File name too long» Я так понял правило получается слишком задлинное чтоли. Хотя смотрел вроде нормальное. Раз выводит в файл через эхо, а потом считывает с него и работает нормально.

EXSHL
() автор топика
Ответ на: комментарий от ananas

ananas спасибо работает eval$()
вместе с IFS :)

EXSHL
() автор топика
Ответ на: комментарий от sdio

Я так и не понял для чего здесь awk

/etc/lists/whitelist.conf в любом случае чем-то парсить надо. и awk тут ничем не хуже какого-нибудь while read

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

В данном случае awk используется через жопу. Парсить надо, пусть парсит и отдает удобоваримый вывод в shell'овский while, команды iptables исполнять сразу, а не через пенеменную и eval

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

Нееее. Я не дебилойд как ты - хер дверью щемить.

Думал серьёзный форум. А долбаёбов и тут хватает.

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

А долбаёбов и тут хватает.

Дома сиди, таблетки пей.

sdio ★★★★★
()
Ответ на: комментарий от EXSHL
perl -e '
exit(1) if !open(my $h, "<", "/etc/lists/whitelist.conf");
my @ip_mac = ( );
while (my ($l) = split(/[\r\n]+/s, <$h>)) {
 next if $l !~ /^\s*((\d+\.){3}\d+)\s+(([\da-fA-F]{2}:){5}[\da-fA-F]{2})/;
 push @ip_mac, [ $3, $1 ];
};
close($h);
my %tm = qw{ filter INPUT nat PREROUTING };
foreach my $t (qw{ filter nat }) {
 my $ln = lc($tm{$t});
 print "\*$t\n:", $tm{$t}, q{ [0:0]}, "\n:",
  ${{ filter => "FORWARD", nat => "POSTROUTING" }}{$t}, q{ [0:0]},
  "\n:OUTPUT ACCEPT \[0:0\]\n", "-A ", $tm{$t},
  " -j ", $ln, "_rule\n";
 map { print sprintf(q{-A } . $ln . q{_rule -m mac --mac-source %s -s %s -p tcp --dport 22 -j ACCEPT}
   . "\n-A " . $ln . q{_rule -m mac --mac-source %s -s %s -p tcp --dport 80 -j ACCEPT} . "\n",
   @{$_}, @{$_}) } @ip_mac;
 print "COMMIT\n";
};
' | iptables-restore

Как-то так. Я, правда, не понял строк для nat'а.

berrywizard ★★★★★
()
Ответ на: комментарий от sdio
sed '/#/d' /etc/lists/whitelist.conf | while read MAC IP; do
iptables ... -m mac --mac-source $MAC  ... -s $IP ...
done

Ну и ? В чем существенная разница ? Чел хотел конкретно с awk. Читай название темы, вникай в суть, не делай поспешный решений.

p.s. «Поспешить - блядей насмешить» (с) н. мудрость

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

Если ты не понял, это еще не значит, что я должен тебе что-то объяснять.

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