Temat: Adblock.sh - analiza kodu
Hej,
postanowiłem przejrzeć kod adblock.sh (http://eko.one.pl/?p=openwrt-adblock) i być może uzupełnić go o parę brakujących URL.
Przy okazji chcę się nauczyć trochę o linuksie.
Byłbym wdzięczny za Wasz komentarz, poprawki i odpowiedzi na pytania.
#!/bin/sh
rm -f /tmp/block.hosts # usuwa plik block.hosts, opcją force (bez interakcji z uzytkownikiem)
#wget sluzy do sciagania plikow po http. Opcja q(quiet) ogranicza komunikaty do uzytkownika. Opcja 0 (--output-document=) z przełącznikiem - ma za zadanie\
# pozwolić na wyplucie sciganietego pliku tektstowego na domyslne wyjscie (czyli ekran uzytkownika), zamiast zwyklego zapisania w systemie plikow("na dysk).
# Znak | to tzw. pipeline. Pozwala przekierowac wynika dzialania komendy jako wejscie do kolejnej komendy.
# grep to narzędzie to wyszukiwania ciagu znaków w pliku. Nie ogarniam składni w tym miejscu - czemu dodane jest 127.... przed każdą nową linią?Tzn. wiem po co, ale nie wiem składnia grep działa w tym przypadku.
# Znak > przekierwuje cale wyjscie do pliku - jesli plik istnieje, nadpisuje go (czyli stary jest usuniety). Ten plik to block.build.list
wget -qO- "[url]http://www.mvps.org/winhelp2002/hosts.txt[/url]" | grep "^127.0.0.1" > /tmp/block.build.list
# Znak >> powoduje dopisanie do juz istniejacego pliku. Dopisujemy do poprzedniego (block.build.list), tak, zeby polaczyc kilka plikow w jeden
# polecenie jest powielone dla roznych list - dzieki temu mozemy uzywac kilka list
wget -qO- "[url]http://www.malwaredomainlist.com/hostslist/hosts.txt[/url]" | grep "^127.0.0.1" >> /tmp/block.build.list
wget -qO- "[url]http://hosts-file.net/.\ad_servers.txt[/url]" | grep "^127.0.0.1" >> /tmp/block.build.list
wget -qO- "[url]http://adaway.org/hosts.txt[/url]" | grep "^127.0.0.1" >> /tmp/block.build.list
wget -qO- "[url]http://pgl.yoyo.org/as/serverlist.php?showintro=0;hostformat=hosts[/url]" | grep "^127.0.0.1" >> /tmp/block.build.listno tu bedzie grubo.... {$1=$1} i cały awk jest nieco "niestrawny"
# awk to wywołanie skryptu,zawartego pomiędzy dwoma znakami '
# pierwsze polecenie {$1=$1} to "głupi" warunek sprawdzający czy pierwszy wiersz jest pierwszym wierszem. Z tego co rozumiem, jest to potrzebne
# do wymuszenia na awk przetworzenia pola i usunięcia spacji (specyfika awk, niekoniecznie jest to logiczne)
# drugie polecenie {gsub(/\r/,"") ma za zadanie przetworzyć koniec wiersza w pliku ("DOSowy") na strawny dla Linuxa
# print wyświetla bieżący rekord
# block.build.list|sort|uniq ma za zadanie przekiewoac plik do sortowania (sort) i usuwania duplikatów (uniq). Całość podana jest jako
# argument dla polecenia dla awk. Czyli skrypt {$1=$1}{gsub(/\r/,"")}{print } wykonywany jest na /tmp/block.build.list|sort|uniq
# Znak > przekierowuje wyjscie do wskazanego pliku
awk '{$1=$1}{gsub(/\r/,"")}{print }' /tmp/block.build.list|sort|uniq > /tmp/block.build.before
# Usuwa poprzedni plik, ktorego zawartosc zostala juz przetworzona i zapisana do nowego pliku. Uzycie -f (force) zapewnia brak koniecznosci
# potwierdzenia operacji przez uzytkownika
rm -f /tmp/block.build.list
# Grep wyswietli wiersze z pliku block.build.before z pominieciem tych, które są w pliku white.list. Po co jest -f, nie mam pojęcia.
# Znak > przekieruje wszystko do nowo utworzonego pliku block.hosts
grep -vf /etc/white.list /tmp/block.build.before > /tmp/block.hosts
# Ponownie - usuwanie starego pliku po jego przetworzeniu i zapisaniu nowego
rm -f /tmp/block.build.before
# Restart uslugi odpowiedzialnej za DNS powoduje zaczytanie pliku block.hosts do pamięci i korzystanie z niego przy rozwiązywaniu nazw DNS
/etc/init.d/dnsmasq restart
# exit to zamknięcie skryptu. Wartosc 0 ma wskazac wywolującemuy, ze nie bylo bledu, jesli program wywal ten exit.
exit 0Tak jak napisałem, robię tą analizę dla siebie, ale chciałbym żeby została na forum (najlepiej poprawiona), może komuś pomoże lepiej zrozumieć linux / openwrt.
Komentarze są "po bashu", bo chcę żeby było można zmieniać/czytać kod bezpośrednio w WinSCP.