Un primo sguardo a wget
wget è una potente utility di Linux in modo testo per scaricarsi interi
siti HTTP o FTP per visione offline o per farne il mirror. Questi appunti
introducono all'uso di wget tramite degli esempi di scaricamenti di siti.
Per saperne di più basta digitare da una consolle Linux:
$ info wget
un breve riassunto delle opzioni si ottiene con
$ wget -h
Supponete di volervi scaricare tutto l'FTP mini-HOWTO per visione offline.
L'URL è:
http://www.linuxdoc.org/HOWTO/mini/FTP.html
Dateci un'occhiata.
Se fate
$ wget http://www.linuxdoc.org/HOWTO/mini/FTP.html
scaricate solo la prima pagina FTP.html nella directory corrente, mentre
il comando:
$ wget http://www.linuxdoc.org/HOWTO/mini/
scaricherebbe solo il file index.html
Per scaricare tutti i file collegati occorre inserire, prima o dopo l'URL,
l'opzione -r che sta per "recurse". Quindi:
$ wget http://www.linuxdoc.org/HOWTO/mini/FTP.html -r
oppure
$ wget -r http://www.linuxdoc.org/HOWTO/mini/FTP.html
Per ogni file scaricato, wget scrive su stderr (standard error), quindi
per default sul video, le seguenti informazioni:
--10:36:37-- http://www.linuxdoc.org:80/HOWTO/mini/FTP.html
=> `www.linuxdoc.org/HOWTO/mini/FTP.html'
Connecting to www.linuxdoc.org:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: 2,533 [text/html]
0K -> .. [100%]
Questo significa che alle ore 10:36:37, wget ha fatto la richiesta
all'host HTTP www.linuxdoc.org (sulla porta HTTP di default, la numero 80)
richiedendo il file /HOWTO/mini/FTP.html. La richiesta è andata a buon
fine (200 OK). Questo file è stato salvato in locale con lo stesso nome
(FTP.html) nel direttorio (creato apposta da wget)
www.linuxdoc.org/HOWTO/mini/ a partire dalla directory corrente. La
lunghezza del file è di 2,533 bytes e il suo mime type è text/html. wget
stampa un puntino (.) per ogni kbyte scaricato e indica pure la
percentuale del file scaricato e poi anche la velocità media di
scaricamento.
Entrando in www.linuxdoc.org/HOWTO/mini trovate tutti i file dell'howto
scaricati (ll sta per ls -l nella mia versione di Linux; con linux peanut
basta digitare l; il comando alias comunque vi dice tutti gli alias
definiti e vi permette di ridefinirli o definirne di nuovi):
$ ll
total 52k
-rw-r--r-- 1 root root 1.8k Feb 15 22:37 FTP-1.html
-rw-r--r-- 1 root root 2.0k Feb 15 22:37 FTP-2.html
-rw-r--r-- 1 root root 10k Feb 15 22:37 FTP-3.html
-rw-r--r-- 1 root root 4.5k Feb 15 22:37 FTP-4.html
-rw-r--r-- 1 root root 2.8k Feb 15 22:37 FTP-5.html
-rw-r--r-- 1 root root 3.1k Feb 15 22:37 FTP-6.html
-rw-r--r-- 1 root root 2.5k Feb 15 22:37 FTP.html
-rw-r--r-- 1 root root 317 Feb 15 22:36 next.gif
-rw-r--r-- 1 root root 317 Feb 15 22:36 prev.gif
-rw-r--r-- 1 root root 316 Feb 15 22:36 toc.gif
Con l'opzione -b si attiva wget in background. Ecco lo stesso scaricamento
di prima, fatto in background:
$ wget -rb http://www.linuxdoc.org/HOWTO/mini/FTP.html
Continuing in background.
Output will be written to `wget-log'.
Per vedere il log basta fare
$ less wget-log
Intando avete la stessa consolle libera per fare altre cose.
Nota: se desiderate un nome diverso per il file di log, specificatelo
con l'opzione -o (alias --output-file). Es.
$ wget -rb http://www.linuxdoc.org/HOWTO/mini/FTP.html -o ftp_howto.log
L'opzione -o può essere specificata anche senza l'opzione -b. In questo
caso il log invece di andare a video verrà scritto sul file specificato
(ma dovrete attendere che wget finisca prima di avere la shell libera,
a meno che non lo stoppate con CTRL-Z e poi riprendete in background
con bg; è più semplice comunque usare l'opzione -b).
Notiamo infine che se il file specificato con -o esiste già, esso
viene sovrascritto (sempre ovviamente che l'utente che lancia
wget abbia permesso di scrivere il file).
Le opzioni sono tante
date un'occhiata a questo comando, se non lo conoscevate:
$ man 1 nohup
nohup permette di avviare un altro programma, in modo che non sia
interrompibile (il segnale di hungup mandato al processo figlio generato
da nohup viene ignorato). Questo vi consente non solo di avere la consolle
libera, ma anche di far continuare il lavoro di scaricamento di wget anche
dopo che vi siete loggati fuori! La sintassi è semplice:
nohup COMMAND [ARG]...
Esempio:
$ nohup wget -rb http://www.linuxdoc.org/HOWTO/mini/FTP.html
L'output che wget dirige a stdin viene salvato sul file nohup.out
(se il file esiste già il nuovo output viene appeso al contenuto
esistente) e come prima viene creato wget-log. In questo caso
nohup.out contiene semplicemente il messaggio con cui wget
indica che lo scaricamento prosegue in background:
nohup.out
Continuing in background.
Output will be written to `wget-log'.
Quindi potete scaricarvi un grosso sito, mentre non ci siete e non occorre
nemmeno essere loggati o lasciare il telnet aperto (se intendete fare lo
scaricamento su un sistema remoto), grazie a nohup. Ovviamente nohup può
essere usato con qualsiasi altro comando, non solo con wget.
Un'altra opzione di wget, -S vi fornisce nel log molte altre informazioni
in più sui file che andate scaricando. Ecco un esempio:
$ wget localhost/prova
--21:31:51-- http://localhost:80/prova
=> `prova'
Connecting to localhost:80... connected!
HTTP request sent, awaiting response... 302 Found
Location: http://localhost/prova/ [following]
--21:31:51-- http://localhost:80/prova/
=> `index.html'
Connecting to localhost:80... connected!
HTTP request sent, awaiting response... 200 Ok
Length: 83 [text/html]
0K -> [100%]
21:31:51 (81.05 KB/s) - `index.html' saved [83/83]
$ wget -S localhost/prova
--21:32:28-- http://localhost:80/prova
=> `prova'
Connecting to localhost:80... connected!
HTTP request sent, awaiting response... 302 Found
2 Content-Type: text/html
3 Accept: */*
4 Host: localhost
5 User-Agent: Wget/1.5.3
6 Content-Length: 0
7 Server: Xitami
8 Location: http://localhost/prova/
9
Location: http://localhost/prova/ [following]
--21:32:29-- http://localhost:80/prova/
=> `index.html.1'
Connecting to localhost:80... connected!
HTTP request sent, awaiting response... 200 Ok
2 Server: Xitami
3 Content-Type: text/html
4 Content-Length: 83
5 Last-Modified: Thu, 17 Aug 2000 21:06:36 GMT
6
0K -> [100%]
21:32:29 (81.05 KB/s) - `index.html.1' saved [83/83]
Le informazioni in più ottenute con -S includono la data di ultima
modifica del file che si sta scaricando e il nome del server (che è Xitami
sul mio vecchio portatile :). In sintesi -S (o --server-response) fa
stampare nei log anche gli header mandati dai server HTTP e le risposte
inviate dai server FTP.
Ok, supponiamo di voler fare lo stesso download, ma non volere che wget
ricrei in locale la stessa struttura delle directory che c'è a partire
dalla document root del server: in pratica tutti i file di prima devono
essere messi in una sola directory, che si chiama FTP_mini_HOWTO, invece
di essere messi in www.linuxdoc.org/HOWTO/mini. Il comandi che bisogna
dare sono:
$ mkdir FTP_mini_HOWTO
$ cd FTP_mini_HOWTO
$ wget -nd -r http://www.linuxdoc.org/HOWTO/mini/FTP.html
-nd sta per "no directory" ed ha effetto quando si scarica ricorsivamente.
Tutti i file vengono salvati nella directory corrente, e non viene
ricreata la stessa struttura delle directory del server. Se vengono
scaricati file con lo stesso nome in directory differenti, wget rinomina i
file aggiungendo l'estensione .n, quindi non perderete nessun file causa
sovrascrittura.
Inoltre esiste l'opzione -P, oppure --directory-prefix=PREFIX che
specifica di salvare la struttura del sito all'interno di PREFIX. Quindi i
comandi precedenti possono essere abbreviati in uno solo:
$ wget -r -nd -P FTP_mini_HOWTO http://www.linuxdoc.org/HOWTO/mini/FTP.html
in quanto se la directory FTP_mini_HOWTO non esiste, essa viene creata da
wget, in questo caso a partire dalla directory corrente. Se volete sia
creata invece nella vostra home, l'opzione diventa -P ~/FTP_mini_HOWTO
Naturalmente il default valore di default dell'opzione -P è `.' (la
directory corrente).
Inoltre potete specificare più URL sulla riga di comando di wget, insieme
ad opzioni che si applicano a tutti gli URL iniziali. Infatti la sintassi
generica di wget è:
wget [OPTION]... [URL]...
e quindi ad es.
wget [OPTION] URL1 URL2
equivale a
wget [OPTION] URL1
wget [OPTION] URL2