Sprawdzanie nieaktywnych linków na stronie

Gdy administruje się dużymi stronami internetowymi raz na czas np. po większych zmianach w konfiguracji zachodzi potrzeba sprawdzenia czy na stronie nie ma stron prowadzących donikąd. O ile w małych serwisach można samemu szybko przeklikać się przez stronkę to dla starych rozrośniętych serwisów nie jest to takie proste.

Jest kilka narzędzi których można użyć do testowania linków na stronach – każde z nich ma swoje zalety i wady, postaram się je przybliżyć.

wget

Wget’a najprawdopodobniej już masz i możesz zaczynać:

wget -o /tmp/wget.log -nv -r -p http://example.com

W pliku /tmp/wget.log możemy znaleźć komunikaty błędów i na dobrą sprawę tyle. Ciężko to przetworzyć ale jeśli nasz serwis ma mechanizm do np. mailowego powiadomienia w momencie wystąpienia krytycznego błędu to wget’em najszybciej można takie strony wyłapać.

linkchecker

Uruchamia się go tak:

linkchecker -t3 --no-warnings http://example.com

Program jakoś nie przypadł mi do gustu – działał cholernie wolno i to na całkiem małej stronie.

linklint

Z trzech programów ten ma najdziwniejszą składnię – ale da się tego nauczyć, a możliwości ma chyba najwięcej.

linklint -error -warn -xref -forward -out report.txt -net -http -host example.com /@

Wystarczająco szybki i generuje przejrzyste raporty.

unicode-rxvt – moje ustawienia

Wybór dobrego X-terminala to w życiu admina prawie jak wybór żony… spędza się wspólnie dużo czasu i miło gdy estetycznie wygląda, robi to co chcemy, itd… 😉

Nie lubię gnome-terminal’a bo domyślnie binduje F10 co wnerwia mnie w midnight commanderze, stąd szukałem i szukałem i jak dotychczas najbardziej podpasował mi unicode-rxvt. Można uruchamiać go po prostu jako urxvt lub uruchomić demona urxvtd po zalogowaniu i potem odpalać tylko klienta urxvtc. Druga metoda skutkuje natychmiastowym startem terminala, wiec gdy podbinduję go sobie pod F12 mam terminal zawsze pod ręką w mniej niż sekundę. Dodatkowo fajnie wygląda z półprzezroczystością i nie ma żadnych dodatkowych menu/gadżetów.

Skróty klawiaturowe

Wygodne skróty klawiaturowe to kolejny atut tego terminala, najczęściej korzystam z:

  • shift+dół – otwarcie nowej karty,
  • shift+lewo/shift+prawo – przejście na kartę w lewo/prawo,
  • ctrl+lewo/ctrl+prawo – przeniesienie karty w lewo/prawo,
  • ctrl+d – zamknij kartę.

Więcej ciekawych informacji o tym terminalu można znaleźć tutaj.

Konfig dla urxvt

cat > ~/.Xdefaults <<SRC
visualBell: False
Xft.antialias: true
Xft.hinting: true
Xft.hintstyle: 0
Xft.dpi: 75

urxvt*termName: rxvt-unicode
urxvt*geometry: 110x35
urxvt*background: rgba:2000/2000/2000/dddd
urxvt*foreground: white
urxvt*depth: 32
urxvt*fading: 40
urxvt*shading: 40
# fajny font ale w nowszych Ubuntu dziwnie zachowuje sie kursor ;-(
#urxvt*font: xft:Terminus:pixelsize=14
#urxvt*font: xft:Monospace:pixelsize=12
urxvt*font: xft:Ubuntu Mono:pixelsize=14
urxvt*scrollBar: false
urxvt*saveLines: 30000
urxvt*tintColor: gray
urxvt*perl-ext-common: default,matcher,selection-autotransform,tabbed,selection-pastebin
# urlLauncher otwiera wpisaną przeglądarkę
# po kliknięciu środkowym klawiszem myszy
#urxvt*urlLauncher: firefox
urxvt*urlLauncher: chromium-browser

# to już nie jest config dla urxvt
# ale przeważnie też go dorzucam
xterm*geometry: 110x35
xterm*background: black
xterm*foreground: grey
xterm*fading: 90
xterm*shading: 50
xterm*inheritPixmap: true
xterm*font: -misc-fixed-medium-r-*-*-12-*-*-*-*--iso10646-1
xterm*scrollBar: false
xterm*saveLines: 30000
xterm*tintColor: gray
SRC

P.S.

Jeśli urxvt wydaje Ci się zbyt spartański to zerknij na terminator’a .

Przeszukiwanie plików danego typu pod kątem tekstu

Kiedyś poproszono mnie o przeszukanie wszystkich plików php na serwerze webowym po kątem wywołania pewnej funkcji. Oczywiste wydało mi się użycie rekurencyjnie grep’a, więc:

grep -R "JAKAS_FUNKCJA" /var/www/*.php

Ale szybko okazało się że grep dopasowuje maskę *.php również do katalogów, więc nie przeszukiwał katalogów które nie kończyły się na .php ehhh…..

Drugie podejście okazało się trafniejsze – najpierw poleceniem find wyszukuję wszystkie pliki php, a dopiero później grepuję (wypisując nazwę pliku i numer linii):

find /var/www/ -iname '*.php' -print0 | xargs -0 -I'{}' sh -c 'grep -iHn "JAKAS_FUNKCJA" "{}"'

Przykładowo wynik:

find /var/www -iname '*.php' -print0 | xargs -0 -I'{}' sh -c 'grep -iHn "eval(" "{}"'
/var/www/*****/wp-admin/press-this.php:208: var my_src = eval(
/var/www/*****/wp-admin/press-this.php:219: var my_src = eval(
/var/www/*****/wp-admin/press-this.php:402: eval(data);
/var/www/*****/wp-admin/includes/class-pclzip.php:4063:// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
/var/www/*****/wp-includes/class-phpmailer.php:1916: //TODO using /e (equivalent to eval()) is probably not a good idea
/var/www/*****/wp-includes/class-json.php:22: * Javascript, and can be directly eval()'ed with no further parsing
/var/www/*****/wp-includes/functions.php:190: if ( doubleval($bytes) >= $mag )

Wysyłanie załączników poleceniem mail

Kiedyś potrzebowałem w ramach testu obciążeniowego wysłać dużo wiadomości z załącznikami. Chciałem to zrobić na szybko z shell’a i tutaj chwilę musiałem pogooglać aby znaleźć działające polecenie. To co znalazłem wygląda tak:

(echo "testowa wiadomosc"; uuencode test.zip test.zip) \
| mail -s "Test" testowy@mail.pl

Wiedząc już jak wysyłać maile z załącznikami, mały mail bombing mogłem zrobić tak:

for i in `seq 1 100`; do
   (cat tekst.txt; uuencode test.zip test.zip) \
   | mail -s "Test $i" testowy@mail.pl;
done