[+] Bash, p

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

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

Post 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 :)
Awatar użytkownika
kodama
Junior Member
Posty: 633
Rejestracja: 23 maja 2010, 22:30
Lokalizacja: Poznań

Post 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.
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post 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.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post 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
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Nie do końca, dlatego, że $ip jest tylko trzecim oktetem całego adresu IP.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Zatem do zmiennej "ip" wpada tylko trzeci oktet a do iptables potrzebujesz użyć adresu sieci czy konkretnego adresu ip?
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post 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.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post 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 :)
Awatar użytkownika
LordRuthwen
Moderator
Posty: 2341
Rejestracja: 18 września 2009, 21:45
Lokalizacja: klikash?

Post autor: LordRuthwen »

Adresem IP jest nazwa pliku.
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post 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".
ODPOWIEDZ