LINUX.ORG.RU

Сообщения Aidjek

 

тупим вместе с sed

Всех приветствую.

Есть такая не сложная задача:

 
Из такого вывода:

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp
Destination            Cookies                           Created
89.208.102.86.500      d0a641ed0aa7bfe9:7ae3428b08fab146 2013-02-04 15:32:18

вытащить только IP и дату (можно отдельными запросами)

Написал такой не сложный велосипед, но ничего не получается с датой:

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/p'
89.208.102.86

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\}\  \([0-9]\{2\}:\)\{2\}[0-9]\{2\}\)$/\2/p'
[root@localhost:~]# 

подскажите пожалуйста, где накосячил ? (конец рабочего дня, плохо соображаю ...)

ещё знаю что кучу экранировании скобок \(\) и \{\} можно упростить с помощью флага -r, было бы приятно увидеть насколько правильнее...

Заранее спасибо.

 ,

Aidjek
()

сравнение 2-х строк, инверсных относительно пробела.

Всех приветствую.

Есть такой вопрос, имеется вывод информации для VPN туннеля в таком виде:

[root@localhost:~]# setkey -D
82.113.11.226 10.18.1.201
        esp mode=tunnel spi=143937423(0x08944f8f) reqid=0(0x00000000)
        E: 3des-cbc  c114543c 3049e8b8 c033e4ea 07e0054e 3e8ac254 f0dbb7f5
        A: hmac-md5  8461e21b 2318bb9c 352bee1d e24a0a53
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 09:52:41 2013   current: Jan 28 09:56:58 2013
        diff: 257(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 28 09:52:49 2013      hard: 0(s)      soft: 0(s)
        current: 852(bytes)     hard: 0(bytes)  soft: 0(bytes)
        allocated: 11   hard: 0 soft: 0
        sadb_seq=1 pid=12264 refcnt=0
10.18.1.201 82.113.11.226
        esp mode=tunnel spi=3053715472(0xb6040010) reqid=0(0x00000000)
        E: 3des-cbc  28c87550 a6c9a17b 37ad0b02 03567617 79647aeb 644563d8
        A: hmac-md5  0ef83de9 1b279a16 658eb176 dad37d50
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 09:52:41 2013   current: Jan 28 09:56:58 2013
        diff: 257(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 28 09:52:41 2013      hard: 0(s)      soft: 0(s)
        current: 1524(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 19   hard: 0 soft: 0
        sadb_seq=0 pid=12264 refcnt=0

Хочу вытащить информацию о присутствии линий с ip адресами и сравнить если правая часть первой строки равно левой части второй строки, разделённой пробелом и с точностью до наоборот. Пока получилось только такое:

[root@localhost:~]# setkey -D | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p'
82.113.11.226 10.18.1.201
10.18.1.201 82.113.11.226 

Т.е. строки можно сказать инверсионные относительно пробела. Может есть какой то красивый велосипед на sed или awk чтобы это сделать ?

Думал сделать через while read line, но понял, что в цикле у меня будет происходить взаимная подмена переменных перед их сравнением, поэтому буду признателен за любую помощь в этом велосипедике.

 , , , setkey

Aidjek
()

sed и замена выражения между фигурными скобками

Всех приветствую!

есть такой файл

cat 123
# Starting MAC address (1)
        90, 20, {0x01,0x00} \
# MAC address (C00)
        50, 8, {0x00,0x0C}

#==========================================================


Хочу через sed в определённой строке, поменять выражение между фигурными скобками на какое то другое, причем хочу сделать это по шаблону.

Набросал пару вариантов и поискал в сети, но пока не получилось:

кустарный вариант
[root@localhost:~]# sed -r '/90, 20, {/s/^([^{]*{)(*.)(}\ .*)$/\1olo\3/' 123
sed: bad regex '90, 20, {': Unmatched \{

исправил regexp, но хочется оставить {
[root@localhost:~]# sed -r '/90, 20, /s/^([^{]*{)(*.)(}\ .*)$/\1olo\3/' 123
sed: bad regex '^([^{]*{)(*.)(}\ .*)$': Invalid content of \{\}

вроде так сработало
[root@localhost:~]# sed -r '/90, 20, \{/s/^([^{]*{)(*.)(}\ .*)$/\1olo\3/' 123
sed: bad regex '^([^{]*{)(*.)(}\ .*)$': Invalid content of \{\}

решил подшаманить regexp, но поменял разделитель
[root@localhost:~]# sed -r '/90, 20, /s!^([^{]*{)(*.)(}\ .*)$!\1olo\3!' 123
sed: bad regex '^([^{]*{)(*.)(}\ .*)$': Invalid content of \{\}


убрал -r , но кажется перестали работать группы:
[root@localhost:~]# sed '/90, 20, /s!^([^{]*{)(*.)(}\ .*)$!\1olo\3!' 123
# Starting MAC address (1)
        90, 20, {0x01,0x00} \
# MAC address (C00)
        50, 8, {0x00,0x0C}

#==========================================================

попробовал экранировать { и } и вернулся к тому с чего начал, шаманил с 3 матч группой
[root@localhost:~]# sed -r '/90, 20, /s!^([^\{]*{)(*.)(\}[^\}]*)$!\1olo\3!' 123
sed: bad regex '^([^\{]*{)(*.)(\}[^\}]*)$': Invalid content of \{\}

без -r  что то сделала, но тоже не так как надо

[root@localhost:~]# sed '/90, 20, /s!^([^\{]*{)(*.)(\}[^\}]*)$!\1olo\3!' 123
# Starting MAC address (1)
        90, 20, {0x01,0x00} \
# MAC address (C00)
        50, 8, {0x00,0x0C}

#==========================================================

Уже грешу на сам sed, он у меня идёт вместе с busybox

sed --version
This is not GNU sed version 4.0

может кто то подскажет куда рыть ?

 , ,

Aidjek
()

awk и Sed от regexp до конца файла.

Всех приветствую.

появилась такая интересная(по крайне мере для меня) проблема. Я уже недавно спрашивал про проверку md5sum в файле со списком готовых md5sum и названий файлов. И всё это вылилось у меня в такой скрипт:

#!/bin/sh

MD5CHECK_FILE=checksum.md5
LOG_FILE=looooog

invalid_param(){
	echo FAILED
}

echo > $LOG_FILE
	awk '{ if ($3 != "") {
			oldsum = $1
			"md5sum " $2 | getline # all input parameters $1, $2, ... changed
			if ( oldsum == $1) {
				print | "echo \"File "$2" has correct md5sum\" | tee -a '$LOG_FILE'";
			}
			else {
				print system ("echo \"md5sum for file "$2" is incorrect\" | tee -a '$LOG_FILE' ") ; exit 1 ;
			}
		}
	}' $MD5CHECK_FILE
	if [ $? -eq 1 ] ; then
		invalid_param

	fi

Но неожиданно скрипт начал заканчиваться с ошибкой 141, в любом месте списка. И до конца понять, что именно это за ошибка - не получилось. Только некоторые бессвязные намёки на SIGPIPE, но ошибка возникает не всегда, поэтому я грешу на что то другое и нет времени разбираться что это. Также в ходе экспериментов возвращается и просто 1, хотя она не связана с ошибкой в проверке md5sum

File /mnt/dcu/bin/scripts/z7_08_002_dm_discovery_commands.sql has correct md5sum
File /mnt/dcu/bin/scripts/dc_07_alter_collected_data.sql has correct md5sum
+ [ 141 -eq 0 ]

И я решил написать простой костыль: имеем бесконечный цикл, который будет выполнять мою проверку по списку, но если возвращается 141 или 1 то проверка начинается с того места где она стопорнулась и дальше по файлу

#!/bin/sh

MD5CHECK_FILE=/mnt/dcu/updates/checksum.md5
LOG_FILE=/mnt/dcu/updates/looooog

invalid_param(){
	echo FAILED
	exit 2
}

 echo > $SWUPDATE_LOG_FILE
while true ; do 
	awk '{ if ($3 != "") {
			oldsum = $1
			"md5sum " $2 | getline # all input parameters $1, $2, ... changed
			if ( oldsum == $1) {
		# system("LAST_FILE="$2" && export LAST_FILE) -
		# думал переменную с последним проверенным файлом 
		# вытаскивать таким образом, но он не проканал, поэтому ещё 1 костыль переписал так
				print | "echo \"File "$2" has correct md5sum\" | tee -a '$LOG_FILE'";
			}
			else {
				print system ("echo \"md5sum for file "$2" is incorrect\" | tee -a '$LOG_FILE' ") ; exit 65 ;
			}
		}
	}' $MD5CHECK_FILE
	if [ $? -eq 0 ] ; then
		break
	elif [ $? -eq 65 ] ; then
		invalid_param
	elif [[ $? -eq 141 || $? -eq 1 ]] ; then
		LAST_FILE=$(tail -1 $LOG_FILE| awk '{print $2}'| sed 's~\/~\\\/~g')
		sed -n "/$LAST_FILE/,$p" $MD5CHECK_FILE
		continue
	fi
done

Но и тут меня поджидает неудача:

[root@localhost:~]# sed -n "/$(tail -1 looooog | awk '{print $2}'|sed 's~\/~\\\/~g')/,$p" checksum.md5
sed: no address after comma

Когда так 
[root@localhost:~]# tail -1 looooog | awk '{print $2}'| sed 's~\/~\\\/~g'
\/mnt\/dcu\/bin\/Add.Cosem.dll

[root@localhost:~]# sed -n '//mnt\/dcu\/bin\/Add/.Cosem.dll/,$p' checksum.md5
f46a65236b6a1d7ff12ce2b38e8306be  /mnt/dcu/bin/Add.Cosem.dll    0644
a388e708638b1b2e466eac2b83b1717c  /mnt/dcu/bin/Add.P32.Facade.dll       0644
c9fc5f2cd347f2e5434e2eecc9485f6c  /mnt/dcu/bin/Add.DC.Watchdog.dll      0644
b975c33311ca451eb0901e6f858b9bea  /mnt/dcu/dnstools/dig 0755
.......

А вот так не хочет:
[root@localhost:~]# sed -n "/\/mnt\/dcu\/bin\/Add.Cosem.dll/,$p" checksum.md5
sed: no address after comma

Т.е. проблема в одинарных и двойных кавычках, но именно благодаря двойным кавычкам я могу передавать значение переменной из shell в sed.

Ребята помогите победить сие костыли: 1) возможность передачи переменной из AWK, минуя парсинг лог файла на наличие записи о последнем успешном файле 2) как ещё можно отпарсить файл с помощью sed от regexp до его конца, учитывая что regexp это PATH_LINE и что его нужно передать в качестве переменной.

Буду благодарен любому тычку !

 , ,

Aidjek
()

awk, куда же без него

Всех приветствую, есть такая задачка... Есть файл checksum, который состоит из 3х столбцов: md5sum, file_name, permission for chmod.

804567c6efce1755d11fc6ebbb263aa7  /mnt/dcu/mysql/bin/mysqld_safe        0755
f7e0baa7e97ea3075afec0e248e85b0d  /mnt/dcu/mysql/bin/mysql_install_db   0755
3388b314d96df3e372135d88b0fd48fb  /mnt/dcu/mysql/bin/mysqladmin 0755
73fdf21d66c328d3eb3c3d042783e1d8  /mnt/dcu/mysql/bin/resolveip  0755
47394f1c3430227b647d7e60d81dbe70  /mnt/dcu/mysql/bin/mysql      0755
00394418de5b9581bcce9ac7a51cff21  /mnt/dcu/mysql/bin/mysqlcheck 0755
338953d9c90ed4fc5ddd107af797fd1e  /mnt/dcu/mysql/bin/mysqldump  0755
5efb889b87b305e658db83ba3fe83bb8  /mnt/dcu/mysql/bin/myisamchk  0755

Хочется написать 2 конструкции: 1) которую я уже сделал - чтобы awk пробегал по строчкам, выбирал $3 и делал chmod $3 $2.

awk '{ if ($3 != "") { print | "chmod " $3 " "$2} }' checksum

2) задача - надо попробовать сделать так: чтобы awk брал $2, делал ему md5sum и сравнивал с $1. Если всё ок, то сообщал об этом. Написал такую штуку:

awk '{ if ($3 != "") { 
	if ( { print | "md5sum " $2} == $1) { 
		print "md5sum is correct"; 
		} 
	else { 
		print "md5sum is incorrect";
		}
	}
}' checksum

Но потом понял, что она у меня не сработает, потому что md5sum выдаётся в таком виде:

[root@localhost:]# grep mysql checksum |  awk '{print | "md5sum " $2}'
804567c6efce1755d11fc6ebbb263aa7  /mnt/dcu/mysql/bin/mysqld_safe
f7e0baa7e97ea3075afec0e248e85b0d  /mnt/dcu/mysql/bin/mysql_install_db
3388b314d96df3e372135d88b0fd48fb  /mnt/dcu/mysql/bin/mysqladmin
00394418de5b9581bcce9ac7a51cff21  /mnt/dcu/mysql/bin/mysqlcheck
47394f1c3430227b647d7e60d81dbe70  /mnt/dcu/mysql/bin/mysql
338953d9c90ed4fc5ddd107af797fd1e  /mnt/dcu/mysql/bin/mysqldump
beb812183e57b5dc59a8694f8ddba851  /mnt/dcu/mysql/bin/my_print_defaults
73fdf21d66c328d3eb3c3d042783e1d8  /mnt/dcu/mysql/bin/resolveip
5efb889b87b305e658db83ba3fe83bb8  /mnt/dcu/mysql/bin/myisamchk

Т.е. мне надо output от print опять пропускать через awk и выделять 1 столбец и смотреть если всё ок (мне почему то кажется что это можно сделать попроще)

Просьба варианты вида

for file in $(awk '{print $2}' checksum); do
	VALID_MD5=$(grep $file  checksum  | awk '{print $1}')
	CURRENT_MD5=$(/usr/bin/md5sum $file | awk '{print $1}')
	if [ "$VALID_MD5" = "$CURRENT_MD5" ] ; then
		echo "File $file has correct md5sum"
	else
		echo "md5sum for file $file is incorrect"
	fi
done

не предлагать.

потому что при попытке найти файл /mnt/dcu/mysql/bin/mysql grep выдаст сразу несколько вариантов и мне пришлось от него отказаться, да и делается это намного медленнее.(например 1 задачу, когда я переписал на awk - скорость увеличилась в 4 раза)

 ,

Aidjek
()

семь бед ? есть sed

Приветствую людей, которые возможно могут помочь.

Есть такая строчка:

bla bla bla ID=1027 bla bla bla

нужно вытащить циферки ...

написал такую штуку:

echo "bla bla bla ID=1027 bla bla bla" | sed -e "s/\(.*ID=\)\([0-9]\{4\}\).*/\2/"
1027

получаю что надо, но неожиданно циферек стало больше 10 и их количество может меняться.

и переписать уже не получается

echo "bla bla bla ID=10232437 bla bla bla" | sed -e "s/\(.*ID=\)\([0-9]\{10\}\).*/\2/"
bla bla bla ID=10232437 bla bla bla

echo "bla bla bla ID=10232437 bla bla bla" | sed -e "s/\(.*ID=\)\([0-9]\{8\}\).*/\2/"
10232437

Буду признателен, если кто то ткнёт мордой в строку мана, где можно почитать об этом.

 ,

Aidjek
()

использование sed между 2-мя одинаковыми regexp'ами.

Лор привет,

Возникла такая ситуация:

есть выражение

ppp0:192.168.0.3:11000 eth0:192.168.102.80:11111

надо написать 3 функции через sed, можно по отдельности, которые заменяет сначала выражение между : и началом строки, потом между 2-мя : и наконец - между 2-ым : и пробелом. При этом 2часть после пробела изменения не должны касаться.

С первыми 2-мя выражениями я справился как смог:

[root@localhost:~]# a=wlan0 ; sed "s/[^:]*/$a/" /root/123
wlan0:192.168.0.3:11000 eth0:192.168.102.80:11111

[root@localhost:~]# a=wlan0 ;  sed "s/:[^:]*/:$a/" /root/123
ppp0:wlan0:11000 eth0:192.168.102.80:11111

А вот с 3-ей частью уже не хватает думалки.

Заранее благодарен

 ,

Aidjek
()

Маршрутизация между 2-мя интерфейсами в Linux

Всем доброго времени суток. Хотелось бы посоветоваться по такому вопросу:

имеем реализацию одного нового интерфейса, не относящийся к Ethernet'y, суть проблемы в том, что на 2-х разных девайсах, которые имеют 1 интерфейс eth0 и новый интерфейс - mv0, находясь в одной сети, маршрутизация работает при подключении ethernet интерфейсы через свитч. Новый интерфейс через свитчи не работает и передаёт пакеты через электрическую сеть. При отключении сетевого кабеля от девайса №2, пингуется девайс №1 по новому интерфейсу, но не по ethernet интерфейсу.

Проведя эксперимент на виртуальных машинах с 2-мя различными интерфейсами, я заметил такую особенность: если на 2 машине eth0 - находится в одной сети с eth1 1 машины, то я могу пингануть не только eth1 на первой машине, но и eth0, хотя каких то особенных правил для route я не проставляю, фаерволл не мешает и не помогает и маскарадинг отключил. Единственное правило, что на 2 машине - основным шлюзом является eth1 1 машины.

Для моего же случая это не работает.

Не подскажите как осуществляется этот механизм обнаружения вышестоящих интерфейсов со 2 на 1 машину или может всё что я здесь описал - полный бред и только великий Ктулху знает как это работает (

Aidjek
()

iptables на ванильном ядре и ARM процессоре.

Всем доброго времени суток.

Появилась такая необходимость в сборке из сорцов пакета iptables для ванильного ядра версии 2.6.27.53.

Собирается всё через самосборный toolchain, состоящий из: uClibc-0.9.29, arm-linux-uclibc-{gcc,g++,cpp} - version (GCC) 4.2.4, arm-linux-uclibc-{ld,ar,strip} - version GNU ld (GNU Binutils) 2.18

процессор для которого это собиралось: Processor : ARM920T rev 0 (v4l) Микроконтроллер: AT91RM9200 http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/arm/AT91RM9200.htm

в качестве утилит используется busybox 1.18.5

Сначала собирал разные версии Iptables, но все попытки заканчивались различными ошибками: более подробно с выводами и кусками кода - можно посмотреть тут! (на лор не влезло «Ошибка: Слишком большое сообщение» 8E)

Решил собрать самую последнюю стабильную версию iptables 1.4.12

после попытки запуска на самом устройстве с ARM процессором, получаем следующую ошибку:

[root@Router7:/mnt/db/updates]# /mnt/db/iptables/sbin/iptables -L
iptables v1.4.3.2: can't initialize iptables table `filter': Invalid argument
Perhaps iptables or your kernel needs to be upgraded.

ясно, что нужно копать в сторону модулей ядра:

lsmod
nf_conntrack_ftp 7296 0 - Live 0xbf054000
iptable_nat 5576 0 - Live 0xbf051000
nf_nat 17622 1 iptable_nat, Live 0xbf04b000
nf_conntrack_ipv4 14956 3 iptable_nat,nf_nat, Live 0xbf046000
nf_conntrack 67916 4 nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4, Live 0xbf034000
ipt_LOG 5440 0 - Live 0xbf02f000
iptable_raw 2208 0 - Live 0xbf032000
iptable_filter 2752 0 - Live 0xbf02d000
ip_tables 11472 3 iptable_nat,iptable_raw,iptable_filter, Live 0xbf029000
x_tables 15268 3 iptable_nat,ipt_LOG,ip_tables, Live 0xbf024000

но тут видно что модули подгружены и в логах также никаких проблем.

Дошёл до абсурда, пересобрал busybox c поддержкой dpkg утилиты и попробовал поставить пакет http://packages.debian.org/ru/lenny/arm/iptables, но только потом увидел зависимость от libc6, которого конечно у меня нет.

Начал пересобирать модули с оригинальных исходников для ядра 2.6.27.53, но также не получил должных результатов.

почти во всех случаях сборки, проблем с модулями нет - они корректно подгружаются, в

[root@Router7:/mnt/db/updates]# cat /proc/net/ip_tables_names
filter
всё в порядке, но iptables упорно игнорирует наличие таблиц.

после этого решил пересобрать iptables c поддержкой дебаггинга, используя http://www.spinics.net/lists/netfilter-devel/msg00887.html и http://backreference.org/2010/06/11/iptables-debugging/, но также столкнулся с тем, что iptables не хочет писать ничего в kernel log.

Решил открыть тему типа баг http://bugzilla.netfilter.org/show_bug.cgi?id=734, но вряд ли ответ будет раньше, чем через месяц. Также там и представлены strace для этих ошибок и конфиг для ядра, но если нужно могу выложить их и тут

Ну после всего этого не найдя нормального решения, решил обратиться уже к тем, кто возможно сталкивался с подобными проблемами.

Судя по http://backreference.org/2010/06/11/iptables-debugging/, а точнее по последнему абзацу

Also, this could be generated in case you are trying to use a match that is not available, either because you did not load the proper module, it was not compiled into kernel or iptables failed to automatically load the module

возникает вопрос: а как вообще проверить то, что Iptables не может подгрузить модули? (хотя на самом деле модули он подгружает, потому что они не стоят в автозагрузке ядра)

В связи с этим следующий вопрос: может кто то включал дебаггинг по максимуму для iptables и модулей ядра для него.

Ну и может кто то собирал Iptables для таких нужд и возможно поделится опытом.

Буду очень признателен за любую помощь в этих вопросах и могу предоставить всё что попросите.

P.S. данный toolchain является рабочим, на нём были собраны другие пакеты, которые успешно работают. Также все вопросы по поводу обновления каких либо пакетов, не рассматриваются, т.к. это довольно трудоёмкая работа и нерентабельна для данного случая.

Aidjek
()

RSS подписка на новые темы