Strona 1 z 2

[+] Bash, pętla for i błędne zmienne

: 09 lipca 2012, 16:02
autor: LordRuthwen
Witam. Poniżej kawałek skryptu, na razie testuję myśl i coś mi nie wychodzi.
Skrypt ma czytać pliki znajdujące się w katalogu $FILES, nazwa pliku ma zostać przypisana do zmiennej ip, zawartość pliku (dane w jednej kolumnie) do zmiennej IN, warunki for z in ... sobie daruję, bo nie mają obecnie znaczenia, działają poprawnie.
Pisanie zmiennych przez echo dałem w celach diagnostycznych, te zmienne są poprawne.
W ostatniej pętli zmienna n ma poprawną wartość, zmienna i natomiast nie jest nazwą pliku, lecz pełną ścieżką do niego.

Kod: Zaznacz cały

FILES=/home/lukasz/adresy/*
for i in ${FILES}
        do
                ip=`echo $i | awk -F. '{print $3}'`
                IN=`cat $i`
                for z in 140 141 142 143 156 229
                    do
                        if [ "$ip" == "$z" ];then
                        podsiec_out=`echo "$IPTB3"`
                        podsiec_in=`echo "$IPTB3in"`
                        fi
                    done
                for z in 144 145 146 147
                    do
                        if [ "$ip" == "$z" ];then
                        podsiec_out=`echo "$IPTB2"`
                        podsiec_in=`echo "$IPTB2in"`
                        fi
                    done
                for z in 184 185 186 187
                    do
                        if [ "$ip" == "$z" ];then
                        podsiec_out=`echo "$IPTB504"`
                        podsiec_in=`echo "$IPTB504in"`
                        fi
                    done
                    echo "Out: $podsiec_out"
                    echo "IN: $podsiec_in"
                    echo "MAC: $IN"
                for n in $IN
                        do
                                echo "$podsiec_out  -m mac --mac-source $n -s $i -j ACCEPT" >> /home/lukasz/okitest.txt
                                echo "$podsiec_in -d $i -j ACCEPT" >> /home/lukasz/okitest.txt
                        done
                       break
        done
Próbowałem walczyć za pomocą seda, ale nie przyniosło to rezultatów żadnych.

Kod: Zaznacz cały

echo "$podsiec_out  -m mac --mac-source $n -s $i -j ACCEPT" | sed "s/$FILES//g"  >> /home/lukasz/okitest.txt
Dostaję tylko komunikaty o treści:
sed: -e wyrażenie #1, znak 9: nieznana opcja dla polecenia `s'
Co ciekawe, w momencie gdy zrobiłem tak:

Kod: Zaznacz cały

echo "$podsiec_out  -m mac --mac-source $n -s $i -j ACCEPT" #| sed "s/$FILES//g"  >> /home/lukasz/okitest.txt
To dalej nimi pluło :)

: 09 lipca 2012, 21:05
autor: kodama
A jakbyś zamienił

Kod: Zaznacz cały

FILES=/home/lukasz/adresy/*
for i in ${FILES}
Na naprzykład:

Kod: Zaznacz cały

cd /home/lukasz/adresy/
f=`ls | wc -l`;

for i in `seq 0 $f`; do
...
Wtefy $f będzie przyjmowało wartości od 0 do ilości plików w tym katalogu. O ile dobrze zrozumiałem to o to chodzi, tak?


EWENTUALNIE, jeżeli zmienna i ma być nazwą pliku to bym zrobił tak: cd do katalogu i dalej (tzn. ja tak robię u siebie, wtedy zmienna ma nazwę kolejnego pliku):

Kod: Zaznacz cały

for i in P*.pdf; do
...
tylko pytanie w jakiej formie masz nazwy plików.

: 10 lipca 2012, 08:07
autor: LordRuthwen
Nazwą pliku jest po prostu adres IP i chodzi właśnie o to, żeby go zaczytać do zmiennej.
Wiem, że to jest łatwiejsze do zrobienia za pomocą listy i awk, ale to będzie obsługiwane przez program zewnętrzny i jest wymagane coś takiego.
No nic, dzięki, tak też działa.

: 11 lipca 2012, 11:36
autor: mariaczi
W ostatniej pętli użyj $ip zamiast $i :)
ip możesz wyciągnąć również tak

Kod: Zaznacz cały

ip=`echo $i | cut -d '/' -f5`
przykład:

Kod: Zaznacz cały

echo "/home/lukasz/adresy/192.168.0.12" | cut -d '/' -f5

: 11 lipca 2012, 11:51
autor: LordRuthwen
Nie do końca, dlatego, że $ip jest tylko trzecim oktetem całego adresu IP.

: 11 lipca 2012, 11:56
autor: mariaczi
Zatem do zmiennej "ip" wpada tylko trzeci oktet a do iptables potrzebujesz użyć adresu sieci czy konkretnego adresu ip?

: 11 lipca 2012, 12:08
autor: LordRuthwen
Zmienna $ip jest tylko trzecim oktetem adresu - to jest w celu określenia tablicy do jakiej ma wpadać ruch z danej podsieci, zmienna $i powinna być adresem IP.
Na razie przed wykonaniem pętli zmieniam katalog na zawierający pliki i problemu ze ścieżką w zmiennej $i nie mam, to jest na razie koncepcja, jeszcze ją przerabiam, zresztą już wyleciały 3 pętle for ze środka na korzyść case - oszczędzam w ten sposób 6 sekund wykonania na słabszej maszynie (C2D) i sekundę na i3.
Testowane w przypadku danych z około 1300 adresów IP. Adresów MAC jest około 3700.

: 11 lipca 2012, 13:06
autor: mariaczi
W pierwszej pętli for do zmiennej i przypisywana jest nazwa pliku (ścieżka). Skąd (w jaki sposób) zatem ma w niej znaleźć się adres IP? Tego mi brakuje :)

: 11 lipca 2012, 13:25
autor: LordRuthwen
Adresem IP jest nazwa pliku.

: 11 lipca 2012, 14:38
autor: mariaczi
I z tego co pisałeś wpada w tą zmienną cała ścieżka do pliku a nie sama nazwa pliku, zatem zrób na tej zmiennej "i"

Kod: Zaznacz cały

ipek=`echo $i | cut -d '/' -f5`
i będziesz miał w zmiennej ipek sam adres IP. Zwróć uwagę na parametr "-f5". Oznacza "numer bloku" który ma pozostać.

PS. Jeśli źle rozumuję, to pokaż proszę wartość z "wyechowanego i".