Portál AbcLinuxu, 9. května 2025 22:57

Dotaz: BASH a pomaly prubeh skriptu

26.9.2006 16:31 Chap
BASH a pomaly prubeh skriptu
Přečteno: 133×
Odpovědět | Admin
Ahoj, jsem v bashi zacatecnik (resp jsem jen potreboval prepsat neco z PHP). Mam nasledujici problem: Po spusteni skriptu s IP adresou externe predanou skriptu ($1).

U skriptu jsou dva soubory a to tt.txt - ve kterem jsou prvni cisla z IP adres ,je jich 20 ktere se vyskytuji u ceskych rozsahu (X.0.0.0), cislo v tomto souboru je ulozeno ve tvaru +213+, abych zamezil moznosti napr grep 13 muze vratit 213.

v souboru rozsahy.txt jsou vsechny ceske rozsahy ve formatu: 1-10znak zacatek rozsahu a 11-20 konec rozsahu ve tvaru ip2long.

tudiz provadim nasledujici: GREP prvniho cisla IP v tt.txt pokud se zde nenachazi, automaticky se jedna o zahranicni IP. Pokud se v tt.txt nachazi zacnu prohledavat rozsahy.txt a porovnavat zda ip2long(ip) je v intervalu z nektereho z rozsahu.

No a problem je ze prohledani 1 adresy trva radove 2-20s a potrebuji aby to zjistovalo radove v ms. Doufam ze jsem problem popsal dostatecne a ze je to jen nejaka moje lamerina. Predem dik za odpovedi.

a zde je kod

#!/bin/bash

function ip2long(){
	local IP="${1:?Missing ip in $FUNCNAME}"
	local IP_SUM=0
	local COUNT=3
	for i in `echo "$IP"|sed 's:\.: :g'`; do
		let IP_SUM+=$(($i<<($COUNT*8)))
		let COUNT--
	done
	echo "$IP_SUM"
}


function najdiCZIP(){
	ret="N"
	long=`ip2long $1`
	ipzac=`echo $1|cut -d. -f1`
	if [ -n `cat tt.txt|grep +$ipzac+` ]
	then 
	  for k in `cat rozsahy.txt` 
		do
			start=`echo $k|cut -c1-10`
			stop=`echo $k|cut -c11-20`
			#echo "$start $long $stop"
			if [ $long -ge $start ] && [ $long -le $stop ]
				then
				ret="C"
				break
			fi
		done
	fi
	echo $ret
}

najdiCZIP $1
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

26.9.2006 20:21 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: BASH a pomaly prubeh skriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím, jestli správně chápu zadání, ale jednotlivě (pod)sítě by bylo lepší definovat klasicky jako
n.n.n.n/m.m.m.m
eventuelně
n.n.n.n/b (b je počet jedničkových bitů v masce)
Kvůli obecnosti se budu držet první varianty zápisu. Jestliže chci zjistit, zda daná IP adresa patří do nějaké sítě, tak na ni aplikuju masku a musí mi vyjít to číslo před lomítkem. Pokud vyjde něco jiného, pak IP adresa do sítě nepatří. Takže kdybych měl soubor "site.txt", ve kterém budou řádky ve tvaru n.n.n.n/m.m.m.m pak můžu napsat třeba tento program:
#!/usr/bin/env python
import socket, struct, sys

def ascii_ip_ton(ascii_quad):
    return struct.unpack('!L',socket.inet_aton(ascii_quad))[0]

tested_ip_a = sys.argv[1]
tested_ip = ascii_ip_ton(tested_ip_a)

for pair in file('site.txt'):
    pair = pair.strip()
    network_a, mask_a = pair.split('/')
    network = ascii_ip_ton(network_a)
    mask = ascii_ip_ton(mask_a)
    if tested_ip & mask == network:
        print tested_ip_a, 'belongs to', pair
Za sekundu zvládne zkontrolovat příslušnost ke 100 000 sítím. Ani trochu jsem se nesnažil to optimalizovat. Kdyby to bylo pořád málo, je zde možnost kešovat IP adresy převedené do numerického formátu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.