ash wycinanie adresu IP ze strony php.

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
jacekalex
Gibki Gibbon
Gibki Gibbon
Posty: 4707
Rejestracja: 17 cze 2007, 02:54
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: x86_64

Re: Bash wycinanie adresu IP ze strony php.

Post autor: jacekalex »

@ethanak

Ile znasz marek samochodów?
Która lepsza?
Którą można dojechać do celu?

Przewaga curla jest taka, że biblioteka libcurl jest dosyć powszechnie potrzebna w każdym Linuxie, dlatego jeszcze nie widziałem Linuxa, w którym nie było by curla.
Da się w nim zrobić? - pewnie, że się da.

Np tak:

Kod: Zaznacz cały

#!/bin/bash

MOJEIP=$( curl checkip.dyndns.org 2>/dev/null |sed -e 's/.*Current IP Address: //' -e 's/<.*$//');
echo "Moje IP to $MOJEIP";
Więc jak trzeba wyczesać swój własny IP przy tych cholernych dynamicznych adresach i NATach, to ok.
Jeśli jednak trzeba (może zrozumiałem Autora wątku zbyt dosłownie),
wyczesać np adresy źródłowe odbitych pakietów w logach routerowego firewalla, to przyjemnej zabawy curlem, nc, grepem, awk, itp.

Czesanie rożnych danych ze stron internetowych, to dzisiaj standard, i dlatego lepiej poznać metodę rozwojową, elastyczną, i pozwalającą na różne sposoby poszukiwania.
W takim przypadku Bashowi conieco brakuje do wypełnienia wymogu maksymalnej elastyczności, przebijania się przez JS, ajaxy, i inne cholerstwa.

Więc możesz czepiać się, jak pijany płotu stwierdzenia, że Fiatem można dojechać, samochodem marki Jaguar też można dojechać w to samo miejsce, ale taka jest prawda.
Trochę inaczej się te samochody prowadzi, z całą pewnością inaczej kosztują,
i zazwyczaj jeżdżą z zupełnie innymi prędkościami, ale dojechać można każdym samochodem. :craz:

Pozdro
;-)
Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Komputer jest jak klimatyzacja - gdy otworzysz okna, robi się bezużyteczny...
Linux User #499936
Inny OS: Gentoo Linux :)
Skajper4
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 28 lis 2012, 17:23
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: Bash wycinanie adresu IP ze strony php.

Post autor: Skajper4 »

jacekalex pisze: Więc jak trzeba wyczesać swój własny IP przy tych cholernych dynamicznych adresach i NATach, to ok.
Tak, dokładnie. Potrzebuję wyciąć jedynie adres IP wyświetlający się na stronie w celu ominięcia bramy i dynamicznego ip. Strona dowolna, ponieważ to nie ma różnicy, a podana w tym co wkleiłem strona jest tylko przykładem.

Kod: Zaznacz cały

root@OpenWrt:~# curl
-ash: curl: not found
Czas zobaczyć ;)
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash wycinanie adresu IP ze strony php.

Post autor: ethanak »

No to jeszcze popraw temat, bo ash to nie bash :-P
nc jest? (dawniej zwany netcat)...

@jacekalex: właśnie (pośrednio) zobaczyłeś :):):)
Кто жопой родился, чижиком не помрёт
Skajper4
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 28 lis 2012, 17:23
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: Bash wycinanie adresu IP ze strony php.

Post autor: Skajper4 »

Właśnie jak pisałem ten temat to wpisałem ash, ale coś mnie skusiło żeby zmienić :P

Kod: Zaznacz cały

root@OpenWrt:~# nc
BusyBox v1.19.4 (2014-03-12 13:38:47 CET) multi-call binary.

Usage: nc [IPADDR PORT]

Open a pipe to IP:PORT
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: ash wycinanie adresu IP ze strony php.

Post autor: ethanak »

No to próbujmy. Jako że chciałeś się czegoś tam nauczyć będę po kolei wyjaśniać.

Zacznijmy od pobrania strony. Można to zrobić wgetem, curlem, lynxem - spróbujmy jednak użyć narzędzia które mamy pod ręką, czyli nc - który po prostu łączy się z serwerem na danym porcie, przekazuje mu wszystko co dostanie na wejściu i wypisuje wszystkie odpowiedzi od serwera.

Nie będę się rozpisywał o protokole HTTP (chociaż warto go znać choćby po to, żeby sobie móc telnetem wejść na port 80 i nie zgłupieć), pobranie strony rozpoczyna się od wysłania do serwera paru linijek, w stylu:

Kod: Zaznacz cały

GET /jakaś-strona.html HTTP/1.1
Host: www.jakis-serwer.pl
i zakończenia pustą linią. Serwer powinien odpowiedzieć zawartością strony jakaś-strona.html. Czyli możesz spróbować:

Kod: Zaznacz cały

echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80
W odpowiedzi dostaniesz kod strony, zawierający m.in. Twój adres IP.

Spróbujmy teraz znaleźć ten adres. Dla uproszczenia możemy przyjąć, że adres IP to grupa czterech liczb oddzielonych kropkami (nie jest do do końca prawda, ale do naszych celów dokładnie wystarczy). Spróbujmy skonstruować wyrażenie regularne.
Pojedynczą liczbę możemy znaleźć za pomocą choćby:

Kod: Zaznacz cały

[0-9]+
(oznaczającego co najmniej jeden znak z zakresu od 0 do 9). dialekt wyrażeń regularnych używany przez polecenie grep pozwala również na bardziej czytelny zapis klas, np:

Kod: Zaznacz cały

[:digit:]
oznacza cyfrę, czyli równie dobrze możnaby zapisać poprzednie wyrażenie jako:

Kod: Zaznacz cały

[[:digit:]]+
Z uwagi na to, że grep w podstawowym dialekcie nie rozumie znaczenia znaku +, możemy albo skonstruować wyrażenie rozszerzone, albo nieco zmienić wyrażenie podstawowe. Spróbujmy tej drugiej metody.

Kod: Zaznacz cały

[[:digit:]][[:digit:]]*
będzie oznaczać w praktyce to samo co poprzedni zapis, czyli 'cyfrę, po której następuje cyfra'. Pamiętając o tym, że kropka jest znakiem specjalnym i trzeba ją odpowiednio oznakować możemy już stworzyć wyrażenie pasujące do adresu IP:

Kod: Zaznacz cały

[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*
czyli cztery grupy cyfr przedzielone kropkami.
Teraz możemy już znaleźć linijkę, w której znajduje się nasz adres IP. Próbujemy więc:

Kod: Zaznacz cały

echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80 | grep '[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*'
W odpowiedzi otrzymamy coś w rodzaju:

Kod: Zaznacz cały

                                        <span class="ip">11.22.33.44</span>
                            <td width="150">Host</td><td>11.22.33.44</td>
Nie przejmujmy się na razie tym, że adres jest powtórzony - serwer próbuje rozwiązać nasz adres IP na nazwę i jeśli jej nie znajdzie zwraca ponownie nasz adres IP jako nazwę hosta (widzianego z Internetu).
No dobra... ale nam potrzebny jest sam adres IP, a nie jakieś spany czy td!
Na szczęście grep ma opcję wypisania wyłącznie pasującej do wyrażenia części napisu. Spróbujmy więc:

Kod: Zaznacz cały

echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80 | grep -o '[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*'
Od razu lepiej :)
Możemy teraz pozbyć się tasiemcowatego wyrażenia z grepa i użyć wyrażenia rozszerzonego:

Kod: Zaznacz cały

([[:digit:]]+\.){3}[[:digit:]]+
będzie oznaczać dokładnie to samo - czyli trzykrotnie powtórzona grupa cyfr zakończonych kropką i na końcu również grupa cyfr.

Kod: Zaznacz cały

echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80 | grep -oE '([[:digit:]]+\.){3}[[:digit:]]+'
da nam ten sam wynik, a o ileż ładniej wygląda! :)
Na końcu wytniemy powtarzające się adresy. Do tego służy nam polecenie head pozwalające wyciąć n pierwszych linii, czyli:

Kod: Zaznacz cały

echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80 | grep -oE '([[:digit:]]+\.){3}[[:digit:]]+' | head -n 1
da nam oczekiwany adres IP.
Teraz wystarczy to podstawić do zmiennej. Składnia w przypadku obu wspomnianych shelli (ash i bash) jest taka sama, a więc:

Kod: Zaznacz cały

ip=$(echo -e 'GET / HTTP/1.1\nHost: www.mojeip.com.pl\n' | nc www.mojeip.com.pl 80 | grep -oE '([[:digit:]]+\.){3}[[:digit:]]+' | head -n 1)
zapisze nam nasz adres IP do zmiennej. Możemy teraz sprawdzić czy wszystko jest w porządku:

Kod: Zaznacz cały

echo $ip
et voilà!
Кто жопой родился, чижиком не помрёт
Skajper4
Piegowaty Guziec
Piegowaty Guziec
Posty: 24
Rejestracja: 28 lis 2012, 17:23
Płeć: Mężczyzna
Wersja Ubuntu: 13.10
Środowisko graficzne: KDE Plasma
Architektura: x86_64

Re: ash wycinanie adresu IP ze strony php.

Post autor: Skajper4 »

@ethtank Bardzo Ci dziękuję, coś wykombinuję według tych instrukcji :)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 14 gości