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 56769×
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.
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 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.
--passive-ftp
nebo passive_ftp = on
v
wgetrc
zapne pasivní režim pro FTP-O <filename>
udává, jak se má jmenovat stažený soubor
(-O -
pro standardní výstup)-S
na standardní chybový výstup vypíše HTTP hlavičky
nebo odpovědi FTP serveru-b
stahuje na pozadí-q
a -nv
omezí výstupy programu (první zcela,
druhá částečně), vhodné pro stahování na pozadí nebo neinteraktivní
spouštění-p
stáhne HTML stránku i s veškerým viditelným obsahem
(tj. obrázky, zvuky, styly, nikoliv odkazy)-r
zapne rekurzivní režim, tj. stáhne dané URL a pokračuje
nalezenými odkazy, funguje i s FTP, je-li jako URL zadán adresář, stáhne ho
s celým jeho obsahem včetně podadresářů
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
.
man nc
man ftp
man wget