You are on page 1of 28

Ruby.

Praktyczne skrypty,
ktre rozwi
trudne problemy
Autor: Steve Pugh
Tumaczenie: Tomasz Walczak, Marek Kowalcze
ISBN: 978-83-246-2254-2
Tytu oryginau: Wicked Cool Ruby Scripts:
Useful Scripts that Solve Difficult Problems
Format: 170x230, stron: 232
Poznaj przyjemno pracy z jzykiem Ruby!
Jak manipulowa acuchami znakw?
Jak edytowa zbiory zdj i wydobywa informacje z fotografii?
Jak zmienia uprawnienia i modyfikowa konta uytkownikw?

Ruby to obiektowy jzyk programowania, przeznaczony do uytku oglnego,


udostpniajcy bogaty zestaw narzdzi sucych do pisania skryptw. Jedn
z najwikszych zalet tego jzyka jest fakt, e wyjtkowo dobrze nadaje si on
do tworzenia efektywnych programw proceduralnych. Dziki tej ksice nauczysz si
wykorzystywa niezwyke waciwoci jzyka Ruby, aby zautomatyzowa wikszo
zada i wykonywa swoj prac bez trudu i z przyjemnoci.
Ksika Ruby. Praktyczne skrypty, ktre rozwi trudne problemy zawiera
58 niezwykle przydatnych skryptw, ktre pozwalaj szybko rozwiza czsto
spotykane problemy, midzy innymi z administrowaniem systemem, manipulowaniem
rysunkami i zarzdzaniem witryn. Przy kadym skrypcie znajdziesz kod, omwienie
jego dziaania i wskazwki opisujce, jak dostosowa rozwizanie do wasnych potrzeb.
Z podrcznika dowiesz si, jak posugiwa si skryptami do automatyzacji zada
(takich jak archiwizowanie czy wypakowywanie plikw), a take na czym polega
szyfrowanie plikw oraz przetwarzanie wiadomoci RSS. Nauczysz si tworzy
zaawansowane roboty sieciowe, skrypty z obszaru zabezpiecze oraz kompletne
biblioteki i aplikacje.
Skrypty do zarzdzania witrynami
Pisanie skryptw sieciowych
Administrowanie systemami Linux i Unix
Walidacja rozwiza symbolicznych
Narzdzia do manipulowania zdjciami
Tworzenie galerii fotografii
Narzdzia do przetwarzania acuchw znakw
Serwery i wydobywanie danych
Argumenty i dokumentacja
Algorytmy sortowania

Skorzystaj z praktycznych skryptw w jzyku Ruby


i oszczdzaj czas, aby pracowa szybko i wydajnie

Spis treci

PRZEDMOWA ........................................................................................... 15
PODZIKOWANIA ................................................................................... 17
WPROWADZENIE ..................................................................................... 19
Odjazdowe skrypty w jzyku Ruby ........................................................................................20
Musisz zna podstawy jzyka Ruby ........................................................................................20
Dokumentacja ........................................................................................................................20
Struktura ksiki i zastosowane podejcie .............................................................................21
Witryna WWW ......................................................................................................................23
1.
NARZDZIA DO UYTKU OGLNEGO .................................................... 25
1. Wyszukiwanie zmodyfikowanych plikw ...........................................................................25
Kod ...............................................................................................................................26
Uruchamianie kodu ......................................................................................................27
Dane wyjciowe ...........................................................................................................27
Jak dziaa ten skrypt? ....................................................................................................28
Modyfikowanie skryptu ................................................................................................29
2. Szyfrowanie pliku ...............................................................................................................30
Kod ...............................................................................................................................30
Uruchamianie kodu ......................................................................................................30
Dane wyjciowe ...........................................................................................................31
Jak dziaa ten skrypt? ....................................................................................................31
Modyfikowanie skryptu ................................................................................................32
3. Odszyfrowywanie pliku ......................................................................................................32
Kod ...............................................................................................................................32
Uruchamianie kodu ......................................................................................................33
Wyniki ..........................................................................................................................33
Jak dziaa ten skrypt? ....................................................................................................33

4. Dzielenie plikw ................................................................................................................ 34


Kod .............................................................................................................................. 34
Uruchamianie kodu ..................................................................................................... 35
Dane wyjciowe .......................................................................................................... 35
Jak dziaa ten skrypt? ................................................................................................... 36
Modyfikowanie skryptu ............................................................................................... 36
5. Scalanie plikw .................................................................................................................. 36
Kod .............................................................................................................................. 37
Uruchamianie kodu ..................................................................................................... 37
Dane wyjciowe .......................................................................................................... 37
Jak dziaa ten skrypt? ................................................................................................... 38
Modyfikowanie skryptu ............................................................................................... 38
6. Przegldarka procesw w systemie Windows .................................................................. 38
Kod .............................................................................................................................. 39
Uruchamianie kodu ..................................................................................................... 39
Dane wyjciowe .......................................................................................................... 39
Jak dziaa ten skrypt? ................................................................................................... 40
Modyfikowanie skryptu ............................................................................................... 40
7. Narzdzie do kompresji plikw ........................................................................................ 41
Kod .............................................................................................................................. 41
Uruchamianie kodu ..................................................................................................... 42
Dane wyjciowe .......................................................................................................... 42
Jak dziaa ten skrypt? ................................................................................................... 42
8. Rozpakowywanie plikw ................................................................................................... 43
Kod .............................................................................................................................. 43
Uruchamianie kodu ..................................................................................................... 44
Dane wyjciowe .......................................................................................................... 44
Jak dziaa ten skrypt? ................................................................................................... 44
9. Kalkulator raty kredytu hipotecznego ............................................................................... 45
Kod .............................................................................................................................. 45
Uruchamianie kodu ..................................................................................................... 45
Dane wyjciowe .......................................................................................................... 45
Jak dziaa ten skrypt? ................................................................................................... 46
Modyfikowanie skryptu ............................................................................................... 46
2.
SKRYPTY DO ZARZDZANIA WITRYNAMI ............................................. 47
10. Weryfikator odnonikw do stron w sieci ...................................................................... 48
Kod .............................................................................................................................. 48
Uruchamianie kodu ..................................................................................................... 49
Dane wyjciowe .......................................................................................................... 49
Jak dziaa ten skrypt? ................................................................................................... 49
Modyfikowanie skryptu ............................................................................................... 50

Spis treci

11. Kontroler osieroconych plikw ........................................................................................51


Kod ...............................................................................................................................51
Uruchamianie skryptu ..................................................................................................52
Dane wyjciowe ...........................................................................................................52
Jak dziaa ten skrypt? ....................................................................................................53
12. Generator formularzy ......................................................................................................53
Kod ...............................................................................................................................54
Uruchamianie kodu ......................................................................................................55
Dane wyjciowe ...........................................................................................................55
Jak dziaa ten skrypt? ....................................................................................................56
Modyfikowanie skryptu ................................................................................................57
13. Parser kanaw RSS ..........................................................................................................57
Kod ...............................................................................................................................57
Uruchamianie kodu ......................................................................................................58
Dane wyjciowe ...........................................................................................................58
Jak dziaa ten skrypt? ....................................................................................................59
Modyfikowanie skryptu ................................................................................................60
14. Grep dla giedy papierw wartociowych ........................................................................60
Kod ...............................................................................................................................60
Uruchamianie kodu ......................................................................................................61
Dane wyjciowe ...........................................................................................................61
Jak dziaa ten skrypt? ....................................................................................................62
Modyfikowanie skryptu ................................................................................................62
15. Generowanie adresw IP .................................................................................................63
Kod ...............................................................................................................................63
Uruchamianie kodu ......................................................................................................64
Dane wyjciowe ...........................................................................................................64
Jak dziaa ten skrypt? ....................................................................................................65
16. Kalkulator masek podsieci ................................................................................................66
Kod ...............................................................................................................................66
Uruchamianie kodu ......................................................................................................66
Dane wyjciowe ...........................................................................................................66
Jak dziaa ten skrypt? ....................................................................................................67
Modyfikowanie skryptu ................................................................................................67
3.
ADMINISTROWANIE SYSTEMAMI LINUX I UNIX ................................... 69
17. Poprawianie nieodpowiednich nazw plikw ....................................................................69
Kod ...............................................................................................................................70
Uruchamianie kodu ......................................................................................................71
Dane wyjciowe ...........................................................................................................71
Jak dziaa ten skrypt? ....................................................................................................71
Modyfikowanie skryptu ................................................................................................72

Spis treci

18. Dodawanie kont uytkownikw ..................................................................................... 72


Kod .............................................................................................................................. 72
Uruchamianie kodu ..................................................................................................... 73
Dane wyjciowe .......................................................................................................... 74
Jak dziaa ten skrypt? ................................................................................................... 74
Modyfikowanie skryptu ............................................................................................... 75
19. Modyfikowanie kont uytkownikw ............................................................................... 75
Kod .............................................................................................................................. 75
Uruchamianie kodu ..................................................................................................... 77
Dane wyjciowe .......................................................................................................... 77
Jak dziaa ten skrypt? ................................................................................................... 78
Modyfikowanie skryptu ............................................................................................... 78
20. Usuwanie zablokowanych procesw .............................................................................. 78
Kod .............................................................................................................................. 79
Uruchamianie kodu ..................................................................................................... 79
Dane wyjciowe .......................................................................................................... 79
Jak dziaa ten skrypt? ................................................................................................... 80
21. Walidacja dowiza symbolicznych ................................................................................. 81
Kod .............................................................................................................................. 82
Uruchamianie kodu ..................................................................................................... 82
Dane wyjciowe .......................................................................................................... 82
Jak dziaa ten skrypt? ................................................................................................... 82
Modyfikowanie skryptu ............................................................................................... 83
4.
NARZDZIA DO MANIPULOWANIA ZDJCIAMI .................................... 85
22. Masowe edytowanie ........................................................................................................ 86
Kod .............................................................................................................................. 86
Uruchamianie kodu ..................................................................................................... 86
Dane wyjciowe .......................................................................................................... 86
Jak dziaa ten skrypt? ................................................................................................... 87
23. Pobieranie informacji o zdjciach .................................................................................... 87
Kod .............................................................................................................................. 88
Uruchamianie kodu ..................................................................................................... 88
Dane wyjciowe .......................................................................................................... 88
Jak dziaa ten skrypt? ................................................................................................... 89
Modyfikowanie skryptu ............................................................................................... 90
24. Tworzenie miniatur ......................................................................................................... 90
Kod .............................................................................................................................. 90
Uruchamianie kodu ..................................................................................................... 91
Dane wyjciowe .......................................................................................................... 91
Jak dziaa ten skrypt? ................................................................................................... 91
Modyfikowanie skryptu ............................................................................................... 92

Spis treci

25. Zmienianie wielkoci zdj ...............................................................................................92


Kod ...............................................................................................................................92
Uruchamianie kodu ......................................................................................................93
Dane wyjciowe ...........................................................................................................93
Jak dziaa ten skrypt? ....................................................................................................93
Modyfikowanie skryptu ................................................................................................94
26. Dodawanie znakw wodnych do zdj ...........................................................................94
Kod ...............................................................................................................................95
Uruchamianie kodu ......................................................................................................95
Dane wyjciowe ...........................................................................................................96
Jak dziaa ten skrypt? ....................................................................................................96
27. Przeksztacanie zdj na czarno-biae ..............................................................................97
Kod ...............................................................................................................................97
Uruchamianie kodu ......................................................................................................98
Dane wyjciowe ...........................................................................................................98
Jak dziaa ten skrypt? ....................................................................................................98
28. Tworzenie galerii fotografii ..............................................................................................98
Kod ...............................................................................................................................99
Uruchamianie kodu ....................................................................................................100
Dane wyjciowe .........................................................................................................100
Jak dziaa ten skrypt? ..................................................................................................100
Modyfikowanie skryptu ..............................................................................................102
5.
GRY I NARZDZIA WSPOMAGAJCE UCZENIE SI ............................... 103
29. Rozwizywanie amigwek Sudoku ..............................................................................103
Kod .............................................................................................................................104
Uruchamianie kodu ....................................................................................................105
Dane wyjciowe .........................................................................................................105
Jak dziaa ten skrypt? ..................................................................................................106
30. Fiszki ..............................................................................................................................107
Kod .............................................................................................................................107
Uruchamianie kodu ....................................................................................................108
Dane wyjciowe .........................................................................................................108
Jak dziaa ten skrypt? ..................................................................................................108
Modyfikowanie skryptu ..............................................................................................109
31. Gra w zgadywanie numerw .........................................................................................109
Kod .............................................................................................................................109
Uruchamianie kodu ....................................................................................................110
Dane wyjciowe .........................................................................................................110
Jak dziaa ten skrypt? ..................................................................................................111
32. Kamie, papier, noyce ..................................................................................................111
Kod .............................................................................................................................111
Uruchamianie kodu ....................................................................................................112

Spis treci

Dane wyjciowe ........................................................................................................ 112


Jak dziaa ten skrypt? ................................................................................................. 113
Modyfikowanie skryptu ............................................................................................. 113
33. Rozsypanka wyrazowa .................................................................................................. 113
Kod ............................................................................................................................ 114
Uruchamianie kodu ................................................................................................... 114
Dane wyjciowe ........................................................................................................ 115
Jak dziaa ten skrypt? ................................................................................................. 115
34. Szubienica ...................................................................................................................... 116
Kod ............................................................................................................................ 116
Uruchamianie kodu ................................................................................................... 117
Dane wyjciowe ........................................................................................................ 117
Jak dziaa ten skrypt? ................................................................................................. 118
35. winia gra w koci .................................................................................................... 118
Kod ............................................................................................................................ 119
Uruchamianie kodu ................................................................................................... 120
Dane wyjciowe ........................................................................................................ 120
Jak dziaa ten skrypt? ................................................................................................. 122
Modyfikowanie skryptu ............................................................................................. 123
6.
NARZDZIA DO PRZETWARZANIA ACUCHW ZNAKW .............. 125
36. Generator dokumentw PDF ....................................................................................... 125
Kod ............................................................................................................................ 126
Uruchamianie kodu ................................................................................................... 127
Dane wyjciowe ........................................................................................................ 127
Jak dziaa ten skrypt? ................................................................................................. 127
37. Zliczanie wystpie sw ............................................................................................... 129
Kod ............................................................................................................................ 129
Uruchamianie kodu ................................................................................................... 130
Dane wyjciowe ........................................................................................................ 130
Jak dziaa ten skrypt? ................................................................................................. 130
Modyfikowanie skryptu ............................................................................................. 131
38. Parser plikw CSV ......................................................................................................... 131
Kod ............................................................................................................................ 132
Uruchamianie kodu ................................................................................................... 133
Dane wyjciowe ........................................................................................................ 133
Jak dziaa ten skrypt? ................................................................................................. 133
Modyfikowanie skryptu ............................................................................................. 134
39. Przeksztacanie plikw CSV na XML ............................................................................ 134
Kod ............................................................................................................................ 135
Uruchamianie kodu ................................................................................................... 135
Dane wyjciowe ........................................................................................................ 135
Jak dziaa ten skrypt? ................................................................................................. 136
Modyfikowanie skryptu ............................................................................................. 137
10

Spis treci

40. Program grep napisany w jzyku Ruby ..........................................................................137


Kod .............................................................................................................................137
Uruchamianie kodu ....................................................................................................138
Dane wyjciowe .........................................................................................................138
Jak dziaa ten skrypt? ..................................................................................................138
Modyfikowanie skryptu ..............................................................................................139
41. Sprawdzanie siy hasa ....................................................................................................139
Kod .............................................................................................................................139
Uruchamianie kodu ....................................................................................................140
Dane wyjciowe .........................................................................................................140
Jak dziaa ten skrypt? ..................................................................................................140
Modyfikowanie skryptu ..............................................................................................142
7.
SERWERY I WYDOBYWANIE DANYCH ................................................... 143
42. Definicje .........................................................................................................................143
Kod .............................................................................................................................144
Uruchamianie kodu ....................................................................................................144
Dane wyjciowe .........................................................................................................145
Jak dziaa ten skrypt? ..................................................................................................145
Modyfikowanie skryptu ..............................................................................................146
43. Automatyczne wysyanie SMS-w .................................................................................146
Kod .............................................................................................................................146
Uruchamianie kodu ....................................................................................................147
Dane wyjciowe .........................................................................................................147
Jak dziaa ten skrypt? ..................................................................................................147
44. Wydobywanie odnonikw ............................................................................................148
Kod .............................................................................................................................148
Uruchamianie kodu ....................................................................................................149
Dane wyjciowe .........................................................................................................149
Jak dziaa ten skrypt? ..................................................................................................150
Modyfikowanie skryptu ..............................................................................................151
45. Wydobywanie rysunkw ................................................................................................151
Kod .............................................................................................................................151
Uruchamianie kodu ....................................................................................................152
Dane wyjciowe .........................................................................................................152
Jak dziaa ten skrypt? ..................................................................................................152
Modyfikowanie skryptu ..............................................................................................153
46. Narzdzie do wydobywania danych ze stron WWW ....................................................153
Kod .............................................................................................................................153
Uruchamianie kodu ....................................................................................................154
Dane wyjciowe .........................................................................................................154
Jak dziaa ten skrypt? ..................................................................................................155

Spis treci

11

47. Szyfrowanie po stronie klienta ...................................................................................... 155


Kod ............................................................................................................................ 155
Uruchamianie kodu ................................................................................................... 156
Dane wyjciowe ........................................................................................................ 156
Jak dziaa ten skrypt? ................................................................................................. 156
48. Szyfrowanie po stronie serwera .................................................................................... 157
Kod ............................................................................................................................ 157
Uruchamianie kodu ................................................................................................... 158
Dane wyjciowe ........................................................................................................ 159
Jak dziaa ten skrypt? ................................................................................................. 159
8.
ARGUMENTY I DOKUMENTACJA .......................................................... 161
49. Bezpieczestwo plikw ................................................................................................. 162
Kod ............................................................................................................................ 162
Uruchamianie kodu ................................................................................................... 164
Dane wyjciowe ........................................................................................................ 164
Jak dziaa ten skrypt? ................................................................................................. 165
50. Wydobywanie danych ze stron WWW ......................................................................... 166
Kod ............................................................................................................................ 166
Uruchamianie kodu ................................................................................................... 168
Dane wyjciowe ........................................................................................................ 169
Jak dziaa ten skrypt? ................................................................................................. 169
51. Narzdzia do zarzdzania zdjciami .............................................................................. 170
Kod ............................................................................................................................ 170
Uruchamianie kodu ................................................................................................... 175
Dane wyjciowe ........................................................................................................ 175
Jak dziaa ten skrypt? ................................................................................................. 176
Wnioski ................................................................................................................................ 176
9.
ALGORYTMY SORTOWANIA .................................................................. 177
52. Sortowanie bbelkowe .................................................................................................. 178
Kod ............................................................................................................................ 178
Uruchamianie kodu ................................................................................................... 179
Dane wyjciowe ........................................................................................................ 179
Jak dziaa ten skrypt? ................................................................................................. 179
53. Sortowanie przez wybieranie ........................................................................................ 180
Kod ............................................................................................................................ 181
Uruchamianie kodu ................................................................................................... 181
Dane wyjciowe ........................................................................................................ 181
Jak dziaa ten skrypt? ................................................................................................. 182
54. Sortowanie Shella .......................................................................................................... 182
Kod ............................................................................................................................ 182
Uruchamianie kodu ................................................................................................... 183
12

Spis treci

Dane wyjciowe .........................................................................................................183


Jak dziaa ten skrypt? ..................................................................................................184
55. Sortowanie przez scalanie ..............................................................................................184
Kod .............................................................................................................................184
Uruchamianie kodu ....................................................................................................186
Dane wyjciowe .........................................................................................................186
Jak dziaa ten skrypt? ..................................................................................................186
56. Sortowanie stogowe ......................................................................................................186
Kod .............................................................................................................................187
Uruchamianie kodu ....................................................................................................188
Dane wyjciowe .........................................................................................................188
Jak dziaa ten skrypt? ..................................................................................................188
57. Sortowanie szybkie ........................................................................................................189
Kod .............................................................................................................................189
Uruchamianie kodu ....................................................................................................190
Dane wyjciowe .........................................................................................................190
Jak dziaa ten skrypt? ..................................................................................................190
58. Sortowanie przez wycinanie ..........................................................................................191
Kod .............................................................................................................................191
Uruchamianie kodu ....................................................................................................193
Dane wyjciowe .........................................................................................................193
Jak dziaa ten skrypt? ..................................................................................................193
Komentarz na temat wydajnoci ..........................................................................................194
10.
TWORZENIE W JZYKU RUBY
MODUU PLATFORMY METASPLOIT 3.1 .............................................. 197
Wprowadzenie do platformy Metasploit .............................................................................198
Instalowanie .........................................................................................................................198
Pisanie moduu .....................................................................................................................199
Budowanie exploita ..............................................................................................................201
Obserwowanie ataku w czasie rzeczywistym ......................................................................202
Omwienie moduu powoki platformy Metasploit .............................................................205
Okrelanie dugoci danych uytkowych ..............................................................................207
POSOWIE .............................................................................................. 219
SKOROWIDZ .......................................................................................... 221

Spis treci

13

7
Serwery
i wydobywanie danych
MOCN STRON JZYKA RUBY JEST MOLIWO UYCIA GO DO ZAUTOMATYZOWANIA INTERAKCJI Z ZASOBAMI SIECI WWW. TEN ROZDZIA
ZAWIERA KRTKIE OMWIENIE PROCESU PRZETWARZANIA STRON

WWW I KOCZY SI ZBIOREM DZIAajcych po stronie klienta oraz


serwera skryptw, ktre su do bezpiecznego przekazywania
i uruchamiania polece. Interakcja z sieci WWW i wydobywanie z niej
informacji (czyli tak zwany data mining) s wane z uwagi na bogactwo dostpnych
w niej materiaw. Zamiast wydobywa zoto, uytkownicy szukaj rnych sposobw na pobranie wanych danych i przeksztacenie ich na znaczce informacje.

42. Definicje
define.rb

Ten skrypt kieruje zapytanie do witryny http://www.dictionary.com/ i pobiera


pierwsz definicj sowa wskazanego przez uytkownika. Podobnie jak w przypadku innych programw komunikujcych si z sieci WWW istnieje ryzyko,
e skrypt przestanie dziaa, jeli projektanci witryny wprowadz w niej zmiany.

Zadanie programu polega na wydobywaniu okrelonych danych. Uyem witryny


Dictionary.com tylko jako rodka do zaprezentowania tego mechanizmu, jednak
omawiany przykad to pomysowe rozwizanie.

Kod
require "open-uri"
unless ARGV[0]
puts "Musisz poda definiowane sowo."
puts "Sposb uycia: ruby define.rb <definiowane sowo>"
exit
end
word = ARGV[0].strip
url = "http://dictionary.reference.com/browse/#{word}"
begin
open(url) do |source|
source.each_line do |x|
if x =~ /No results found/
puts "\nDefinicji nie znaleziono - sprawd pisowni."
exit
end
if x =~ /(1\.)<\/td> <td>(.*)<\/td/
puts "\n#{$1} #{$2}"
exit
end
end
puts "Niestety, nie mona znale definicji."
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end

Uruchamianie kodu
Uruchom skrypt przez wpisanie nastpujcej instrukcji:
ruby define.rb definiowane_sowo

Chciaem znale definicj sowa Ruby. Niestety, pierwsze zwrcone objanienie nie brzmiao najbardziej odjazdowy jzyka programowania.

144

Rozdzia 7

Dane wyjciowe
Skrypt wywietla definicj podanego sowa. Jeli nie mona jej znale, program
prosi uytkownika o sprawdzenie pisowni. Moliwe, e podany wyraz w ogle nie
istnieje.
1.a red variety of corundum, used as a gem.

Jak dziaa ten skrypt?


Ponownie wykorzystaem tu fantastyczn bibliotek open-uri . Do komunikacji
skryptu z sieci WWW mona uywa wielu przydatnych narzdzi tego typu. Ja
lubi open-uri, poniewa ukrywa wicej szczegw procesu czenia si z sieci
ni inne biblioteki. Po doczeniu biblioteki program sprawdza bdy. Mam nadziej,
e przyzwyczaie si ju do uywanego bloku kodu. W pierwszej zmiennej (word)
skrypt zapisuje sowo, ktrego definicj uytkownik chce znale . Nastpnie
program przypisuje do zmiennej url zapisany na stae adres URL serwisu Dictionary.com z doczonym wyrazem podanym jako argument . Budowa uywanej
witryny sprawia, e doczenie sowa do adresu powoduje automatyczne zwrcenie definicji.
W dalszej czci skryptu znajduje si instrukcja begin/rescue, potrzebna
z uwagi na zmienn natur da sieciowych. Odpowiedzi na dania HTTP czsto
zawieraj komunikaty o bdach. Ich waciwa obsuga to klucz do prawidowego
dziaania tego skryptu. Po dodaniu siatki zabezpieczajcej w postaci bloku begin/
rescue mona wysa do serwisu Dictionary.com prob o podanie definicji.
Kiedy korzystasz z biblioteki open-uri, wystarczy, e wpiszesz instrukcj open()
z adresem URL, a skrypt zwrci odpowiedni stron WWW . Pobieranie stron
za pomoc tej metody jest tak proste, e zawsze kiedy jej uywam, na mojej twarzy
goci umiech.
Po metodzie open nastpuje blok, ktry przetwarza kod rdowy zwrcony
przez serwer sieciowy. Poniewa chcemy pobra specyficzny wiersz (definicj
sowa), w nastpnym bloku skrypt dzieli kod rdowy na wiersze. Jeli serwis
Dictionary.com nie znajdzie danego sowa, wywietli komunikat No results found.
Gdy skrypt w czasie analizowania kodu rdowego wykryje podany wyraz, ale ju
nie jego definicj, wywietli wskazwk w postaci proby o sprawdzenie pisowni
sowa, a nastpnie zakoczy dziaanie . Jeeli jednak definicja jest dostpna,
skrypt stara si wyodrbni j z kodu rdowego. Do pobrania jej tekstu suy
wyraenie regularne.
Wan czci uytego w skrypcie wyraenia regularnego jest cyfra 1. Witryna
Dictionary.com uywa jej jako wskanika pierwszej definicji, ktr program ma
pobra. Uycie w wyraeniu regularnym nawiasw umoliwia skryptowi pogrupowanie okrelonych fragmentw dowolnego wiersza, ktre pasuj do wyraenia .
Te grupy s zapisywane w zmiennych o nazwach od $1 do $n. Wiersz pod wyraeniem regularnym wywietla definicj. Jeli program nie znajdzie w kodzie
rdowym ani definicji, ani tekstu No results found, zwrci inny komunikat, ktry

Serwery i wydobywanie danych

145

informuje uytkownika o tym, e nie mona znale wyjanienia sowa . Jeli


w czasie przetwarzania definicji pojawi si problemy, program uruchomi blok
rescue i poinformuje, jaki bd wystpi.

Modyfikowanie skryptu
Jednym ze sposobw na zmodyfikowanie skryptu jest dodanie obsugi porednika midzy uytkownikiem a daniem do serwera sieciowego. Jeli korzystasz
z takiego porednika, musisz zastosowa to rozwizanie. Jeeli interesuje Ci
ruch w sieci generowany przez skrypt w jzyku Ruby, porednik pomoe Ci
uzyska dodatkowe informacje. Aby dowiedzie si, jak je uzyska, zajrzyj do dokumentacji biblioteki open-uri. Potrzebna skadnia wyglda nastpujco: open(url,
:proxy => "http://127.0.0.1:8080"). Zwykle nie korzystam z porednika przy
przegldaniu sieci WWW, jednak jeli w trakcie tworzenia stron wykryj bdy,
czsto pomocne jest przyjrzenie si ruchowi w sieci.
Do diagnozowania problemw uywam bezpatnego sieciowego porednika
Paros (http://www.parosproxy.org/). Narzdzie to naley zainstalowa lokalnie na
wasnej maszynie, a nastpnie mona obserwowa zgaszane dania sieciowe
i odbierane odpowiedzi. Dziki wykorzystaniu przy programowaniu narzdzia
Paros zaoszczdziem sobie wielu godzin diagnozowania. Jestem bardzo przywizany do tego porednika, jednak istnieje te wiele innych podobnych programw,
dlatego warto poszuka czego dla siebie.

43. Automatyczne wysyanie SMS-w


sms.rb

Ten skrypt wysya wiadomo SMS pod podany numer telefonu komrkowego.
Ostrzegam przed naduywaniem tej funkcji, jednak musisz wyprbowa ten program1. Skrypt ma automatyzowa korzystanie z witryny, ktra suy do wysyania
wiadomoci SMS. Zamiast pobiera statyczn zawarto strony, skrypt ten automatyzuje wypenianie i przesyanie formularza.

Kod
require 'win32ole'
ie = WIN32OLE.new('InternetExplorer.Application')
ie.navigate("http://toolbar.google.com/send/sms/index.php")
ie.visible = true
sleep 1 until ie.readyState() == 4
ie.document.all["mobile_user_id"].value ="5712013623"
1

Serwis uyty w tym skrypcie zakoczy dziaalno, jednak za pomoc tej samej techniki moesz przesya
wiadomoci w innych bramkach SMS przyp. tum.

146

Rozdzia 7

ie.document.all["carrier"].value ="TMOBILE"
ie.document.all["subject"].value ="***Ruby rzdzi***"
ie.document.all.tags("textarea").each do |i|
i.value = "Dziki za dobr robot, Matz!"
end
ie.document.all.send_button.click

Uruchamianie kodu
Aby uruchomi ten skrypt, wpisz nastpujce polecenie:
ruby sms.rb

Dane wyjciowe
Ten skrypt nie generuje adnych danych, jednak jeli udanie zakoczy dziaanie,
telefon o podanym numerze powiadomi Ci o odebraniu wiadomoci. W przykadzie uyem fikcyjnych danych, jednak moesz je zmieni, aby wyprbowa
program.

Jak dziaa ten skrypt?


Jeli korzystasz z komputera z systemem Windows i nigdy nie uywae biblioteki
win32ole, powiniene powici troch czasu na jej opanowanie, poniewa automatyzowanie wykonywania zada w tym systemie jest ciekawe i daje duo satysfakcji. Moesz nie tylko manipulowa przegldark Internet Explorer, co ilustruje
ten skrypt, ale te dowolnym produktem z pakietu Microsoft Office i innymi
aplikacjami systemu Windows.
UWAGA

Dostpnych jest te kilka bibliotek przeznaczonych do automatyzacji witryn. Narzdzia te s niezwykle przydatne do testw regresji i jakoci aplikacji sieciowych.
Jedn z popularnych bibliotek tego typu jest Watir. Szczegowe informacje na jej
temat znajdziesz na stronie http://wtr.rubyforge.org/.
Skrypt tworzy nowy obiekt typu win32ole na podstawie argumentu w postaci
uchwytu przegldarki IE . Uchwyt ten informuje bibliotek win32ole, ktr
aplikacj ma kontrolowa. Przy uyciu wbudowanej w przegldark IE metody
navigate skrypt przechodzi pod okrelony adres URL http://toolbar.google.com/
send/sms/index.php . Nastpny wiersz ustawia atrybut okna przegldarki. Jeli
nie chcesz widzie, jak skrypt wykonuje swe zadania, moesz uy w tym wierszu
wartoci false, a okno przegldarki bdzie dziaa w tle. Wtedy jego obecno
bdziesz mg wykry tylko na licie zada. Poniewa lubi widzie dziaanie
programu, ustawiem wspomniany atrybut na true. Aplikacja Internet Explorer
pojawi si i zniknie w krtkim czasie, dlatego bacznie przygldaj si ekranowi.

Serwery i wydobywanie danych

147

Nastpnie skrypt uruchamia ptl, ktra warunkowo wczytuje stron. Jak


pewnie wiesz, strony witryn nie pojawiaj si natychmiast. Aby skrypt nie przesa informacji przedwczenie, naley upi program na sekund, a nastpnie
sprawdzi, czy kod readyState ma waciw warto (4) . Przedwczesne dziaania
nigdy nie s korzystne, a w tym przypadku spowoduj, e skrypt przestanie dziaa.
Po zakoczeniu wczytywania dokumentu przez przegldark IE skrypt moe
wypeni odpowiednie pola.
Program wykrywa odpowiednie pola na podstawie nazw atrybutw. Jeli zajrzysz do kodu rdowego witryny, znajdziesz obiekty o nazwach mobile_user_id,
carrier, subject i tak dalej. Te informacje su do okrelenia, gdzie skrypt ma
zapisa poszczeglne dane wejciowe . Wikszo kodu HTML z omawianej
witryny jest zgodna ze standardami, jednak z nieznanych przyczyn warto atrybutu
name obszaru tekstowego nie znajduje si w cudzysowach. Oznacza to, e nie
mona uy wczeniej zastosowanej metody, aby uzyska dostp do tego obszaru.
Jednak poniewa w kodzie rdowym znajduje si tylko jeden obszar tekstowy,
wystarczy go znale i zapisa w nim odpowiednie dane. Nie jest to wymylna
technika, ale nieco rni si od zastosowanego wczeniej podejcia .
Po dodaniu informacji trzeba tylko wirtualnie klikn przycisk do wysyania
formularza. Programici firmy Google prawidowo nazywaj przyciski, dlatego
wystarczy pobra odpowiedni nazw i uy jej w metodzie click . I to ju
wszystko jzyk Ruby jest fantastyczny!

44. Wydobywanie odnonikw


linkScrape.rb

Wydobywanie odnonikw ze stron WWW ma wiele zastosowa. Mona to zrobi podobnie jak w przypadku innych zada na wiele sposobw. W rozdziale 2. zobaczye skrypt do sprawdzania poprawnoci odnonikw w witrynie.
Z uwagi na konieczno walidacji odsyaczy program ten wymaga wikszej liczby
wierszy kodu ni skrypt, ktry musi tylko wydoby wszystkie odnoniki. Nie
zamierzam tworzy tu robota sieciowego, jednak opisz kilka jego podstawowych
komponentw. Pierwszy z nich to mechanizm wydobywania odnonikw.

Kod
require 'mechanize'
unless ARGV[0]
puts "Musisz poda adres witryny."
puts "Sposb uycia: ruby linkScrape.rb <przetwarzany adres URL>"
exit
end
agent = WWW::Mechanize.new
agent.set_proxy('localhost',8080)

148

Rozdzia 7

begin
page = agent.get(ARGV[0].strip)
page.links.each do |l|
if l.href.split("")[0] =='/'
puts "#{ARGV[0]}#{l.href}"
else
puts l.href
end
end
rescue => e
puts "Wystpi bd."
puts e
retry
end

Uruchamianie kodu
W celu uruchomienia skryptu wpisz nastpujce polecenie:
ruby linkScrape.rb http://przetwarzany_adres_url.com/

Dane wyjciowe
Skrypt wywietla list wszystkich odnonikw znalezionych na stronie o podanym adresie URL. Ja wydobyem odsyacze ze strony http://www.nostarch.com/
main_menu.htm.
index.htm
catalog.htm
wheretobuy.htm
about.htm
jobs.htm
media.htm
http://www.nostarch.com/blog/
http://ww6.aitsafe.com/cf/
review.cfm?userid=8948354
abs_bsd2.htm
openbsd.htm
freebsdserver.htm
debian.htm
howlinuxworks.htm
appliance.htm
lcbk2.htm
lme.htm
nongeeks.htm
lps.htm

interactive.htm
gimp.htm
inkscape.htm
js2.htm
eblender.htm
oophp.htm
wpdr.htm
webbots.htm
google.htm
growingsoftware.htm
rootkits.htm
hacking2.htm
voip.htm
firewalls.htm
securityvisualization.htm
silence.htm
stcb4.htm
scsi2.htm cisco.htm
cablemodem.htm

Serwery i wydobywanie danych

149

mug.htm
ubuntu_3.htm
imap.htm
pf.htm
postfix.htm
webmin.htm
endingspam.htm
cluster.htm
nagios.htm
nagios_2e.htm
pgp.htm
packet.htm
tcpip.htm
assembly.htm
debugging.htm
qt4.htm
vb2005.htm
vsdotnet.htm
codecraft.htm
hownotc.htm
idapro.htm
mugperl.htm
gnome.htm
plg.htm
ruby.htm
vbexpress.htm
wcj.htm
wcps.htm
wcphp.htm
wcruby.htm
wcss.htm
greatcode.htm
greatcode2.htm
wpc.htm

xbox.htm
insidemachine.htm
nero7.htm
wireless.htm
creative.htm
ebaypg.htm
ebapsg.htm
geekgoddess.htm
wikipedia.htm
indtb.htm
sayno.htm
networkknowhow.htm
sharing.htm
apple2.htm
newmac.htm
cult_mac.htm
ipod.htm
art_of_raw.htm
firstlego.htm
flego.htm
legotrains.htm
sato.htm
nxt.htm
nxtonekit.htm
zoo.htm
legobuilder.htm
nxtig.htm
vlego.htm
mg_databases.htm
mg_statistics.htm
eli.htm
index.htm

Jak dziaa ten skrypt?


Porwnaj kod tego programu ze skryptem 10. Weryfikator odnonikw do stron
w sieci. Wida du rnic, prawda? Zawsze warto przemyle problem i stara
si rozwiza go w najprostszy moliwy sposb. Niektre z najbardziej eleganckich rozwiza w ogle nie s skomplikowane. Przedstawiony skrypt jedynie
wydobywa odnoniki ze strony bez sprawdzania ich poprawnoci i wykonywania
innych zada. Biblioteka mechanize to nastpne narzdzie czsto uywane do
interakcji z internetem . Skrypt po standardowej instrukcji do obsugi bdw
tworzy nowy obiekt agent typu mechanize . Aby dostosowa ten obiekt do potrzeb
programisty, program ustawia atrybut porednika na lokalny program Paros,
150

Rozdzia 7

ktrego uywam. Jeli nie chcesz korzysta z narzdzia tego rodzaju, usu ten wiersz
kodu. Nastpnie skrypt uywa metody get obiektu agent do pobrania zawartoci
strony . Ciekaw cech biblioteki mechanize jest automatyczne kategoryzowanie
pobranych informacji. Wyszukiwanie specyficznych elementw strony za pomoc
tej biblioteki znacznie uatwia ycie programistom jzyka Ruby.
W zmiennej page znajduje si tablica links. Dziki bibliotece mechanize odnoniki s ju przetworzone. Podobnie jak przy korzystaniu z kadej innej tablicy
mona uy metody each do przejcia po wszystkich elementach tablicy links.
Pamitaj, e elementy link zawieraj nie tylko adres URL kadego odnonika, ale
te inne atrybuty zdefiniowane w kodzie rdowym. Tu potrzebny jest tylko
atrybut href, aby skrypt mg wywietli go w konsoli . Jeli chcesz wydoby
informacje z duej witryny, powiniene zapisa dane w pliku, ale wybr podejcia
naley do Ciebie. Po wywietleniu odnonikw skrypt koczy dziaanie.

Modyfikowanie skryptu
Istnieje kilka innych ciekawych narzdzi sieciowych, ktre przetwarzaj strony
w podobny sposb. S to na przykad Hpricot (http://wiki.github.com/why/hpricot/)
i Rubyful Soup (http://www.crummy.com/software/RubyfulSoup/). Wyprbuj je,
aby znale narzdzie dostosowane do wasnych potrzeb.

45. Wydobywanie rysunkw


imageScrape.rb

Ten skrypt wydobywa kady rysunek ze strony o adresie URL podanym przez
uytkownika. Pobierane pliki graficzne obejmuj obrazki znajdujce si na serwerze danej strony, a take rysunki doczane z innych serwerw sieciowych.

Kod
require "open-uri"
require "pathname"
unless ARGV[0]
puts "Musisz poda adres URL, aby wydoby rysunki."
puts "Sposb uycia: ruby imageScrape.rb <przetwarzany adres URL>"
exit
end
url = ARGV[0].strip
begin
open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5; Windows
98)")
do |source|
source.each_line do |x|
if x =~ /<img src="(.+.[jpeg|gif])"\s+/
name = $1.split('"').first

Serwery i wydobywanie danych

151

name = url + name if Pathname.new(name).absolute?


copy = name.split('/').last
File.open(copy, 'wb') do |f|
f.write(open(name).read)
end
end
end
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e

Uruchamianie kodu
Uruchom skrypt przez wpisanie poniszej instrukcji:
ruby imageScrape.rb http://przetwarzany_adres_url.com/

Dane wyjciowe
Ten skrypt pobiera wszystkie rysunki znalezione na stronie o podanym adresie
URL. Ja wczyem przetwarzanie strony http://www.ruby-lang.org/ i pobraem
dwa obrazki: logo.gif (logo jzyka Ruby) i download.gif (rysunek-odnonik, ktry
pozwala pobra jzyk Ruby).

Jak dziaa ten skrypt?


Pierwszy etap wydobywania rysunkw polega na pobraniu caej strony. Przy
uyciu metody open biblioteki open-uri mona wygodnie zapisa kod rdowy
strony w zmiennej source . Jak sobie pewnie przypominasz z czasw pisania
kodu w jzyku HTML, rysunki w dokumentach sieciowych s zagniedane za
pomoc znacznikw <img src=plik.jpg>. W tym skrypcie uyem wyraenia regularnego, ktre analizuje kady wiersz kodu rdowego i wyszukuje podobne znaczniki . Dziki danym zwrconym przez wyraenie regularne program moe
okreli lokalizacj znalezionych obrazkw.
Po ustaleniu lokalizacji rysunku trzeba okreli, czy obrazek pochodzi z zewntrznej, czy z przetwarzanej witryny. W kodzie HTML rysunki z lokalnego
serwera sieciowego s zwykle poprzedzone ukonikiem (ich adres ma posta
cieki bezwzgldnej). W kodzie ciek do obrazka zawiera zmienna name. Jeli
jest to cieka bezwzgldna, skrypt docza j do adresu URL strony, aby utworzy
kompletny adres rysunku. Sprawdzanie rodzaju cieki odbywa si przy uyciu
metody absolute? i ma miejsce przy tworzeniu nowego obiektu typu Pathname .
Cho cieka do rysunku moe si zmieni, jego nazwa jest staa i znajduje si
w zmiennej copy .
Po utworzeniu poprawnego adresu rysunku skrypt wykorzystuje obsug
plikw wirtualnych, ktr zapewnia biblioteka open-uri, w celu wczytania obrazka
152

Rozdzia 7

i zapisania go w pliku (jego nazw zawiera zmienna copy) . Ten proces naley
powtrzy dla kadego rysunku znalezionego w dokumencie. Efekt tych operacji
skrypt zapisuje w katalogu, w ktrym zosta uruchomiony.

Modyfikowanie skryptu
Moesz uy gotowego parsera kodu HTML, takiego jak mechanize, Hpricot lub
Rubyful Soup. Te narzdzia dziaaj jeszcze dokadniej ni wyraenie regularne
zastosowane w skrypcie. Ponadto moesz zapisa rysunki w takiej samej strukturze
katalogw, w jakiej znajdoway si na serwerze sieciowym. Istnieje wiele rnych
moliwoci, a ten skrypt to dobry punkt wyjcia.

46. Narzdzie do wydobywania danych


ze stron WWW
scrape.rb

Scraping w swej najprostszej postaci polega na wydobywaniu danych z innych


witryn za pomoc standardowych zapyta HTTP. Przeznaczony do tego skrypt to
wzbogacona wersja poprzednich programw. Program ten czy omwione wczeniej techniki i udostpnia kilka dodatkowych funkcji. Jest to uniwersalne narzdzie do prostego pobierania danych ze stron. Nie jest to bot, poniewa wszystkie
dziaania skryptu wymagaj interakcji z uytkownikiem, jednak po wprowadzeniu
kilku drobnych usprawnie program ten mona w peni zautomatyzowa.

Kod
require 'rio'
require 'open-uri'
require 'uri'
unless ARGV[0] and ARGV[1]
puts "Musisz okreli operacj i adres URL."
puts "Sposb uycia: scrape.rb [strona|rysunki|linki] <przetwarzany
adres URL>"
exit
end
case ARGV[0]
when "strona"
rio(ARGV[1]) > rio("#{URI.parse(ARGV[1].strip).host}.html")
exit
when "rysunki"
begin
open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5;
Windows 98)") do |source|
source.each_line do |x|

Serwery i wydobywanie danych

153

if x =~ /<img src="(.+.[jpeg|gif])"\s+/
name = $1.split('"').first
name = url + name if Pathname.new(name).absolute?
copy = name.split('/').last
File.open(copy, 'wb') do |f|
f.write(open(name).read)
end
end
end
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end
exit
when "linki"
links = File.open("links.txt","w+b")
begin
open(ARGV[1], "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5;
Windows 98)") do |source|
links.puts URI.extract(source, ['http', 'https'])
end
rescue => e
puts "Wystpi bd sprbuj ponownie."
puts e
end
links.close
exit
else
puts "Podae nieprawidow instrukcj sprbuj ponownie."
puts "Sposb uycia: scrape.rb [strona|rysunki|linki] <przetwarzany
adres URL>"
exit
end

Uruchamianie kodu
Aby uruchomi skrypt, wpisz nastpujce polecenie:
ruby scrape.rb [strona|rysunki|linki] http://przetwarzany_adres_url.com/

Dane wyjciowe
Dane wyjciowe skryptu s rne w zalenoci od wybranej instrukcji. Moesz
zapozna si z przykadem z poprzedniego programu.

154

Rozdzia 7

Jak dziaa ten skrypt?


Skrypt udostpnia trzy opcje. Moesz pobra dane za pomoc instrukcji linki,
rysunki lub strona. Do obsugi tych opcji suy instrukcja case . Mona te
zastosowa blok if/else, jednak polecenie case jest bardziej przejrzyste. Jeli uytkownik chce pobra stron, skrypt uywa instrukcji rio do skopiowania kodu
rdowego dokumentu do pliku HTML na lokalnym komputerze . Polecenie
rio obsuguje tak wiele szczegowych, mudnych operacji, e zadanie to mona
wykona w jednym wierszu kodu!
Nastpny blok wydobywa rysunki . Ta sekcja to kopia kodu ze skryptu 45.
Wydobywanie rysunkw, dlatego nie bd szczegowo omawia tego fragmentu.
Jeli chcesz dowiedzie si czego wicej, zajrzyj do opisu poprzedniego programu.
Ostatni fragment instrukcji case wydobywa odnoniki. W odrnieniu od innych
czci skryptu w tej zrezygnowaem ze stosowania gotowych rozwiza, aby przedstawi inny sposb pobierania adresw URL. W tym podejciu do pobierania
kodu rdowego suy metoda open biblioteki open-uri , a nastpnie skrypt
wywouje metod URI.extract, ktra wyszukuje odsyacze HTTP i HTTPS .
Wyniki program zapisuje w pliku tekstowym links.txt.

47. Szyfrowanie po stronie klienta


RSA_client.rb

W opisach technologii informacyjnych i zabezpiecze czsto powtarzaj si trzy


zasady: poufnoci, integralnoci i dostpnoci. Kady z tych komponentw wpywa
na sposb interakcji uytkownika z danymi. Dwa nastpne skrypty maj wbudowane szyfrowanie RSA, co zapewnia poufno, i kodowanie SHA1, gwarantujce
integralno informacji. Do przesyania danych w tym programach suy sieciowe
poczenie TCP.

Kod
require 'socket'
require 'digest/sha1'
begin
print "Uruchamianie klienta..."
client = TCPSocket.new('localhost', 8887)
puts "nawizano poczenie!\n\n"
temp = ""
5.times do
temp << client.gets
end
puts "Otrzymano 1024-bitowy klucz publiczny RSA!\n\n"
public_key = OpenSSL::PKey::RSA.new(temp)

Serwery i wydobywanie danych

155

msg = 'mpg123*"C:\Program Files\Windows Media


Player\mplayer2.exe"*ruby.mp3'
sha1 = Digest::SHA1.hexdigest(msg)
command = public_key.public_encrypt("#{sha1}*#{msg}")
print "Przesyanie polecenia..."
client.send(command,0)
puts "wysane!"
rescue => e
puts "Wystpi powany problem..."
puts e
retry
end
client.close

Uruchamianie kodu
Aby wczy skrypt, wpisz nastpujc instrukcj:
ruby RSA_client.rb

Dane wyjciowe
Poniej znajduj si dane wyjciowe, wywietlane po udanym nawizaniu poczenia i przesaniu polecenia.
Uruchamianie klienta...nawizano poczenie!
Otrzymano 1024-bitowy klucz publiczny RSA!
Przesyanie polecenia...wysane!

Jak dziaa ten skrypt?


Dziaanie klienta rozpoczyna si od prby nawizania poczenia TCP przy uyciu
okrelonego adresu IP i numeru portu . Jeli operacja ta si powiedzie, skrypt
przekae do standardowego wyjcia tekst nawizano poczenie. Nastpnie klient
oczekuje na otrzymanie 1024-bitowego publicznego klucza szyfrujcego RSA
z serwera. Ten klucz skrypt zapisuje w zmiennej tmp, poniewa do czasu przeksztacenia danych na obiekt klucza RSA OpenSSL s one tylko niezrozumiaym
acuchem znakw . Po zainicjowaniu zmiennej public_key i zapisaniu w niej
publicznego klucza RSI program potwierdza jego otrzymanie oraz moe przystpi
do szyfrowania informacji .

156

Rozdzia 7

Skrypt przesya dane, ktre zawieraj nazw odtwarzacza plikw muzycznych.


W systemie Linux jest to mpg123, a na platformie Windows klasyczny odtwarzacz Media Player (plik mplayer2.exe). Oprcz nazwy aplikacji skrypt przekazuje
nazw pliku muzycznego ruby.mp3. Ten plik znajduje si ju na serwerze,
dlatego program po prostu nakazuje serwerowi odtworzenie danego utworu.
Poszczeglne czci acucha znakw z poleceniem s rozdzielone gwiazdk (*).
Moesz w dowolny sposb zmodyfikowa to polecenie i same dane, poniewa
program zaszyfruje je oraz przele na serwer.
Nastpny krok to szyfrowanie informacji. Skrypt zapisuje omwiony wczeniej
acuch znakw z zapytaniem w zmiennej msg i szyfruje przy uyciu publicznego
klucza RSA otrzymanego z serwera. Przed zaszyfrowaniem danych program koduje
komunikat za pomoc algorytmu SHA1 i zapisuje wygenerowany kod w zmiennej sha1 . Ten kod zostanie uyty po przesaniu danych na serwer. Pamitaj,
e algorytm SHA1 jest jednostronny, dlatego jeli w trakcie przekazywania danych
zostan one zmodyfikowane, pierwotny i nowy kod bd si od siebie rni.
Nastpnie skrypt scala zmienne sha1 i msg, czc je gwiazdk. Do szyfrowania
danych wyjciowych suy metoda public_encrypt obiektu klucza RSA . Jak moe
zgade, metoda ta szyfruje informacje przy uyciu publicznego klucza RSA. Tylko
odpowiadajcy mu prywatny klucz RSA pozwala odszyfrowa komunikat.
Na zakoczenie skrypt przesya zaszyfrowany komunikat na serwer i zamyka
poczenie . Jeli w trakcie szyfrowania lub przesyania danych wystpi problemy, sytuacj pozwoli uratowa zaufany blok begin/rescue. Jeeli wszystkie
operacje zakocz si sukcesem, serwer odtworzy fantastyczne dwiki zwizane
z jzykiem Ruby! Czy jest w yciu co pikniejszego od suchania piosenek
o jzyku Ruby?

48. Szyfrowanie po stronie serwera


RSA_server.rb

Po zapoznaniu si z klientem i jego kodem pora przyjrze si serwerowi. Przyjmuje on dane, sprawdza, czy kod SHA1 jest poprawny, odszyfrowuje informacje
i wykonuje polecenie z przesanego acucha znakw.

Kod
require 'openssl'
require 'socket'
require 'digest/sha1'
priv_key = OpenSSL::PKey::RSA.new(1024)
pub_key = priv_key.public_key
host = ARGV[0] || 'localhost'
port = (ARGV[1] || 8887).to_i
server = TCPServer.new(host, port)

Serwery i wydobywanie danych

157

while session = server.accept


begin
puts "Nawizano poczenie...trwa wysyanie klucza
publicznego.\n\n"
puts pub_key
session.print pub_key
puts "Przesano klucz publiczny trwa oczekiwanie na
dane...\n\n"
temp = session.recv(10000)
puts "Otrzymano dane..."
msg = priv_key.private_decrypt(temp)
rescue => e
puts "Wystpi powany problem przy pobieraniu i odszyfrowywaniu
danych."
puts e
end
command = msg.split("*")
serv_hash = command[0]
nix_app = command[1]
win_app = command[2]
file = command[3]
if Digest::SHA1.hexdigest("#{nix_app}*#{win_app}*#{file}")==serv_hash
puts "Potwierdzono integralno komunikatu..."
if RUBY_PLATFORM.include?('mswin32')
puts "Uruchamianie polecenia dla systemu Windows: #{win_app}
#{file}"
`#{win_app} #{file}`
exit
else
puts "Uruchamianie polecenia dla systemu Linux: #{nix_app}
#{file}"
`#{nix_app} #{file}`
exit
end
else
puts "Nie mona przeprowadzi walidacji komunikatu!"
end
exit
end

Uruchamianie kodu
W celu uruchomienia skryptu wpisz ponisze polecenie:

158

Rozdzia 7

ruby RSA_server.rb

Dane wyjciowe
Poniej znajduj si dane wyjciowe, wywietlane po udanym nawizaniu poczenia i przesaniu polecenia.
Nawizano poczenie...trwa wysyanie klucza publicznego.
-----BEGIN RSA PUBLIC KEY----MIGJAoGBAMe12IJIyVULS/OLlHeekhZNyh2YhuGfJSwEozw2Z6GfaRjZg7s0cwqb
B/Z+MMUPIjCmiH38pkKzh5GhA8zcRSWEFtssa8HcyIowA5ftZM27/6diYz9kNueI
NO2kvlkqwU5KUOKnLISJnrZAlTbJMqio24dn3PNm27kgae8+KdrHAgMBAAE=
-----END RSA PUBLIC KEY----Przesano klucz publiczny trwa oczekiwanie na dane...
Otrzymano dane...
Potwierdzono integralno komunikatu...
Wykonywanie polecenia dla systemu Windows: "C:\Program Files\Windows Media
Player\mplayer2.exe" ruby.mp3

Jak dziaa ten skrypt?


Skrypt generuje najpierw niepowtarzalny prywatny klucz RSA . Na podstawie
tego klucza powstaje publiczny klucz RSA. Do jego wygenerowania suy metoda
public_key obiektu klucza RSA. Przy kadym uruchomieniu program tworzy now
par kluczy. Jeli klient przele dane zaszyfrowane przy uyciu dawnego klucza
publicznego, serwer nie zdoa odszyfrowa komunikatu.
Po utworzeniu kluczy RSA skrypt inicjuje serwer TCP . Serwer ten naley
uruchomi przy uyciu argumentw w postaci nazwy serwera i portu, ktre mona
poda w wierszu polece. Jeli te argumenty nie s dostpne, skrypt uywa ustawie
domylnych. Kiedy serwer jest ju gotowy, rozpoczyna oczekiwanie na poczenia. Ptla while umoliwia zarzdzanie w skrypcie sesjami . Poniewa program
nie jest wielowtkowy, w danym momencie obsuguje tylko jedno poczenie.
Kiedy uytkownik uruchomi klienta, ten nawie poczenie z serwerem. Spowoduje to rozpoczcie nowej sesji, a pierwsza operacja w niej polega na przesaniu przez serwer publicznego klucza RSA . Klucz RSA jest may, dlatego jego
przekazywanie trwa krtko. Nastpnie skrypt oczekuje na przesanie danych przez
klienta. W tym czasie klient otrzymuje publiczny klucz RSA i szyfruje przesyany
komunikat. W zmiennej temp skrypt zapisuje dane odebrane przez serwer przy
uyciu poczenia TCP. Limit tych informacji to 10 000 bajtw . Dopiero po
odebraniu danych program przechodzi do dalszych dziaa.
Przy uyciu metody private_decrypt obiektu klucza RSA skrypt odszyfrowuje
dane ze zmiennej temp i zapisuje je w zmiennej msg . Jeli w czasie pobierania
i odszyfrowywania acucha znakw z poleceniem wystpi bdy, klauzula rescue
przechwyci je i wywietli przydatne informacje, ktre pomog rozwiza problem.

Serwery i wydobywanie danych

159

Jak pewnie sobie przypominasz z opisu skryptu 47. Szyfrowanie po


stronie klienta, acuch znakw z poleceniem jest ograniczony gwiazdk (*).
Dlatego aby pobra waciwy fragment tekstu, naley uy metody split i poda
gwiazdk jako ogranicznik zastosowany w acuchu msg . Dane wyjciowe skrypt
zapisuje w zmiennej command, ktra przechowuje tablic acuchw znakw. Poniewa tekst powstaje w skrypcie klienckim, wiadomo, z jakich fragmentw si skada.
Na pocztku znajduje si kod SHA1, nastpnie nazwa aplikacji dla systemu Linux,
nazwa programu dla platformy Windows i przeznaczony do uycia plik.
Do utworzenia kodu SHA1 suy instrukcja dla systemu Linux, polecenie dla
platformy Windows i nazwa pliku . Midzy poszczeglnymi czciami acucha znakw znajduj si gwiazdki, co pozwala odtworzy pierwotny tekst. Efekt
jego zakodowania jest porwnywany z wartoci zmiennej serv_hash, ktra zawiera
kod SHA1 przesany przez klienta. Jeli porwnywane kody nie s sobie rwne,
dane musiay ulec zmianie w trakcie ich przesyania. Nie mona ufa takim informacjom, dlatego program koczy dziaanie. Miejmy jednak nadziej, e oba kody
bd takie same, a skrypt wykona dalsze operacje.
Po potwierdzeniu integralnoci komunikatw program musi wybra uruchamian aplikacj. Ruby umoliwia atwe okrelenie uywanego systemu. Wystarczy
o to zapyta przy uyciu wyraenia RUBY_PLATFORM. Jeli korzystasz z systemu
Windows, warto tego wyraenia to i386-mswin32. Przy uyciu wygodnej metody
include? skrypt sprawdza, czy acuch znakw z wyraenia RUBY_PLATFORM zawiera
fragment mswin32 . Jeli ten test zwrci warto true, program wywoa polecenie dla systemu Windows. W przeciwnym razie uruchomiona zostanie aplikacja
dla platformy Linux . W obu przypadkach jeeli wszystkie operacje przebiegn
prawidowo, system powinien uruchomi program muzyczny i rozpocz odtwarzanie pliku ruby.mp3. Skrypt koczy dziaanie po zamkniciu aplikacji muzycznej.
W ten sposb mona komunikowa si w poufny sposb, a jednoczenie zachowa
integralno danych.

160

Rozdzia 7

You might also like