Prosty MTA z heirloom-mailx i ssmtp

Czasami potrzebny jest nam serwer pocztowy, który przyśle informacje dla root’a (np. monity smartd, mdadm, sypnięte crony itp) ale równocześnie nie chcemy stawiać pełnego serwera typu postfix/exim. Warto w tym celu wykorzystać zestaw heirloom-mailx + ssmtp. hairloom-mailx jest prostym shellowym klientem SMTP – przy okazji linkuje polecenie mail (przydatne w skryptach). ssmtp pełni funkcję serwera SMTP ale nie działa jako demon – proces uruchamia się gdy jest potrzebny i znika po wysłaniu maili. Dodatkowo ssmtp może zostać skonfigurowany by wysyłać maile nie tylko przez relay’a ale również autoryzując się na zewnętrznym serwerze pocztowym, np. gmail’u czy gdziekolwiek indziej.

Instalacja

apt-get install ssmtp heirloom-mailx

Konfiguracja z relay’em

Edytujemy plik /etc/ssmtp/ssmtp.conf – w konfiguracji z relay’em wystarczą te linijki:

root=postmaster@domena.pl
mailhub=domena.pl
hostname=serwerek.domena.pl

Warto zwrócić uwagę że dobrze by było aby domena serwerek.domena.pl istniała i wskazywała na nasz serwer – dzięki temu poczta nie odpadnie na prostych filtrach antyspamowych.

Konfiguracja pod gmail’a

W ssmtp.conf potrzebujemy:

root=postmaster@domena.pl
mailhub=smtp.gmail.com:587
hostname=serwerek.domena.pl
AuthUser=twojekonto@gmail.com
AuthPass=twoje_haslo_do_gmaila
UseTLS=YES
UseSTARTTLS=YES
AuthMethod=LOGIN

Test

Warto teraz sprawdzić czy poczta wychodzi jak powinna:

echo test | mail -s "testowa wiadomosc" postmaster@domena.pl

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