Esercitazione n. 5

In questa esercitazione dapprima vediamo un video sulla codifica dell'informazione.
Poi vediamo alcuni comandi Unix di utilità generale ed infine riprendiamo gli esercizi di HTML svolti nelle esercitazioni precedenti.

Molti dettagli relativi ai comandi Unix verranno discussi nei corsi dei prossimi anni.
Notiamo inoltre che molti di questi comandi (in particolare quelli di connessione remota) non sono disponibili per default sotto Windows, e alcuni non sono possibili del tutto.

Si lavora con la shell, quindi entro una console

Comandi per file, directory e processi

  1. grep
    Permette di trovare delle sequenze di caratteri contenute all'interno di uno o più file. Ad esempio, il seguente comando restituisce l'elenco dei file HTML (identificati grazie a *.html) che contengono la sequenza "prova HTML" (se si cerca una sola parola si possono omettere le virgolette)
    $ grep "prova HTML" *.html
  2. ls (list directory content)
    Visualizza il contenuto di una directory e permette di vedere alcune proprietà dei file e delle directory
    1. ls -a visualizza tutte le directory e tutti i file della directory corrente
    2. ls -l visualizza le directory e i file della directory corrente il cui nome non inizia con il simbolo ".", elencandone delle proprietà (ad esempio, i permessi di accesso che vedremo dopo)
    3. ls -t visualizza le directory e i file della directory corrente il cui nome non inizia con il simbolo ".", in ordine di data
    4. ls *.html visualizza tutti i file della directory corrente che hanno estensione .html
      * indica qualunque sequenza di caratteri e si può naturalmente cambiare l'estensione, ad esempio *.c, *.txt
      Scrivendo ls *aa* verranno visualizzati tutti i file e le directory che nel loro nome contengono la coppia di lettere "aa"

    Poi c'è il comando man (manuale in linea).

    Se qualcosa non è chiaro dalla spiegazione fatta qui, si può chiedere aiuto drettamente al sistema. Per esempio, se voglio sapere quali sono altre opzioni che posso usare con ls, scrivo:

    man ls
    
    Esercizio

    Provate a digitare ls -la. Se l'elenco di directory e file è troppo lungo, potete visualizzarlo a "pezzi" digitando il comando ls -la | more.
    Sullo schermo viene visualizzata una pagina (una schermata) alla volta. Per andare avanti alla prossima schermata si deve usare la barra di spaziatura; per uscire dal comando more si deve premere il tasto q

  3. chmod (change file access permissions)
    Questo comando permette di cambiare i permessi di accesso associati ai file. Si può accedere ad un file in lettura (r), scrittura (w), execuzione (x).
    Analogamente, una directory può essere letta (r), scritta (w) o attraversata (x).
    Inoltre, si può stabilire chi può operare su un file (su una directory): il proprietario del file (user, u), un utente che appartiene allo stesso gruppo di utenti (group, g), un utente che non è nello stesso gruppo (other, o), oppure tutti gli utenti (u,g,o) contemporaneamente (all, a).
    Tutti gli utenti in Unix hanno una login ed una password e sono suddivisi in gruppi

    1. Digitate nuovamente ls -l ed osservate le informazioni più a sinistra nello schermo.
      Per ogni file (directory) sono elencati i diritti di accesso usando 10 caratteri
      	-rwxrwxrxw
      	drwxrwxrwx
      	
      Il primo carattere indica se si tratta di un file (-) oppure di una directory (d). Poi seguono delle triplette della forma rwx. La prima descrive i permessi che l'utente proprietario (u) ha sul file, seguono i permessi degli utenti dello stesso gruppo (g) e quelli degli altri utenti (o).
    2. Con il comando chmod il proprietario del file può cambiare questi permessi. Usando il simbolo + si aggiungono dei permessi, con il simbolo - si tolgono dei pemessi.
      Ad esempio, con
      	$ chmod g+w prova.txt
      	$ chmod o-x prova.exe
      	
      prima si aggiunge il permesso di scrittura sul file prova.txt per gli untenti del gruppo e poi si toglie il permesso di esecuzione sul file prova.exe per gli "altri".
    Se un file è scrivibile da tutti (o+w), tutti gli utenti potranno modificarlo e cambiarne i permessi
    Esercizio

    Scegliete un file, osservatene i permessi e provate a modificarli con il comando chmod

  4. ps (report process status)
    Abbiamo visto che l'elaboratore esegue un certo numero di processi di sistema e un certo numero di processi utente che vengono generati quando l'utente lancia i suoi programmi mediante l'interfaccia grafica o mediante la linea di comando della shell.
    Capita ogni tanto che i programmi applicativi non rispondano più in modo corretto (in SW1 succede spesso con Netscape). Se non riuscite a chiudere un programma applicativo mediante i suoi menu, potete usare la shell.
    1. Con il comando ps viene visualizzato l'elenco dei vostri processi.
    2. Con il comando ps -A (oppure con ps -ax) vengono visualizzati tutti i processi.
    Tra tutte le informazioni che vengono visualizzate, ci interessa quella più a sinistra, il PID (Process IDentifier). Si tratta di un numero che identifica in modo univoco ogni processo e può essere usato per terminare quei processi che non rispondono più. Ricordate il numero intero che viene visualizzato quando lanciate un programma mediante la shell?
    Senza entrare nei dettagli (che vedrete nel corso di Sistemi Operativi) potete causare la terminazione di un processo bloccato, usando il comando kill -9 seguito dall'identificatore del processo che volete terminare.
    Ricordate la tabella dei processi?
    Anche in questo caso, se l'elenco dei processi è troppo lungo, potete usare il comando ps -ax | more per avere una suddivisione dell'elenco dei processi in schermate successive.
  5. background/foreground
    Provate a digitare
    $ sleep 10; ls
    
    Dopo una breve attesa (10 sec.), verrà visualizzato il contenuto della directory corrente. I comandi sleep 10 e ls sono stati mandati in foreground e quindi il processo shell è rimasto bloccato fino al termine dei comandi stessi.
    Provate ora a digitare
    $ sleep 10; ls &
    
    Il simbolo & in fondo al comando fa sì che i comandi vengano lanciati in background e quindi il prompt della shell diventi immediatamente utilizzabile. Ad un certo punto, dopo che è terminato il comando sleep 10, viene visualizzato il contenuto della directory corrente, ma nel frattempo è possibile inviare alla shell altri comandi ... provate ...

    Problema: ho lanciato un comando in foreground e vorrei bloccarlo, senza perdere la computazione che è già stata fatta.
    1. Si può sospendere il processo associato al comando, digitando i tasti Ctrl Z
    2. Si può far ripartire il processo in background usando il comando bg
    3. Si può far ripartire il processo in foreground usando il comando fg, ma in questo modo si bloccherà nuovamente la shell, ..
    Problema: ho lanciato un comando in foreground e vorrei bloccarlo ma non mi interessa il lavoro già fatto
    1. Si può terminare il processo associato al comando, digitando i tasti Ctrl C

Redirezione

Abbiamo appena usato il simbolo | (chiamato pipe in Unix). Di che cosa si tratta?

Tipicamente i programmi scrivono su terminale e leggono da tastiera. Questi sono considerati input e output standard.

Però un programma può prendere l'input da un file anziché da standard input, con il comando di redirezione dell'ingresso:

$ programma < filein
Analogamente, può scrivere l'output su un file con il comando di redirezione dell'uscita:
$ programma > fileout
Infine, l'output standard di un programma si può collegare all'input standard di un altro comando attraverso una tubatura o pipe con il comando
$ programma1 | programma2
Più programmi collegati da pipe (tubi) si chiamano pipeline (tubatura).

Esercizio

Fare un file che contiene la lista ordinata dei file della directory corrente.

Ottenere la lista estesa dei file col comando ls -l, collegarla in pipeline con il comando sort e redirigere l'uscita sul file lista-ordinata.

Verificare una connessione in rete

Si usa il comando ping (send ICMP packets to network hosts).

Permette di spedire dei pacchetti ad un host (nella LAN e su Internet), per verificare per esempio se l'host sta funzionando.

Segue un esempio di uso del comando ping -c 5 (dove -c 5 specifica che il comando termina dopo aver ricevuto 5 risposte):

$ ping -c 5 elios.disi.unige.it

PING elios.disi.unige.it (130.251.61.19): 56 data bytes
64 bytes from 130.251.61.19: icmp_seq=0 ttl=255 time=0.9 ms
64 bytes from 130.251.61.19: icmp_seq=1 ttl=255 time=0.8 ms
64 bytes from 130.251.61.19: icmp_seq=2 ttl=255 time=0.8 ms
64 bytes from 130.251.61.19: icmp_seq=3 ttl=255 time=1.0 ms
64 bytes from 130.251.61.19: icmp_seq=4 ttl=255 time=0.8 ms

--- elios.disi.unige.it ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.8/0.8/1.0 ms
Provate ad usare questo comando usando i nomi logici delle macchine del laboratorio.

Collegamento remoto

Unix (anche Linux) consente di collegarsi attraverso un terminale su una macchina remota. Con il comando telnet indirizzomacchina o con l'altro comando ssh indirizzomacchina si lavora sulla macchina di cui si specifica l'indirizzo, usando la sua CPU, la sua memoria, il suo sistema operativo...

In breve, esattamente come se si usasse la sua tastiera e il suo monitor.

Unica differenza: solo in modalità testo.

Che differenza c'è tra telnet e ssh? Dal punto di vista dell'uso, nessuna; dal punto di vista della protezione della comunicazione (sicurezza), il primo fa un collegamento non sicuro e il secondo fa un collegamento sicuro, ossia crittografato.

Spiegazioni più dettagliate si trovano sul sito www.openssh.org.

PER AVVIARE UNA SESSIONE telnet:

$ telnet indirizzomacchina
$ login:       (qui si scrive il proprio username)
$ password:    (qui si scrive la propria password) 

PER AVVIARE UNA SESSIONE ssh:

$ ssh indirizzomacchina
$ password:    (qui si scrive la propria password) 

Se si vuole specificare di nuovo uno username si deve dare il comando

$ ssh   -l username   indirizzomacchina

Esercizio (deve essere fatto in contemporanea con un secondo gruppo)

  1. Lanciate delle applicazioni sulla vostra macchina
  2. Scambiatevi con un altro gruppo
  3. Collegatevi alla vostra macchina da remoto
  4. Terminate le applicazioni che avete appena lanciato

È possibile specificare alle applicazioni grafiche su quale macchina devono visualizzare il loro output.

Trasferimento file con ftp

Il programma ftp (file transfer protocol) consente di trasferire i file attraverso la rete da un elaboratore all'altro.

Il programma sftp (secure ftp) esegue una connessione sicura in quanto crittografata.

NOTA BENE: IN LABORATORIA ABBIAMO A DISPOSIZIONE sftp E NON ftp

$ sftp <nomeutente>@<nomemacchina>
$ Enter password for <nomeutente>:

(nomemacchina è il nome simbolico; oppure l'indirizzo IP, che vedremo a lezione)

In una sessione ftp (sftp) si distingue la macchina locale dalla macchina remota. I comandi principali sono:
ls lista file
cd cambia directory
get <file> prendi il file <file> dalla macchina remota e copialo sulla locale
put <file> prendi il file <file> dalla macchina locale e copialo sulla remota
get <f1> <f2> prendi il file <f1> dalla macchina remota e copialo sulla locale con nome <f2>
put <f1> <f2> prendi il file <f1> dalla macchina locale e copialo sulla remota con nome <f2>
mget <lista> prendi i file elencati nella lista dalla macchina remota e copiali sulla locale
mput <lista> prendi i file elencati nella lista dalla macchina locale e copiali sulla remota
del <file> cancella il file <file> dalla macchina remota

Esercizio (deve essere fatto in contemporanea con un secondo gruppo)

Farsi ospitare dall'altro gruppo, collegandosi a una macchina con uno dei loro username/password, senza scollegarsi dalla propria macchina.

Collegarsi con sftp alla macchina su cui si era collegati con il proprio username/password e eseguire alcuni trasferimenti di file.

L'altro gruppo ripete la prova.

HTML

Se avete visto tutti i comandi Unix riprendete gli esercizi HTML già svolti e organizzateli un po' meglio in directory. In particolare,
  1. create una directory images
  2. copiate tutte le immagini - che probabilmente avete salvato sotto la vostra home directory - nella cartella images
  3. andate a modificare i sorgenti HTML mettendo i pathname corretti per i file delle immagini. Attenzione, dovete usare pathname relativi perchè si tratta di una condizione necessaria ma non sufficiente per superare la prova di laboratorio.