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:
(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:
oznacza cyfrę, czyli równie dobrze możnaby zapisać poprzednie wyrażenie jako:
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.
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:
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:
et voilà!