Linux v příkazech - TCP, ftp, http

V tomto dílu našeho seriálu se budeme opět zabývat utilitami pro komunikaci po síti, konkrétně se podíváme na netcat, ftp a wget.

1.8.2004 02:00 | Jan Houštěk | přečteno 56765×

Netcat

Netcat je, jak název napovídá, síťová varianta nástroje cat. Samotný program se jmenuje nc. V manuálové stránce se hned v podtitulu dozvídáme, že se jedná o "TCP/IP swiss army knife". Je s podivem, že tato poměrně mladá utilita nevznikla podstatně dříve a nezařadila se ke standardním Unixovým nástrojům.

Netcat pracuje ve dvou základních režimech - server a klient. Klient spustíme např. takto:

bfu@linux:~$ nc www.microsoft.cz 80
GET /linux.html HTTP/1.1
Host: www.microsoft.cz

HTTP/1.0 404 Not Found
Content-Length: 1635
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 22 Jul 2004 23:55:04 GMT
[...]

Netcat provedl spojení na port 80/tcp serveru www.microsoft.com. Nyní to, co napíšeme na standardní vstup (černá barva) je posláno bez úprav vzniklým TCP spojením, a odpovědi (modrá barva) jsou vypsány na standardní výstup.

Naše ukázka s HTTP klientem není příliš praktická, uživatel použije WWW browser a pro diagnostiku HTTP se lépe hodí např. wget, kterým se zabýváme dále v článku. Jak je ale vidět, pro prvotní diagnostiku síťových služeb se jedná o výborný nástroj (zejména ovládáme-li příslušný aplikační protokol <g>).

Server funguje velmi podobně, příkaz voláme s parametrem -l (listen) a pomocí -p <port> určíme TCP port, na kterém se má naslouchat (pro porty nižší než 1024 je na unixových systémech třeba zvláštních privilegií, např. v Linuxu musí proces získat CAP_NET_BIND_SERVICE, což obvykle smí pouze root). Následující příklad ukazuje přenesení souborů v obou směrech. Na straně serveru spustíme

nc -q 1 -l -p 1234 < server_to_client > client_to_server

a na klientovi poté

nc -q 1 server_name_or_IP 1234 > server_to_client < client_to_server

Parametr -q 1 zajistí uzavření spojení po obdržení EOF. Tento primitivní způsob přenosu dat se hodí v případě, že není k dispozici žádná jiná služba, je také vhodný k měření rychlosti linky (odpadá jakákoliv režie protokolu).

Místo přenosu souborů lze nc využít i pro přenos streamů. Pokud na jednom stroji máme např. DVB kartu, můžeme si vysílání spustit na jiném stroji; na stroji s kartou spustíme play_CT1 | nc -l -p 1234 a na stanici nc server | mplayer -cache 4096 -. play_CT1 je skript, který na standardní výstup pouští vysílání ČT1 (případně libovolný jiný obsah, který je třeba přenést). Keš v mplayeru je použita pro plynulé přehrávání v případě fluktuací v přenosu.

FTP

Historie tohoto protokolu sahá až do roku 1973. Přesto, že jeho návrh je pro dnešní potřeby již velmi nevhodný, stále se jedná vedle HTTP o nejpoužívanější protokol pro přenos dat na internetu.

Na většině unixových systémů je k dispozici základní klient překvapivě pojmenovaný ftp. Ukažme si, jak práce s ním může vypadat

bfu@linux:~$ ftp mirror.linuxsoft.cz
Connected to mirror.linuxsoft.cz.
220 ProFTPD 1.2.9 Server (mirror.linuxsoft.cz) [212.71.169.49]
Name (mirror.linuxsoft.cz:bfu): anonymous
331 Anonymous login ok, send your complete email address as your
password.
Password: *****
230-------------------------------------------------------------------
230-Welcome to mirror.linuxsoft.cz!
230-
230-This public FTP server is served by LAM plus Ltd., see
230-http://www.vasesit.cz for more details. In case of any unusual
230-problems, please report them via e-mail to <mirror@linuxsoft.cz>.
230-------------------------------------------------------------------
230 Anonymous access granted, restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> cd pool/104/9
250 CWD command successful.
ftp> ls
227 Entering Passive Mode (212,71,169,49,191,232).
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 linuxsoft linuxsoft 186901451 Jun 29 12:12
CorelPHOTOPAINT9Lnx.tar.gz
-rw-r--r--   1 linuxsoft linuxsoft       61 Jun 29 12:13 MD5SUMS
226 Transfer complete.
ftp> get CorelPHOTOPAINT9Lnx.tar.gz
local: CorelPHOTOPAINT9Lnx.tar.gz remote: CorelPHOTOPAINT9Lnx.tar.gz
227 Entering Passive Mode (212,71,169,49,191,228).
150 Opening BINARY mode data connection for CorelPHOTOPAINT9Lnx.tar.gz
(186901451 bytes)
226 Transfer complete.
186901451 bytes received in 107.26 secs (1701.6 kB/s)
ftp> exit
221 Goodbye.

Popišme, co se vlastně při spojení děje. Nejprve se připojíme na server a jsme dotázáni na login (nabízen je stejný login jako má naše session na klientovi). Speciální login anonymous se používá pro neautentizovaný přístup, místo hesla se udává e-mailová adresa (některé servery dokonce na různé úrovni kontrolují, zda je zadaný řetězec skutečně platnou e-mailovou adresou), chceme-li zůstat v anonymitě, použijeme např. user@example.com.

Server nás může v průběhu spojení obšťastňovat různými informativními hláškami (informace o serverovém software, obsah souboru welcome.msg apod.), o které jsou uživatelé GUI klientů často ochuzeni. Příkaz passive zapíná pasivní režim. V řídící konexi (z klienta na port 21/tcp FTP serveru) se přenáší jen příkazy a jejich výsledky (tj. to, co vidíme v příkladu), samotná data se přenáší separátní konexí, přičemž se rozlišuje, zda tuto konexi otevírá server (aktivní režim, historicky starší) nebo klient (pasivní režim). Celý návrh je z dnešního pohledu dost nevhodný (z hlediska bezpečnosti, firewallů, NATu), chceme-li si ale vybrat menší zlo, měli bychom používat právě pasivní režim. Některé klienty ho použijí automaticky, u některých je třeba ho zapnout ručně.

Samotné příkazy ve ftp session asi nepotřebují zvláštní komentář. Kromě předvedených cd a get je třeba zmínit ještě put a také jejich varianty podporující zástupné znaky * a ? (mget a mput). Užitečný je také příkaz pwd, seznam všech příkazů podporovaných klientem získáme příkazem help.

Chcete-li se vyhnout nutnosti neustálého zadávání loginu a hesla, lze tyto hodnoty předdefinovat v souboru .netrc v domovském adresáři. Příklad následuje, význam je zřejmý.

machine my.server.cz login me password mojeheslo
machine also.my.server.com login bfu password 4H,f$I/j#7v
default login anonymous password user@host.com

Nutno ještě zmínit, že existují i vylepšené verze řádkového FTP klienta, např. velmi oblíbený ncftp. Umí např. doplňovat názvy souborů a adresářů tabulátorem, stáhnout či vylistovat celý adresářový strom apod.

Wget

Wget je nástroj určený ke získávání souborů přes HTTP a FTP. Narozdíl od ftp nevyžaduje interaktivní ovládání, vše potřebné je předáno jako parametry na příkazové řádce, případně v konfiguračním souboru. Základní použití je opravdu jednoduché, příkazem wget <URL> stáhneme příslušný soubor do aktuálního adresáře. Pojďme se podívat na nejzajímavější volby.

Ukažme si nyní několik použití. Příklad s www.microsoft.com bychom s využitím wget udělali např. takto:

bfu@linux:~$ wget -S -O /dev/null http://www.microsoft.com/linux.html
--10:36:59--  http://www.microsoft.com/linux.html
           => `/dev/null'
Resolving www.microsoft.com... done.
Connecting to www.microsoft.com[207.46.156.220]:80... connected.
HTTP request sent, awaiting response... 
 1 HTTP/1.1 404 
 2 Connection: keep-alive
 3 Date: Wed, 28 Jul 2004 08:36:59 GMT
 4 Server: Microsoft-IIS/6.0
 5 P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI
TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
 6 X-Powered-By: ASP.NET
 7 Pragma: no-cache
 8 cache-control: no-store
 9 Content-Length: 16134
10 Content-Type: text/html
11 Expires: Wed, 28 Jul 2004 08:36:59 GMT
12 Cache-control: private
10:37:00 ERROR 404: (no description).

Úvodní stránku www.linuxsoft.cz včetně obrázků a stylů snadno stáhneme příkazem

wget -k -p www.linuxsoft.cz

V aktuálním adresáři vznikne adresář www.linuxsoft.cz a v něm soubor index.html a dále všechen potřebný obsah pro správné zobrazení stránky. Parametr -k slouží k přepsání linků ve staženém HTML dokumentu na lokálně stažený obsah. Toto je nutné např. v případě, že na stránce byla použita absolutní URL. Všimněte si, že při neuvedení protokolu v URL se předpokládá http, a není-li z URL zřejmý název souboru, použije se index.html (i když v tomto konkrétním případě se ve skutečnosti jedná o soubor index.php).

Nechat na pozadí stahovat linuxový kernel z FTP lze např. lze takto.

bfu@linux:~$ wget -b -c --limit-rate=50k ftp://sunsite.mff.cuni.cz/
MIRRORS/ftp.kernel.org/pub/linux/kernel/v2.0/linux-2.0.40.tar.bz2
Continuing in background, pid 24486.
Output will be written to `wget-log'

Parametr -b zapíná stahování na pozadí, průběh lze sledovat v souboru wget-log a ukončit lze posláním TERM signálu danému procesu (kill <pid>). Navázání nedokončeného downloadu umožňuje parametr -c. Poslední použitý parametr netřeba vysvětlovat, je ale k dispozici jen v novějších verzích wgetu (např. wget 1.8.1 z Debian Woodyho jej nepodporuje).

V posledním příkladu si ukážeme využití rekurze. Mirror stránek DJB provedeme snadno příkazem

wget -r -l inf -k cr.yp.to
# nebo
wget -m -k cr.yp.to

Volba -m nebo též --mirror nastaví parametry vhodné k mirrorování. Co přesně bude nastaveno lze zjistit v manuálové stránce. Nejdůležitější volby jsou -r, která zapíná rekurzi a -l, která určuje maximální hloubku stahování. Je možné použít při rekurzi a omezení hloubky nám již známou volbu -p. Není-li to explicitně požadováno volbou -H, nestahují se soubory z jiných domén (odkazy mimo cr.yp.to zůstanou nestaženy a nezměněny). Další možnosti najdete v dokumentaci.

Wget je ovšem nutno považovat jen za opravdu základní nástroj pro rekurzivní stahování. Většími možnostmi oplývá např. pavuk nebo httrack.

Zdroje

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=300