Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf ·...

28
Ruby. Praktyczne skrypty, które rozwi¹¿¹ trudne problemy Autor: Steve Pugh T³umaczenie: Tomasz Walczak, Marek Kowalcze ISBN: 978-83-246-2254-2 Tytu³ orygina³u: Wicked Cool Ruby Scripts: Useful Scripts that Solve Difficult Problems Format: 170x230, stron: 232 Poznaj przyjemnoœæ pracy z jêzykiem Ruby! Jak manipulowaæ ³añcuchami znaków? Jak edytowaæ zbiory zdjêæ i wydobywaæ informacje z fotografii? Jak zmieniaæ uprawnienia i modyfikowaæ konta u¿ytkowników? Ruby to obiektowy jêzyk programowania, przeznaczony do u¿ytku ogólnego, udostêpniaj¹cy bogaty zestaw narzêdzi s³u¿¹cych do pisania skryptów. Jedn¹ z najwiêkszych zalet tego jêzyka jest fakt, ¿e wyj¹tkowo dobrze nadaje siê on do tworzenia efektywnych programów proceduralnych. Dziêki tej ksi¹¿ce nauczysz siê wykorzystywaæ niezwyk³e w³aœciwoœci jêzyka Ruby, aby zautomatyzowaæ wiêkszoœæ zadañ i wykonywaæ swoj¹ pracê bez trudu i z przyjemnoœci¹. Ksi¹¿ka Ruby. Praktyczne skrypty, które rozwi¹¿¹ trudne problemyzawiera 58 niezwykle przydatnych skryptów, które pozwalaj¹ szybko rozwi¹zaæ czêsto spotykane problemy, miêdzy innymi z administrowaniem systemem, manipulowaniem rysunkami i zarz¹dzaniem witryn¹. Przy ka¿dym skrypcie znajdziesz kod, omówienie jego dzia³ania i wskazówki opisuj¹ce, jak dostosowaæ rozwi¹zanie do w³asnych potrzeb. Z podrêcznika dowiesz siê, jak pos³ugiwaæ siê skryptami do automatyzacji zadañ (takich jak archiwizowanie czy wypakowywanie plików), a tak¿e na czym polega szyfrowanie plików oraz przetwarzanie wiadomoœci RSS. Nauczysz siê tworzyæ zaawansowane roboty sieciowe, skrypty z obszaru zabezpieczeñ oraz kompletne biblioteki i aplikacje. Skrypty do zarz¹dzania witrynami Pisanie skryptów sieciowych Administrowanie systemami Linux i Unix Walidacja rozwi¹zañ symbolicznych Narzêdzia do manipulowania zdjêciami Tworzenie galerii fotografii Narzêdzia do przetwarzania ³añcuchów znaków Serwery i wydobywanie danych Argumenty i dokumentacja Algorytmy sortowania Skorzystaj z praktycznych skryptów w jêzyku Ruby i oszczêdzaj czas, aby pracowaæ szybko i wydajnie

Transcript of Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf ·...

Page 1: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

Ruby. Praktyczne skrypty, które rozwi¹¿¹ trudne problemyAutor: Steve PughT³umaczenie: Tomasz Walczak, Marek KowalczeISBN: 978-83-246-2254-2Tytu³ orygina³u: Wicked Cool Ruby Scripts: Useful Scripts that Solve Difficult ProblemsFormat: 170x230, stron: 232

Poznaj przyjemnoœæ pracy z jêzykiem Ruby!

• Jak manipulowaæ ³añcuchami znaków?• Jak edytowaæ zbiory zdjêæ i wydobywaæ informacje z fotografii?• Jak zmieniaæ uprawnienia i modyfikowaæ konta u¿ytkowników?

Ruby to obiektowy jêzyk programowania, przeznaczony do u¿ytku ogólnego, udostêpniaj¹cy bogaty zestaw narzêdzi s³u¿¹cych do pisania skryptów. Jedn¹ z najwiêkszych zalet tego jêzyka jest fakt, ¿e wyj¹tkowo dobrze nadaje siê on do tworzenia efektywnych programów proceduralnych. Dziêki tej ksi¹¿ce nauczysz siê wykorzystywaæ niezwyk³e w³aœciwoœci jêzyka Ruby, aby zautomatyzowaæ wiêkszoœæ zadañ i wykonywaæ swoj¹ pracê bez trudu i z przyjemnoœci¹.

Ksi¹¿ka „Ruby. Praktyczne skrypty, które rozwi¹¿¹ trudne problemy” zawiera 58 niezwykle przydatnych skryptów, które pozwalaj¹ szybko rozwi¹zaæ czêsto spotykane problemy, miêdzy innymi z administrowaniem systemem, manipulowaniem rysunkami i zarz¹dzaniem witryn¹. Przy ka¿dym skrypcie znajdziesz kod, omówienie jego dzia³ania i wskazówki opisuj¹ce, jak dostosowaæ rozwi¹zanie do w³asnych potrzeb. Z podrêcznika dowiesz siê, jak pos³ugiwaæ siê skryptami do automatyzacji zadañ (takich jak archiwizowanie czy wypakowywanie plików), a tak¿e na czym polega szyfrowanie plików oraz przetwarzanie wiadomoœci RSS. Nauczysz siê tworzyæ zaawansowane roboty sieciowe, skrypty z obszaru zabezpieczeñ oraz kompletne biblioteki i aplikacje.

• Skrypty do zarz¹dzania witrynami• Pisanie skryptów sieciowych• Administrowanie systemami Linux i Unix• Walidacja rozwi¹zañ symbolicznych• Narzêdzia do manipulowania zdjêciami• Tworzenie galerii fotografii• Narzêdzia do przetwarzania ³añcuchów znaków• Serwery i wydobywanie danych• Argumenty i dokumentacja• Algorytmy sortowania

Skorzystaj z praktycznych skryptów w jêzyku Ruby i oszczêdzaj czas, aby pracowaæ szybko i wydajnie

Page 2: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

Spis treści

PRZEDMOWA ........................................................................................... 15

PODZIĘKOWANIA ................................................................................... 17

WPROWADZENIE ..................................................................................... 19Odjazdowe skrypty w języku Ruby ........................................................................................20Musisz znać podstawy języka Ruby ........................................................................................20Dokumentacja ........................................................................................................................20Struktura książki i zastosowane podejście .............................................................................21Witryna WWW ......................................................................................................................23

1.NARZĘDZIA DO UŻYTKU OGÓLNEGO .................................................... 25

1. Wyszukiwanie zmodyfikowanych plików ...........................................................................25Kod ...............................................................................................................................26Uruchamianie kodu ......................................................................................................27Dane wyjściowe ...........................................................................................................27Jak działa ten skrypt? ....................................................................................................28Modyfikowanie skryptu ................................................................................................29

2. Szyfrowanie pliku ...............................................................................................................30Kod ...............................................................................................................................30Uruchamianie kodu ......................................................................................................30Dane wyjściowe ...........................................................................................................31Jak działa ten skrypt? ....................................................................................................31Modyfikowanie skryptu ................................................................................................32

3. Odszyfrowywanie pliku ......................................................................................................32Kod ...............................................................................................................................32Uruchamianie kodu ......................................................................................................33Wyniki ..........................................................................................................................33Jak działa ten skrypt? ....................................................................................................33

Page 3: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

6 S p i s t r e ś c i

4. Dzielenie plików ................................................................................................................ 34Kod .............................................................................................................................. 34Uruchamianie kodu ..................................................................................................... 35Dane wyjściowe .......................................................................................................... 35Jak działa ten skrypt? ................................................................................................... 36Modyfikowanie skryptu ............................................................................................... 36

5. Scalanie plików .................................................................................................................. 36Kod .............................................................................................................................. 37Uruchamianie kodu ..................................................................................................... 37Dane wyjściowe .......................................................................................................... 37Jak działa ten skrypt? ................................................................................................... 38Modyfikowanie skryptu ............................................................................................... 38

6. Przeglądarka procesów w systemie Windows .................................................................. 38Kod .............................................................................................................................. 39Uruchamianie kodu ..................................................................................................... 39Dane wyjściowe .......................................................................................................... 39Jak działa ten skrypt? ................................................................................................... 40Modyfikowanie skryptu ............................................................................................... 40

7. Narzędzie do kompresji plików ........................................................................................ 41Kod .............................................................................................................................. 41Uruchamianie kodu ..................................................................................................... 42Dane wyjściowe .......................................................................................................... 42Jak działa ten skrypt? ................................................................................................... 42

8. Rozpakowywanie plików ................................................................................................... 43Kod .............................................................................................................................. 43Uruchamianie kodu ..................................................................................................... 44Dane wyjściowe .......................................................................................................... 44Jak działa ten skrypt? ................................................................................................... 44

9. Kalkulator raty kredytu hipotecznego ............................................................................... 45Kod .............................................................................................................................. 45Uruchamianie kodu ..................................................................................................... 45Dane wyjściowe .......................................................................................................... 45Jak działa ten skrypt? ................................................................................................... 46Modyfikowanie skryptu ............................................................................................... 46

2.SKRYPTY DO ZARZĄDZANIA WITRYNAMI ............................................. 47

10. Weryfikator odnośników do stron w sieci ...................................................................... 48Kod .............................................................................................................................. 48Uruchamianie kodu ..................................................................................................... 49Dane wyjściowe .......................................................................................................... 49Jak działa ten skrypt? ................................................................................................... 49Modyfikowanie skryptu ............................................................................................... 50

Page 4: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S p i s t r e ś c i 7

11. Kontroler osieroconych plików ........................................................................................51Kod ...............................................................................................................................51Uruchamianie skryptu ..................................................................................................52Dane wyjściowe ...........................................................................................................52Jak działa ten skrypt? ....................................................................................................53

12. Generator formularzy ......................................................................................................53Kod ...............................................................................................................................54Uruchamianie kodu ......................................................................................................55Dane wyjściowe ...........................................................................................................55Jak działa ten skrypt? ....................................................................................................56Modyfikowanie skryptu ................................................................................................57

13. Parser kanałów RSS ..........................................................................................................57Kod ...............................................................................................................................57Uruchamianie kodu ......................................................................................................58Dane wyjściowe ...........................................................................................................58Jak działa ten skrypt? ....................................................................................................59Modyfikowanie skryptu ................................................................................................60

14. Grep dla giełdy papierów wartościowych ........................................................................60Kod ...............................................................................................................................60Uruchamianie kodu ......................................................................................................61Dane wyjściowe ...........................................................................................................61Jak działa ten skrypt? ....................................................................................................62Modyfikowanie skryptu ................................................................................................62

15. Generowanie adresów IP .................................................................................................63Kod ...............................................................................................................................63Uruchamianie kodu ......................................................................................................64Dane wyjściowe ...........................................................................................................64Jak działa ten skrypt? ....................................................................................................65

16. Kalkulator masek podsieci ................................................................................................66Kod ...............................................................................................................................66Uruchamianie kodu ......................................................................................................66Dane wyjściowe ...........................................................................................................66Jak działa ten skrypt? ....................................................................................................67Modyfikowanie skryptu ................................................................................................67

3.ADMINISTROWANIE SYSTEMAMI LINUX I UNIX ................................... 69

17. Poprawianie nieodpowiednich nazw plików ....................................................................69Kod ...............................................................................................................................70Uruchamianie kodu ......................................................................................................71Dane wyjściowe ...........................................................................................................71Jak działa ten skrypt? ....................................................................................................71Modyfikowanie skryptu ................................................................................................72

Page 5: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

8 S p i s t r e ś c i

18. Dodawanie kont użytkowników ..................................................................................... 72Kod .............................................................................................................................. 72Uruchamianie kodu ..................................................................................................... 73Dane wyjściowe .......................................................................................................... 74Jak działa ten skrypt? ................................................................................................... 74Modyfikowanie skryptu ............................................................................................... 75

19. Modyfikowanie kont użytkowników ............................................................................... 75Kod .............................................................................................................................. 75Uruchamianie kodu ..................................................................................................... 77Dane wyjściowe .......................................................................................................... 77Jak działa ten skrypt? ................................................................................................... 78Modyfikowanie skryptu ............................................................................................... 78

20. Usuwanie zablokowanych procesów .............................................................................. 78Kod .............................................................................................................................. 79Uruchamianie kodu ..................................................................................................... 79Dane wyjściowe .......................................................................................................... 79Jak działa ten skrypt? ................................................................................................... 80

21. Walidacja dowiązań symbolicznych ................................................................................. 81Kod .............................................................................................................................. 82Uruchamianie kodu ..................................................................................................... 82Dane wyjściowe .......................................................................................................... 82Jak działa ten skrypt? ................................................................................................... 82Modyfikowanie skryptu ............................................................................................... 83

4.NARZĘDZIA DO MANIPULOWANIA ZDJĘCIAMI .................................... 85

22. Masowe edytowanie ........................................................................................................ 86Kod .............................................................................................................................. 86Uruchamianie kodu ..................................................................................................... 86Dane wyjściowe .......................................................................................................... 86Jak działa ten skrypt? ................................................................................................... 87

23. Pobieranie informacji o zdjęciach .................................................................................... 87Kod .............................................................................................................................. 88Uruchamianie kodu ..................................................................................................... 88Dane wyjściowe .......................................................................................................... 88Jak działa ten skrypt? ................................................................................................... 89Modyfikowanie skryptu ............................................................................................... 90

24. Tworzenie miniatur ......................................................................................................... 90Kod .............................................................................................................................. 90Uruchamianie kodu ..................................................................................................... 91Dane wyjściowe .......................................................................................................... 91Jak działa ten skrypt? ................................................................................................... 91Modyfikowanie skryptu ............................................................................................... 92

Page 6: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S p i s t r e ś c i 9

25. Zmienianie wielkości zdjęć ...............................................................................................92Kod ...............................................................................................................................92Uruchamianie kodu ......................................................................................................93Dane wyjściowe ...........................................................................................................93Jak działa ten skrypt? ....................................................................................................93Modyfikowanie skryptu ................................................................................................94

26. Dodawanie znaków wodnych do zdjęć ...........................................................................94Kod ...............................................................................................................................95Uruchamianie kodu ......................................................................................................95Dane wyjściowe ...........................................................................................................96Jak działa ten skrypt? ....................................................................................................96

27. Przekształcanie zdjęć na czarno-białe ..............................................................................97Kod ...............................................................................................................................97Uruchamianie kodu ......................................................................................................98Dane wyjściowe ...........................................................................................................98Jak działa ten skrypt? ....................................................................................................98

28. Tworzenie galerii fotografii ..............................................................................................98Kod ...............................................................................................................................99Uruchamianie kodu ....................................................................................................100Dane wyjściowe .........................................................................................................100Jak działa ten skrypt? ..................................................................................................100Modyfikowanie skryptu ..............................................................................................102

5.GRY I NARZĘDZIA WSPOMAGAJĄCE UCZENIE SIĘ ............................... 103

29. Rozwiązywanie łamigłówek Sudoku ..............................................................................103Kod .............................................................................................................................104Uruchamianie kodu ....................................................................................................105Dane wyjściowe .........................................................................................................105Jak działa ten skrypt? ..................................................................................................106

30. Fiszki ..............................................................................................................................107Kod .............................................................................................................................107Uruchamianie kodu ....................................................................................................108Dane wyjściowe .........................................................................................................108Jak działa ten skrypt? ..................................................................................................108Modyfikowanie skryptu ..............................................................................................109

31. Gra w zgadywanie numerów .........................................................................................109Kod .............................................................................................................................109Uruchamianie kodu ....................................................................................................110Dane wyjściowe .........................................................................................................110Jak działa ten skrypt? ..................................................................................................111

32. Kamień, papier, nożyce ..................................................................................................111Kod .............................................................................................................................111Uruchamianie kodu ....................................................................................................112

Page 7: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

10 S p i s t r e ś c i

Dane wyjściowe ........................................................................................................ 112Jak działa ten skrypt? ................................................................................................. 113Modyfikowanie skryptu ............................................................................................. 113

33. Rozsypanka wyrazowa .................................................................................................. 113Kod ............................................................................................................................ 114Uruchamianie kodu ................................................................................................... 114Dane wyjściowe ........................................................................................................ 115Jak działa ten skrypt? ................................................................................................. 115

34. Szubienica ...................................................................................................................... 116Kod ............................................................................................................................ 116Uruchamianie kodu ................................................................................................... 117Dane wyjściowe ........................................................................................................ 117Jak działa ten skrypt? ................................................................................................. 118

35. Świnia — gra w kości .................................................................................................... 118Kod ............................................................................................................................ 119Uruchamianie kodu ................................................................................................... 120Dane wyjściowe ........................................................................................................ 120Jak działa ten skrypt? ................................................................................................. 122Modyfikowanie skryptu ............................................................................................. 123

6.NARZĘDZIA DO PRZETWARZANIA ŁAŃCUCHÓW ZNAKÓW .............. 125

36. Generator dokumentów PDF ....................................................................................... 125Kod ............................................................................................................................ 126Uruchamianie kodu ................................................................................................... 127Dane wyjściowe ........................................................................................................ 127Jak działa ten skrypt? ................................................................................................. 127

37. Zliczanie wystąpień słów ............................................................................................... 129Kod ............................................................................................................................ 129Uruchamianie kodu ................................................................................................... 130Dane wyjściowe ........................................................................................................ 130Jak działa ten skrypt? ................................................................................................. 130Modyfikowanie skryptu ............................................................................................. 131

38. Parser plików CSV ......................................................................................................... 131Kod ............................................................................................................................ 132Uruchamianie kodu ................................................................................................... 133Dane wyjściowe ........................................................................................................ 133Jak działa ten skrypt? ................................................................................................. 133Modyfikowanie skryptu ............................................................................................. 134

39. Przekształcanie plików CSV na XML ............................................................................ 134Kod ............................................................................................................................ 135Uruchamianie kodu ................................................................................................... 135Dane wyjściowe ........................................................................................................ 135Jak działa ten skrypt? ................................................................................................. 136Modyfikowanie skryptu ............................................................................................. 137

Page 8: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S p i s t r e ś c i 11

40. Program grep napisany w języku Ruby ..........................................................................137Kod .............................................................................................................................137Uruchamianie kodu ....................................................................................................138Dane wyjściowe .........................................................................................................138Jak działa ten skrypt? ..................................................................................................138Modyfikowanie skryptu ..............................................................................................139

41. Sprawdzanie siły hasła ....................................................................................................139Kod .............................................................................................................................139Uruchamianie kodu ....................................................................................................140Dane wyjściowe .........................................................................................................140Jak działa ten skrypt? ..................................................................................................140Modyfikowanie skryptu ..............................................................................................142

7.SERWERY I WYDOBYWANIE DANYCH ................................................... 143

42. Definicje .........................................................................................................................143Kod .............................................................................................................................144Uruchamianie kodu ....................................................................................................144Dane wyjściowe .........................................................................................................145Jak działa ten skrypt? ..................................................................................................145Modyfikowanie skryptu ..............................................................................................146

43. Automatyczne wysyłanie SMS-ów .................................................................................146Kod .............................................................................................................................146Uruchamianie kodu ....................................................................................................147Dane wyjściowe .........................................................................................................147Jak działa ten skrypt? ..................................................................................................147

44. Wydobywanie odnośników ............................................................................................148Kod .............................................................................................................................148Uruchamianie kodu ....................................................................................................149Dane wyjściowe .........................................................................................................149Jak działa ten skrypt? ..................................................................................................150Modyfikowanie skryptu ..............................................................................................151

45. Wydobywanie rysunków ................................................................................................151Kod .............................................................................................................................151Uruchamianie kodu ....................................................................................................152Dane wyjściowe .........................................................................................................152Jak działa ten skrypt? ..................................................................................................152Modyfikowanie skryptu ..............................................................................................153

46. Narzędzie do wydobywania danych ze stron WWW ....................................................153Kod .............................................................................................................................153Uruchamianie kodu ....................................................................................................154Dane wyjściowe .........................................................................................................154Jak działa ten skrypt? ..................................................................................................155

Page 9: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

12 S p i s t r e ś c i

47. Szyfrowanie po stronie klienta ...................................................................................... 155Kod ............................................................................................................................ 155Uruchamianie kodu ................................................................................................... 156Dane wyjściowe ........................................................................................................ 156Jak działa ten skrypt? ................................................................................................. 156

48. Szyfrowanie po stronie serwera .................................................................................... 157Kod ............................................................................................................................ 157Uruchamianie kodu ................................................................................................... 158Dane wyjściowe ........................................................................................................ 159Jak działa ten skrypt? ................................................................................................. 159

8.ARGUMENTY I DOKUMENTACJA .......................................................... 161

49. Bezpieczeństwo plików ................................................................................................. 162Kod ............................................................................................................................ 162Uruchamianie kodu ................................................................................................... 164Dane wyjściowe ........................................................................................................ 164Jak działa ten skrypt? ................................................................................................. 165

50. Wydobywanie danych ze stron WWW ......................................................................... 166Kod ............................................................................................................................ 166Uruchamianie kodu ................................................................................................... 168Dane wyjściowe ........................................................................................................ 169Jak działa ten skrypt? ................................................................................................. 169

51. Narzędzia do zarządzania zdjęciami .............................................................................. 170Kod ............................................................................................................................ 170Uruchamianie kodu ................................................................................................... 175Dane wyjściowe ........................................................................................................ 175Jak działa ten skrypt? ................................................................................................. 176

Wnioski ................................................................................................................................ 176

9.ALGORYTMY SORTOWANIA .................................................................. 177

52. Sortowanie bąbelkowe .................................................................................................. 178Kod ............................................................................................................................ 178Uruchamianie kodu ................................................................................................... 179Dane wyjściowe ........................................................................................................ 179Jak działa ten skrypt? ................................................................................................. 179

53. Sortowanie przez wybieranie ........................................................................................ 180Kod ............................................................................................................................ 181Uruchamianie kodu ................................................................................................... 181Dane wyjściowe ........................................................................................................ 181Jak działa ten skrypt? ................................................................................................. 182

54. Sortowanie Shella .......................................................................................................... 182Kod ............................................................................................................................ 182Uruchamianie kodu ................................................................................................... 183

Page 10: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S p i s t r e ś c i 13

Dane wyjściowe .........................................................................................................183Jak działa ten skrypt? ..................................................................................................184

55. Sortowanie przez scalanie ..............................................................................................184Kod .............................................................................................................................184Uruchamianie kodu ....................................................................................................186Dane wyjściowe .........................................................................................................186Jak działa ten skrypt? ..................................................................................................186

56. Sortowanie stogowe ......................................................................................................186Kod .............................................................................................................................187Uruchamianie kodu ....................................................................................................188Dane wyjściowe .........................................................................................................188Jak działa ten skrypt? ..................................................................................................188

57. Sortowanie szybkie ........................................................................................................189Kod .............................................................................................................................189Uruchamianie kodu ....................................................................................................190Dane wyjściowe .........................................................................................................190Jak działa ten skrypt? ..................................................................................................190

58. Sortowanie przez wycinanie ..........................................................................................191Kod .............................................................................................................................191Uruchamianie kodu ....................................................................................................193Dane wyjściowe .........................................................................................................193Jak działa ten skrypt? ..................................................................................................193

Komentarz na temat wydajności ..........................................................................................194

10.TWORZENIE W JĘZYKU RUBYMODUŁU PLATFORMY METASPLOIT 3.1 .............................................. 197

Wprowadzenie do platformy Metasploit .............................................................................198Instalowanie .........................................................................................................................198Pisanie modułu .....................................................................................................................199Budowanie exploita ..............................................................................................................201Obserwowanie ataku w czasie rzeczywistym ......................................................................202Omówienie modułu powłoki platformy Metasploit .............................................................205Określanie długości danych użytkowych ..............................................................................207

POSŁOWIE .............................................................................................. 219

SKOROWIDZ .......................................................................................... 221

Page 11: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

7Serwery

i wydobywanie danych

MOCNĄ STRONĄ JĘZYKA RUBY JEST MOŻLIWOŚĆ UŻYCIA GO DO ZAUTOMA-TYZOWANIA INTERAKCJI Z ZASOBAMI SIECI WWW. TEN ROZDZIAŁZAWIERA KRÓTKIE OMÓWIENIE PROCESU PRZETWARZANIA STRONWWW I KOŃCZY SIĘ ZBIOREM DZIAłających po stronie klienta oraz

serwera skryptów, które służą do bezpiecznego przekazywaniai uruchamiania poleceń. Interakcja z siecią WWW i wydobywanie z niej

informacji (czyli tak zwany data mining) są ważne z uwagi na bogactwo dostępnychw niej materiałów. Zamiast wydobywać złoto, użytkownicy szukają różnych sposo-bów na pobranie ważnych danych i przekształcenie ich na znaczące informacje.

42. DefinicjeTen skrypt kieruje zapytanie do witryny http://www.dictionary.com/ i pobierapierwszą definicję słowa wskazanego przez użytkownika. Podobnie jak w przy-padku innych programów komunikujących się z siecią WWW istnieje ryzyko,że skrypt przestanie działać, jeśli projektanci witryny wprowadzą w niej zmiany.

define.rb

Page 12: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

144 Roz d z i a ł 7

Zadanie programu polega na wydobywaniu określonych danych. Użyłem witrynyDictionary.com tylko jako środka do zaprezentowania tego mechanizmu, jednakomawiany przykład to pomysłowe rozwiązanie.

Kod

require "open-uri"

unless ARGV[0] puts "Musisz podać definiowane słowo." puts "Sposób użycia: ruby define.rb <definiowane słowo>" exitend

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 endend puts "Niestety, nie można znaleźć definicji."endrescue => e puts "Wystąpił błąd – spróbuj ponownie." puts eend

Uruchamianie koduUruchom skrypt przez wpisanie następującej instrukcji:

ruby define.rb definiowane_słowo

Chciałem znaleźć definicję słowa Ruby. Niestety, pierwsze zwrócone obja-śnienie nie brzmiało najbardziej odjazdowy języka programowania.

Page 13: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 145

Dane wyjścioweSkrypt wyświetla definicję podanego słowa. Jeśli nie można jej znaleźć, programprosi użytkownika o sprawdzenie pisowni. Możliwe, że podany wyraz w ogóle nieistnieje.

1.a red variety of corundum, used as a gem.

Jak działa ten skrypt?Ponownie wykorzystałem tu fantastyczną bibliotekę open-uri . Do komunikacjiskryptu z siecią WWW można używać wielu przydatnych narzędzi tego typu. Jalubię open-uri, ponieważ ukrywa więcej szczegółów procesu łączenia się z sieciąniż inne biblioteki. Po dołączeniu biblioteki program sprawdza błędy. Mam nadzieję,że przyzwyczaiłeś się już do używanego bloku kodu. W pierwszej zmiennej (word)skrypt zapisuje słowo, którego definicję użytkownik chce znaleźć . Następnieprogram przypisuje do zmiennej url zapisany na stałe adres URL serwisu Dictio-nary.com z dołączonym wyrazem podanym jako argument . Budowa używanejwitryny sprawia, że dołączenie słowa do adresu powoduje automatyczne zwró-cenie definicji.

W dalszej części skryptu znajduje się instrukcja begin/rescue, potrzebnaz uwagi na zmienną naturę żądań sieciowych. Odpowiedzi na żądania HTTP częstozawierają komunikaty o błędach. Ich właściwa obsługa to klucz do prawidłowegodziałania tego skryptu. Po dodaniu siatki zabezpieczającej w postaci bloku begin/

rescue można wysłać do serwisu Dictionary.com prośbę o podanie definicji.Kiedy korzystasz z biblioteki open-uri, wystarczy, że wpiszesz instrukcję open()z adresem URL, a skrypt zwróci odpowiednią stronę WWW . Pobieranie stronza pomocą tej metody jest tak proste, że zawsze kiedy jej używam, na mojej twarzygości uśmiech.

Po metodzie open następuje blok, który przetwarza kod źródłowy zwróconyprzez serwer sieciowy. Ponieważ chcemy pobrać specyficzny wiersz (definicjęsłowa), w następnym bloku skrypt dzieli kod źródłowy na wiersze. Jeśli serwisDictionary.com nie znajdzie danego słowa, wyświetli komunikat No results found.Gdy skrypt w czasie analizowania kodu źródłowego wykryje podany wyraz, ale jużnie jego definicję, wyświetli wskazówkę w postaci prośby o sprawdzenie pisownisłowa, a następnie zakończy działanie . Jeżeli jednak definicja jest dostępna,skrypt stara się wyodrębnić ją z kodu źródłowego. Do pobrania jej tekstu służywyrażenie regularne.

Ważną częścią użytego w skrypcie wyrażenia regularnego jest cyfra 1. WitrynaDictionary.com używa jej jako wskaźnika pierwszej definicji, którą program mapobrać. Użycie w wyrażeniu regularnym nawiasów umożliwia skryptowi pogrupo-wanie określonych fragmentów dowolnego wiersza, które pasują do wyrażenia .Te grupy są zapisywane w zmiennych o nazwach od $1 do $n. Wiersz pod wyra-żeniem regularnym wyświetla definicję. Jeśli program nie znajdzie w kodzieźródłowym ani definicji, ani tekstu No results found, zwróci inny komunikat, który

Page 14: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

146 Roz d z i a ł 7

informuje użytkownika o tym, że nie można znaleźć wyjaśnienia słowa . Jeśliw czasie przetwarzania definicji pojawią się problemy, program uruchomi blokrescue i poinformuje, jaki błąd wystąpił.

Modyfikowanie skryptuJednym ze sposobów na zmodyfikowanie skryptu jest dodanie obsługi pośred-nika między użytkownikiem a żądaniem do serwera sieciowego. Jeśli korzystaszz takiego pośrednika, musisz zastosować to rozwiązanie. Jeżeli interesuje Cięruch w sieci generowany przez skrypt w języku Ruby, pośrednik pomoże Ciuzyskać dodatkowe informacje. Aby dowiedzieć się, jak je uzyskać, zajrzyj do doku-mentacji biblioteki open-uri. Potrzebna składnia wygląda następująco: open(url,:proxy => "http://127.0.0.1:8080"). Zwykle nie korzystam z pośrednika przyprzeglądaniu sieci WWW, jednak jeśli w trakcie tworzenia stron wykryję błędy,często pomocne jest przyjrzenie się ruchowi w sieci.

Do diagnozowania problemów używam bezpłatnego sieciowego pośrednikaParos (http://www.parosproxy.org/). Narzędzie to należy zainstalować lokalnie nawłasnej maszynie, a następnie można obserwować zgłaszane żądania sieciowei odbierane odpowiedzi. Dzięki wykorzystaniu przy programowaniu narzędziaParos zaoszczędziłem sobie wielu godzin diagnozowania. Jestem bardzo przywią-zany do tego pośrednika, jednak istnieje też wiele innych podobnych programów,dlatego warto poszukać czegoś dla siebie.

43. Automatyczne wysyłanie SMS-ówTen skrypt wysyła wiadomość SMS pod podany numer telefonu komórkowego.Ostrzegam przed nadużywaniem tej funkcji, jednak musisz wypróbować ten pro-gram1. Skrypt ma automatyzować korzystanie z witryny, która służy do wysyłaniawiadomości SMS. Zamiast pobierać statyczną zawartość strony, skrypt ten auto-matyzuje wypełnianie i przesyłanie formularza.

Kod

require 'win32ole'

ie = WIN32OLE.new('InternetExplorer.Application')ie.navigate("http://toolbar.google.com/send/sms/index.php")

ie.visible = truesleep 1 until ie.readyState() == 4

ie.document.all["mobile_user_id"].value ="5712013623"

1 Serwis użyty w tym skrypcie zakończył działalność, jednak za pomocą tej samej techniki możesz przesyłać

wiadomości w innych bramkach SMS — przyp. tłum.

sms.rb

Page 15: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 147

ie.document.all["carrier"].value ="TMOBILE"ie.document.all["subject"].value ="***Ruby rządzi***"ie.document.all.tags("textarea").each do |i| i.value = "Dzięki za dobrą robotę, Matz!"end

ie.document.all.send_button.click

Uruchamianie kodu

Aby uruchomić ten skrypt, wpisz następujące polecenie:

ruby sms.rb

Dane wyjścioweTen skrypt nie generuje żadnych danych, jednak jeśli udanie zakończy działanie,telefon o podanym numerze powiadomi Cię o odebraniu wiadomości. W przy-kładzie użyłem fikcyjnych danych, jednak możesz je zmienić, aby wypróbowaćprogram.

Jak działa ten skrypt?Jeśli korzystasz z komputera z systemem Windows i nigdy nie używałeś bibliotekiwin32ole, powinieneś poświęcić trochę czasu na jej opanowanie, ponieważ auto-matyzowanie wykonywania zadań w tym systemie jest ciekawe i daje dużo satysfak-cji. Możesz nie tylko manipulować przeglądarką Internet Explorer, co ilustrujeten skrypt, ale też dowolnym produktem z pakietu Microsoft Office i innymiaplikacjami systemu Windows.

Dostępnych jest też kilka bibliotek przeznaczonych do automatyzacji witryn. Narzę-dzia te są niezwykle przydatne do testów regresji i jakości aplikacji sieciowych.Jedną z popularnych bibliotek tego typu jest Watir. Szczegółowe informacje na jejtemat znajdziesz na stronie http://wtr.rubyforge.org/.

Skrypt tworzy nowy obiekt typu win32ole na podstawie argumentu w postaciuchwytu przeglądarki IE . Uchwyt ten informuje bibliotekę win32ole, którąaplikację ma kontrolować. Przy użyciu wbudowanej w przeglądarkę IE metodynavigate skrypt przechodzi pod określony adres URL — http://toolbar.google.com/send/sms/index.php . Następny wiersz ustawia atrybut okna przeglądarki. Jeślinie chcesz widzieć, jak skrypt wykonuje swe zadania, możesz użyć w tym wierszuwartości false, a okno przeglądarki będzie działać w tle. Wtedy jego obecnośćbędziesz mógł wykryć tylko na liście zadań. Ponieważ lubię widzieć działanieprogramu, ustawiłem wspomniany atrybut na true. Aplikacja Internet Explorerpojawi się i zniknie w krótkim czasie, dlatego bacznie przyglądaj się ekranowi.

UWAGA

Page 16: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

148 Roz d z i a ł 7

Następnie skrypt uruchamia pętlę, która warunkowo wczytuje stronę. Jakpewnie wiesz, strony witryn nie pojawiają się natychmiast. Aby skrypt nie prze-słał informacji przedwcześnie, należy „uśpić” program na sekundę, a następniesprawdzić, czy kod readyState ma właściwą wartość (4) . Przedwczesne działanianigdy nie są korzystne, a w tym przypadku spowodują, że skrypt przestanie działać.Po zakończeniu wczytywania dokumentu przez przeglądarkę IE skrypt możewypełnić odpowiednie pola.

Program wykrywa odpowiednie pola na podstawie nazw atrybutów. Jeśli zaj-rzysz do kodu źródłowego witryny, znajdziesz obiekty o nazwach mobile_user_id,carrier, subject i tak dalej. Te informacje służą do określenia, gdzie skrypt mazapisać poszczególne dane wejściowe . Większość kodu HTML z omawianejwitryny jest zgodna ze standardami, jednak z nieznanych przyczyn wartość atrybutuname obszaru tekstowego nie znajduje się w cudzysłowach. Oznacza to, że niemożna użyć wcześniej zastosowanej metody, aby uzyskać dostęp do tego obszaru.Jednak ponieważ w kodzie źródłowym znajduje się tylko jeden obszar tekstowy,wystarczy go znaleźć i zapisać w nim odpowiednie dane. Nie jest to wymyślnatechnika, ale nieco różni się od zastosowanego wcześniej podejścia .

Po dodaniu informacji trzeba tylko wirtualnie kliknąć przycisk do wysyłaniaformularza. Programiści firmy Google prawidłowo nazywają przyciski, dlategowystarczy pobrać odpowiednią nazwę i użyć jej w metodzie click . I to jużwszystko — język Ruby jest fantastyczny!

44. Wydobywanie odnośnikówWydobywanie odnośników ze stron WWW ma wiele zastosowań. Można to zro-bić — podobnie jak w przypadku innych zadań — na wiele sposobów. W roz-dziale 2. zobaczyłeś skrypt do sprawdzania poprawności odnośników w witrynie.Z uwagi na konieczność walidacji odsyłaczy program ten wymagał większej liczbywierszy kodu niż skrypt, który musi tylko wydobyć wszystkie odnośniki. Niezamierzam tworzyć tu robota sieciowego, jednak opiszę kilka jego podstawowychkomponentów. Pierwszy z nich to mechanizm wydobywania odnośników.

Kod

require 'mechanize'

unless ARGV[0] puts "Musisz podać adres witryny." puts "Sposób użycia: ruby linkScrape.rb <przetwarzany adres URL>" exitend

agent = WWW::Mechanize.newagent.set_proxy('localhost',8080)

linkScrape.rb

Page 17: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 149

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 endrescue => e puts "Wystąpił błąd." puts e retryend

Uruchamianie koduW celu uruchomienia skryptu wpisz następujące polecenie:

ruby linkScrape.rb http://przetwarzany_adres_url.com/

Dane wyjścioweSkrypt wyświetla listę wszystkich odnośników znalezionych na stronie o poda-nym adresie URL. Ja wydobyłem odsyłacze ze strony http://www.nostarch.com/main_menu.htm.

index.htmcatalog.htmwheretobuy.htmabout.htmjobs.htmmedia.htmhttp://www.nostarch.com/blog/http://ww6.aitsafe.com/cf/

review.cfm?userid=8948354abs_bsd2.htmopenbsd.htmfreebsdserver.htmdebian.htmhowlinuxworks.htmappliance.htmlcbk2.htmlme.htmnongeeks.htmlps.htm

interactive.htmgimp.htminkscape.htmjs2.htmeblender.htmoophp.htmwpdr.htmwebbots.htmgoogle.htmgrowingsoftware.htmrootkits.htmhacking2.htmvoip.htmfirewalls.htmsecurityvisualization.htmsilence.htmstcb4.htmscsi2.htm cisco.htmcablemodem.htm

Page 18: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

150 Roz d z i a ł 7

mug.htmubuntu_3.htmimap.htmpf.htmpostfix.htmwebmin.htmendingspam.htmcluster.htmnagios.htmnagios_2e.htmpgp.htmpacket.htmtcpip.htmassembly.htmdebugging.htmqt4.htmvb2005.htmvsdotnet.htmcodecraft.htmhownotc.htmidapro.htmmugperl.htmgnome.htmplg.htmruby.htmvbexpress.htmwcj.htmwcps.htmwcphp.htmwcruby.htmwcss.htmgreatcode.htmgreatcode2.htmwpc.htm

xbox.htminsidemachine.htmnero7.htmwireless.htmcreative.htmebaypg.htmebapsg.htmgeekgoddess.htmwikipedia.htmindtb.htmsayno.htmnetworkknowhow.htmsharing.htmapple2.htmnewmac.htmcult_mac.htmipod.htmart_of_raw.htmfirstlego.htmflego.htmlegotrains.htmsato.htmnxt.htmnxtonekit.htmzoo.htmlegobuilder.htmnxtig.htmvlego.htmmg_databases.htmmg_statistics.htmeli.htmindex.htm

Jak działa ten skrypt?Porównaj kod tego programu ze skryptem 10. — „Weryfikator odnośników do stronw sieci”. Widać dużą różnicę, prawda? Zawsze warto przemyśleć problem i staraćsię rozwiązać go w najprostszy możliwy sposób. Niektóre z najbardziej eleganc-kich rozwiązań w ogóle nie są skomplikowane. Przedstawiony skrypt jedyniewydobywa odnośniki ze strony bez sprawdzania ich poprawności i wykonywaniainnych zadań. Biblioteka mechanize to następne narzędzie często używane dointerakcji z internetem . Skrypt po standardowej instrukcji do obsługi błędówtworzy nowy obiekt agent typu mechanize . Aby dostosować ten obiekt do potrzebprogramisty, program ustawia atrybut pośrednika na lokalny program Paros,

Page 19: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 151

którego używam. Jeśli nie chcesz korzystać z narzędzia tego rodzaju, usuń ten wierszkodu. Następnie skrypt używa metody get obiektu agent do pobrania zawartościstrony . Ciekawą cechą biblioteki mechanize jest automatyczne kategoryzowaniepobranych informacji. Wyszukiwanie specyficznych elementów strony za pomocątej biblioteki znacznie ułatwia życie programistom języka Ruby.

W zmiennej page znajduje się tablica links. Dzięki bibliotece mechanize odno-śniki są już przetworzone. Podobnie jak przy korzystaniu z każdej innej tablicymożna użyć metody each do przejścia po wszystkich elementach tablicy links.Pamiętaj, że elementy link zawierają nie tylko adres URL każdego odnośnika, aleteż inne atrybuty zdefiniowane w kodzie źródłowym. Tu potrzebny jest tylkoatrybut href, aby skrypt mógł wyświetlić go w konsoli . Jeśli chcesz wydobyćinformacje z dużej witryny, powinieneś zapisać dane w pliku, ale wybór podejścianależy do Ciebie. Po wyświetleniu odnośników skrypt kończy działanie.

Modyfikowanie skryptuIstnieje kilka innych ciekawych narzędzi sieciowych, które przetwarzają stronyw podobny sposób. Są to na przykład Hpricot (http://wiki.github.com/why/hpricot/)i Rubyful Soup (http://www.crummy.com/software/RubyfulSoup/). Wypróbuj je,aby znaleźć narzędzie dostosowane do własnych potrzeb.

45. Wydobywanie rysunkówTen skrypt wydobywa każdy rysunek ze strony o adresie URL podanym przezużytkownika. Pobierane pliki graficzne obejmują obrazki znajdujące się na ser-werze danej strony, a także rysunki dołączane z innych serwerów sieciowych.

Kod

require "open-uri"require "pathname"

unless ARGV[0] puts "Musisz podać adres URL, aby wydobyć rysunki." puts "Sposób użycia: ruby imageScrape.rb <przetwarzany adres URL>" exitend

url = ARGV[0].stripbegin 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

imageScrape.rb

Page 20: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

152 Roz d z i a ł 7

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 endrescue => e puts "Wystąpił błąd – spróbuj ponownie." puts e

Uruchamianie koduUruchom skrypt przez wpisanie poniższej instrukcji:

ruby imageScrape.rb http://przetwarzany_adres_url.com/

Dane wyjścioweTen skrypt pobiera wszystkie rysunki znalezione na stronie o podanym adresieURL. Ja włączyłem przetwarzanie strony http://www.ruby-lang.org/ i pobrałemdwa obrazki: logo.gif (logo języka Ruby) i download.gif (rysunek-odnośnik, którypozwala pobrać język Ruby).

Jak działa ten skrypt?Pierwszy etap wydobywania rysunków polega na pobraniu całej strony. Przyużyciu metody open biblioteki open-uri można wygodnie zapisać kod źródłowystrony w zmiennej source . Jak sobie pewnie przypominasz z czasów pisaniakodu w języku HTML, rysunki w dokumentach sieciowych są zagnieżdżane zapomocą znaczników <img src=plik.jpg>. W tym skrypcie użyłem wyrażenia regu-larnego, które analizuje każdy wiersz kodu źródłowego i wyszukuje podobne zna-czniki . Dzięki danym zwróconym przez wyrażenie regularne program możeokreślić lokalizację znalezionych obrazków.

Po ustaleniu lokalizacji rysunku trzeba określić, czy obrazek pochodzi z ze-wnętrznej, czy z przetwarzanej witryny. W kodzie HTML rysunki z lokalnegoserwera sieciowego są zwykle poprzedzone ukośnikiem (ich adres ma postaćścieżki bezwzględnej). W kodzie ścieżkę do obrazka zawiera zmienna name. Jeślijest to ścieżka bezwzględna, skrypt dołącza ją do adresu URL strony, aby utworzyćkompletny adres rysunku. Sprawdzanie rodzaju ścieżki odbywa się przy użyciumetody absolute? i ma miejsce przy tworzeniu nowego obiektu typu Pathname .Choć ścieżka do rysunku może się zmienić, jego nazwa jest stała i znajduje sięw zmiennej copy .

Po utworzeniu poprawnego adresu rysunku skrypt wykorzystuje obsługęplików wirtualnych, którą zapewnia biblioteka open-uri, w celu wczytania obrazka

Page 21: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 153

i zapisania go w pliku (jego nazwę zawiera zmienna copy) . Ten proces należypowtórzyć dla każdego rysunku znalezionego w dokumencie. Efekt tych operacjiskrypt zapisuje w katalogu, w którym został uruchomiony.

Modyfikowanie skryptuMożesz użyć gotowego parsera kodu HTML, takiego jak mechanize, Hpricot lubRubyful Soup. Te narzędzia działają jeszcze dokładniej niż wyrażenie regularnezastosowane w skrypcie. Ponadto możesz zapisać rysunki w takiej samej strukturzekatalogów, w jakiej znajdowały się na serwerze sieciowym. Istnieje wiele różnychmożliwości, a ten skrypt to dobry punkt wyjścia.

46. Narzędzie do wydobywania danychze stron WWW

Scraping w swej najprostszej postaci polega na wydobywaniu danych z innychwitryn za pomocą standardowych zapytań HTTP. Przeznaczony do tego skrypt towzbogacona wersja poprzednich programów. Program ten łączy omówione wcze-śniej techniki i udostępnia kilka dodatkowych funkcji. Jest to uniwersalne narzę-dzie do prostego pobierania danych ze stron. Nie jest to bot, ponieważ wszystkiedziałania skryptu wymagają interakcji z użytkownikiem, jednak po wprowadzeniukilku drobnych usprawnień program ten można w pełni zautomatyzować.

Kod

require 'rio'require 'open-uri'require 'uri'

unless ARGV[0] and ARGV[1] puts "Musisz określić operację i adres URL." puts "Sposób użycia: scrape.rb [strona|rysunki|linki] <przetwarzany adres URL>" exitend

case ARGV[0]

when "strona" rio(ARGV[1]) > rio("#{URI.parse(ARGV[1].strip).host}.html") exitwhen "rysunki" begin open(url, "User-Agent" => "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)") do |source| source.each_line do |x|

scrape.rb

Page 22: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

154 Roz d z i a ł 7

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 "Wystąpił błąd – spróbuj ponownie." puts e end exitwhen "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 "Wystąpił błąd – spróbuj ponownie." puts e end links.close exitelse puts "Podałeś nieprawidłową instrukcję – spróbuj ponownie." puts "Sposób użycia: scrape.rb [strona|rysunki|linki] <przetwarzanyadres URL>" exitend

Uruchamianie koduAby uruchomić skrypt, wpisz następujące polecenie:

ruby scrape.rb [strona|rysunki|linki] http://przetwarzany_adres_url.com/

Dane wyjścioweDane wyjściowe skryptu są różne w zależności od wybranej instrukcji. Możeszzapoznać się z przykładem z poprzedniego programu.

Page 23: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 155

Jak działa ten skrypt?Skrypt udostępnia trzy opcje. Możesz pobrać dane za pomocą instrukcji linki,rysunki lub strona. Do obsługi tych opcji służy instrukcja case . Można teżzastosować blok if/else, jednak polecenie case jest bardziej przejrzyste. Jeśli użyt-kownik chce pobrać stronę, skrypt używa instrukcji rio do skopiowania koduźródłowego dokumentu do pliku HTML na lokalnym komputerze . Polecenierio obsługuje tak wiele szczegółowych, żmudnych operacji, że zadanie to możnawykonać w jednym wierszu kodu!

Następny blok wydobywa rysunki . Ta sekcja to kopia kodu ze skryptu 45. —„Wydobywanie rysunków”, dlatego nie będę szczegółowo omawiał tego fragmentu.Jeśli chcesz dowiedzieć się czegoś więcej, zajrzyj do opisu poprzedniego programu.

Ostatni fragment instrukcji case wydobywa odnośniki. W odróżnieniu od innychczęści skryptu w tej zrezygnowałem ze stosowania gotowych rozwiązań, aby przed-stawić inny sposób pobierania adresów URL. W tym podejściu do pobieraniakodu źródłowego służy metoda open biblioteki open-uri , a następnie skryptwywołuje metodę URI.extract, która wyszukuje odsyłacze HTTP i HTTPS .Wyniki program zapisuje w pliku tekstowym links.txt.

47. Szyfrowanie po stronie klientaW opisach technologii informacyjnych i zabezpieczeń często powtarzają się trzyzasady: poufności, integralności i dostępności. Każdy z tych komponentów wpływana sposób interakcji użytkownika z danymi. Dwa następne skrypty mają wbudo-wane szyfrowanie RSA, co zapewnia poufność, i kodowanie SHA1, gwarantująceintegralność informacji. Do przesyłania danych w tym programach służy sieciowepołączenie TCP.

Kod

require 'socket'require 'digest/sha1'

begin print "Uruchamianie klienta..." client = TCPSocket.new('localhost', 8887)

puts "nawiązano połączenie!\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)

RSA_client.rb

Page 24: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

156 Roz d z i a ł 7

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 "Przesyłanie polecenia..."

client.send(command,0)

puts "wysłane!"rescue => e puts "Wystąpił poważny problem..." puts e retryend

client.close

Uruchamianie koduAby włączyć skrypt, wpisz następującą instrukcję:

ruby RSA_client.rb

Dane wyjściowePoniżej znajdują się dane wyjściowe, wyświetlane po udanym nawiązaniu połą-czenia i przesłaniu polecenia.

Uruchamianie klienta...nawiązano połączenie!

Otrzymano 1024-bitowy klucz publiczny RSA!

Przesyłanie polecenia...wysłane!

Jak działa ten skrypt?Działanie klienta rozpoczyna się od próby nawiązania połączenia TCP przy użyciuokreślonego adresu IP i numeru portu . Jeśli operacja ta się powiedzie, skryptprzekaże do standardowego wyjścia tekst nawiązano połączenie. Następnie klientoczekuje na otrzymanie 1024-bitowego publicznego klucza szyfrującego RSAz serwera. Ten klucz skrypt zapisuje w zmiennej tmp, ponieważ do czasu prze-kształcenia danych na obiekt klucza RSA OpenSSL są one tylko niezrozumiałymłańcuchem znaków . Po zainicjowaniu zmiennej public_key i zapisaniu w niejpublicznego klucza RSI program potwierdza jego otrzymanie oraz może przystąpićdo szyfrowania informacji .

Page 25: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 157

Skrypt przesyła dane, które zawierają nazwę odtwarzacza plików muzycznych.W systemie Linux jest to mpg123, a na platformie Windows — klasyczny odtwa-rzacz Media Player (plik mplayer2.exe). Oprócz nazwy aplikacji skrypt przekazujenazwę pliku muzycznego — ruby.mp3. Ten plik znajduje się już na serwerze,dlatego program po prostu nakazuje serwerowi odtworzenie danego utworu.Poszczególne części łańcucha znaków z poleceniem są rozdzielone gwiazdką (*).Możesz w dowolny sposób zmodyfikować to polecenie i same dane, ponieważprogram zaszyfruje je oraz prześle na serwer.

Następny krok to szyfrowanie informacji. Skrypt zapisuje omówiony wcześniejłańcuch znaków z zapytaniem w zmiennej msg i szyfruje przy użyciu publicznegoklucza RSA otrzymanego z serwera. Przed zaszyfrowaniem danych program kodujekomunikat za pomocą algorytmu SHA1 i zapisuje wygenerowany kod w zmien-nej sha1 . Ten kod zostanie użyty po przesłaniu danych na serwer. Pamiętaj,że algorytm SHA1 jest jednostronny, dlatego jeśli w trakcie przekazywania danychzostaną one zmodyfikowane, pierwotny i nowy kod będą się od siebie różnić.

Następnie skrypt scala zmienne sha1 i msg, łącząc je gwiazdką. Do szyfrowaniadanych wyjściowych służy metoda public_encrypt obiektu klucza RSA . Jak możezgadłeś, metoda ta szyfruje informacje przy użyciu publicznego klucza RSA. Tylkoodpowiadający mu prywatny klucz RSA pozwala odszyfrować komunikat.

Na zakończenie skrypt przesyła zaszyfrowany komunikat na serwer i zamykapołączenie . Jeśli w trakcie szyfrowania lub przesyłania danych wystąpią pro-blemy, sytuację pozwoli uratować zaufany blok begin/rescue. Jeżeli wszystkieoperacje zakończą się sukcesem, serwer odtworzy fantastyczne dźwięki związanez językiem Ruby! Czy jest w życiu coś piękniejszego od słuchania pioseneko języku Ruby?

48. Szyfrowanie po stronie serweraPo zapoznaniu się z klientem i jego kodem pora przyjrzeć się serwerowi. Przyj-muje on dane, sprawdza, czy kod SHA1 jest poprawny, odszyfrowuje informacjei wykonuje polecenie z przesłanego łańcucha znaków.

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)

RSA_server.rb

Page 26: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

158 Roz d z i a ł 7

while session = server.accept begin puts "Nawiązano połączenie...trwa wysyłanie klucza publicznego.\n\n" puts pub_key session.print pub_key puts "Przesłano klucz publiczny – trwa oczekiwanie na dane...\n\n"

temp = session.recv(10000) puts "Otrzymano dane..."

msg = priv_key.private_decrypt(temp) rescue => e puts "Wystąpił poważny 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 można przeprowadzić walidacji komunikatu!" end exitend

Uruchamianie koduW celu uruchomienia skryptu wpisz poniższe polecenie:

Page 27: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

S e r we r y i w y d o b y w a n i e da n yc h 159

ruby RSA_server.rb

Dane wyjściowePoniżej znajdują się dane wyjściowe, wyświetlane po udanym nawiązaniu połą-czenia i przesłaniu polecenia.

Nawiązano połączenie...trwa wysyłanie klucza publicznego.

-----BEGIN RSA PUBLIC KEY-----MIGJAoGBAMe12IJIyVULS/OLlHeekhZNyh2YhuGfJSwEozw2Z6GfaRjZg7s0cwqbB/Z+MMUPIjCmiH38pkKzh5GhA8zcRSWEFtssa8HcyIowA5ftZM27/6diYz9kNueINO2kvlkqwU5KUOKnLISJnrZAlTbJMqio24dn3PNm27kgae8+KdrHAgMBAAE=-----END RSA PUBLIC KEY-----Przesłano klucz publiczny – trwa oczekiwanie na dane...

Otrzymano dane...Potwierdzono integralność komunikatu...Wykonywanie polecenia dla systemu Windows: "C:\Program Files\Windows MediaPlayer\mplayer2.exe" ruby.mp3

Jak działa ten skrypt?Skrypt generuje najpierw niepowtarzalny prywatny klucz RSA . Na podstawietego klucza powstaje publiczny klucz RSA. Do jego wygenerowania służy metodapublic_key obiektu klucza RSA. Przy każdym uruchomieniu program tworzy nowąparę kluczy. Jeśli klient prześle dane zaszyfrowane przy użyciu dawnego kluczapublicznego, serwer nie zdoła odszyfrować komunikatu.

Po utworzeniu kluczy RSA skrypt inicjuje serwer TCP . Serwer ten należyuruchomić przy użyciu argumentów w postaci nazwy serwera i portu, które możnapodać w wierszu poleceń. Jeśli te argumenty nie są dostępne, skrypt używa ustawieńdomyślnych. Kiedy serwer jest już gotowy, rozpoczyna oczekiwanie na połącze-nia. Pętla while umożliwia zarządzanie w skrypcie sesjami . Ponieważ programnie jest wielowątkowy, w danym momencie obsługuje tylko jedno połączenie.

Kiedy użytkownik uruchomi klienta, ten nawiąże połączenie z serwerem. Spo-woduje to rozpoczęcie nowej sesji, a pierwsza operacja w niej polega na prze-słaniu przez serwer publicznego klucza RSA . Klucz RSA jest mały, dlatego jegoprzekazywanie trwa krótko. Następnie skrypt oczekuje na przesłanie danych przezklienta. W tym czasie klient otrzymuje publiczny klucz RSA i szyfruje przesyłanykomunikat. W zmiennej temp skrypt zapisuje dane odebrane przez serwer przyużyciu połączenia TCP. Limit tych informacji to 10 000 bajtów . Dopiero poodebraniu danych program przechodzi do dalszych działań.

Przy użyciu metody private_decrypt obiektu klucza RSA skrypt odszyfrowujedane ze zmiennej temp i zapisuje je w zmiennej msg . Jeśli w czasie pobieraniai odszyfrowywania łańcucha znaków z poleceniem wystąpią błędy, klauzula rescueprzechwyci je i wyświetli przydatne informacje, które pomogą rozwiązać problem.

Page 28: Ruby. Praktyczne skrypty, które rozwiążą trudne problemypdf.helion.pl/rubyps/rubyps-7.pdf · Struktura książki i zastosowane podejście ... informacji (czyli tak zwany data

160 Roz d z i a ł 7

Jak pewnie sobie przypominasz z opisu skryptu 47. — „Szyfrowanie postronie klienta”, łańcuch znaków z poleceniem jest ograniczony gwiazdką (*).Dlatego aby pobrać właściwy fragment tekstu, należy użyć metody split i podaćgwiazdkę jako ogranicznik zastosowany w łańcuchu msg . Dane wyjściowe skryptzapisuje w zmiennej command, która przechowuje tablicę łańcuchów znaków. Ponie-waż tekst powstaje w skrypcie klienckim, wiadomo, z jakich fragmentów się składa.Na początku znajduje się kod SHA1, następnie nazwa aplikacji dla systemu Linux,nazwa programu dla platformy Windows i przeznaczony do użycia plik.

Do utworzenia kodu SHA1 służy instrukcja dla systemu Linux, polecenie dlaplatformy Windows i nazwa pliku . Między poszczególnymi częściami łańcu-cha znaków znajdują się gwiazdki, co pozwala odtworzyć pierwotny tekst. Efektjego zakodowania jest porównywany z wartością zmiennej serv_hash, która zawierakod SHA1 przesłany przez klienta. Jeśli porównywane kody nie są sobie równe,dane musiały ulec zmianie w trakcie ich przesyłania. Nie można ufać takim infor-macjom, dlatego program kończy działanie. Miejmy jednak nadzieję, że oba kodybędą takie same, a skrypt wykona dalsze operacje.

Po potwierdzeniu integralności komunikatów program musi wybrać urucha-mianą aplikację. Ruby umożliwia łatwe określenie używanego systemu. Wystarczyo to zapytać przy użyciu wyrażenia RUBY_PLATFORM. Jeśli korzystasz z systemuWindows, wartość tego wyrażenia to i386-mswin32. Przy użyciu wygodnej metodyinclude? skrypt sprawdza, czy łańcuch znaków z wyrażenia RUBY_PLATFORM zawierafragment mswin32 . Jeśli ten test zwróci wartość true, program wywoła polece-nie dla systemu Windows. W przeciwnym razie uruchomiona zostanie aplikacjadla platformy Linux . W obu przypadkach jeżeli wszystkie operacje przebiegnąprawidłowo, system powinien uruchomić program muzyczny i rozpocząć odtwa-rzanie pliku ruby.mp3. Skrypt kończy działanie po zamknięciu aplikacji muzycznej.W ten sposób można komunikować się w poufny sposób, a jednocześnie zachowaćintegralność danych.