Zadanie #5 - klient FTP


Poniższy tekst jest bardzo skróconym opisem protokołu FTP i absolutnie nie pretenduje do roli dokumentacji tego protokołu. Opisuje jego wąski wycinek potrzebny do realizacja zadania laboratoryjnyego i nic ponad to.

1. Zasady ogólne.

Serwer FTP zwyczajowo nasłuchuje na porcie 21. Komunikacja z serwerem odbywa się poprzez wysyłanie mu jednowierszowych (kończonych parą znaków CRLF) poleceń z ewentualnymi parametrami. W odpowiedzi na polecenie serwer odsyła komunikat zawsze rozpoczynający się trzycyfrowym kodem zakończenia  (pełna lista kodów zakończenia załączona jest na końcu niniejszego opisu). Poza kodem zakończenia linia odpowiedzi może również zawierać dokładniejszy opis reakcji serwera na wydane mu polecenie. Istotne jest rola czwartego znaku odpowiedzi serwera - jeżeli jest to SPACJA, oznacza to, że jest to JEDYNA linia odpowiedzi. Jeżeli jest to znak MINUS, oznacza to, że serwer będzie przesyłał kolejne linie odpowiedzi. Standard zakłada, że odpowiedź wielowierszowa zostanie zakończona linią o takim samym kodzie, co wiadomość rozpoczynająca odpowiedź wielowierszową, ze spacją na czwartym znaku. Struktura wierszy pomiędzy wiadomością otwierającą a zamykającą jest dowolna.

2. Polecenie USER.

Po połączeniu się z serwerem ftp serwer odeśle notkę powitalną i przejdzie w tryb ustanawiania połaczenia. W tym trybie należy przesłać do serwera polecenie USER o składni:

    USER nazwa_uzytkownika

Po zaakceptowaniu polecenia USER serwer wezwie w odpowiedzi do podania hasła.

3. Polecenie PASS

Polecenie PASS służy do zakończenia autentykacji użytkownika  i ma następującą składnię:

    PASS hasło

4. Polecenie PASV

Bezparametrowe polecenie PASV przestawia server FTP w tzw. tryb pasywny. Ze względu na uproszczenie zadania, zakładamy, że nasz klient FTP będzie posługiwał się tym właśnie trybem. Szczegółów funkcjonowania trybu aktywnego oraz różnic pomiędzy trybami aktywnym i pasywnym i wynikających stąd konsekwencji należy spodziewać się na wykładzie - opis tego zagadnienia wykracza poza ramy niniejszego opracowania.
Istotna jest odpowiedź, jakiej udziela server FTP na polecenie PASV. Ma ona następującą (przykładową) postać:

227 Entering Passive Mode (127,0,0,1,5,79).

Pierwsze  4 liczby są rozpisanym na czery składowe bajty adresem IP serwera FTP. Dwie ostatnie są rozpisanym na dwa bajty (pierwszy bajt starszy) numerem portu, na którym serwer FTP będzie oczekiwał na zestawienie połaczenia. W powyższym przykładzie serwer informuje, iż oczekuje na połączenie na porcie 5 * 256 + 79 = 1359.

Uwaga #1: Połączenie nawiązane na porcie 21 służy wyłącznie do przesyłania poleceń i odbieraniu odpowiedzi. Wszelkie transfery danych odbywają się tylko poprzez port, którego numer podał serwer w odpowiedzi na polecenie PASV.
Uwaga #2: Wydanie serwerowi jakiegokolwiek polecenia inicjującego transfer plików wymaga wcześniejszego nawiązania połączenia na wskazanym porcie.
Uwaga #3: Połączenie na porcie 21 jest nazywane połaczeniem kontrolnym, połączenie na porcie wskazanych przez serwer nazywane jest połączeniem danych.
Uwaga #4: Połączenie danych jest ZAMYKANE po zakończeniu każdego transferu.

5. Polecenie CWD

Polecenie CWD  wydaje serwerowi polecenie zmiany katalogu bieżącego po stronie serwera. Po nawiązaniu połączenia jest to zwykle homedir użytkownika, który zalogował się do serwera. Polecenie CWD ma postać:

    CWD nazwa_katalogu

6. Polecenie CDUP

Bezparametrowe polecenie CDUP  wydaje serwerowi polecenie zmiany katalogu na bezpośrednio wyższy (odpowiednik cd ..).

7. Polecenie QUIT

Bezparametrowe polecenie QUIT  wydaje serwerowi polecenie zakończenia sesji FTP. Jeśli w tym momencie jest aktywne połączenie danych, to zostanie ono zamknięte dopiero w chwili zakończenia transferu.

8. Polecenie TYPE

Polecenie TYPE informuje serwer, jaki będzie typ danych transferowanych poprzez połączenie danych. Z naszego punktu widzenia interesujące są tylko dwa warianty tego polecenia:

TYPE A
transfer danych ASCII (znaków)

TYPE I
transfer strumienia bitów (danych binarnych)

9. Polecenie RETR

Polecenie RETR  wydaje serwerowi polecenie rozpoczęcia wysyłania połączeniem danych pliku o podanej nazwie: Polecenie ma postać:

 RETR nazwa_pliku

nazwa_pliku może zawierać nazwy wiodących do niego katalogów.

10. Polecenie LIST

Bezparametrowe polecenie LIST  wydaje serwerowi polecenie przesłania połączeniem danych informacji o zawartości katalogu bieżącego.

11. Polecenie MDTM

Polecenie powoduje odesłanie przez serwer informacji o czasie modyfikacji wskazanego pliku. Polecenie ma postać:

 MDTM nazwa_pliku

Jeśli wskazany plik istnieje, serwer FTP odeśle informację następującej postaci:

  213 YYYYMMDDhhmmss.sss

lub kod błędu w przeciwnym przypadku.

12. Zakończenie.

Powyższy dokument zawiera tylko niektóre elementy protokołu FTP. Pełny opis protokułu zawiera RFC 959 dostępne np. pod adresem http://www.ietf.org/rfc/rfc0959.txt?number=0959

13.  Zadanie

Napisz program uruchamiany poleceniem postaci:

mirror user@ftp.server/dir/dir localdir [-n]

Skrypt powinien:
W wariancie na ocenę 3.0:
W wariancie na ocenę 4.0:
W wariancie na ocenę 5.0:
14. Uwagi
Dodatek - kody zakończenia
110 Restart marker reply.
120 Service ready in nnn minutes.
125 Data connection already open; transfer starting.
150 File status okay; about to open data connection.
200 Command okay.
202 Command not implemented, superfluous at this site.
211 System status, or system help reply.
212 Directory status.
213 File status.
214 Help message.
215 NAME system type.
220 Service ready for new user.
221 Service closing control connection.
225 Data connection open; no transfer in progress.
226 Closing data connection.
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
230 User logged in, proceed.
250 Requested file action okay, completed.
257 "PATHNAME" created.
331 User name okay, need password.
332 Need account for login.
350 Requested file action pending further information.
421 Service not available, closing control connection.
425 Can't open data connection.
426 Connection closed; transfer aborted.
450 Requested file action not taken.
451 Requested action aborted: local error in processing.
452 Requested action not taken.
500 Syntax error, command unrecognized.
501 Syntax error in parameters or arguments.
502 Command not implemented.
503 Bad sequence of commands.
504 Command not implemented for that parameter.
530 Not logged in.
532 Need account for storing files.
550 Requested action not taken.
551 Requested action aborted: page type unknown.
552 Requested file action aborted.
553 Requested action not taken.