[ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ successivo ]


La guida Debian
Capitolo 8 - Trucchi per Debian


8.1 Avviare il sistema

Per informazioni dettagliate sul prompt del boot, vedere il BootPrompt-HOWTO dal LDP.


8.1.1 "Ho scordato la password di root!" (1)

E' possibile fare il boot del sistema ed accedere all'account di root, anche se non se ne conosce la password, basta avere accesso alla tastiera. (Premesso che che non esistono altre password richieste dal BIOS, o dal boot-loader tipo lilo che possono impedirvi l'accesso al sistema).

Questa procedura non richiede alcun disco di boot, nè cambiamenti al BIOS. In questo contesto, "Linux" è l'etichetta per lanciare il kernel in una installazione Debian standard.

Alla schermata di boot di lilo, non appena appare boot: (in alcuni sistemi si deve premere il tasto maiuscolo per prevenire il boot automatico) e se lilo usa il framebuffer dovete premere TAB per vedere le opzioni che digitate), date:

     boot: Linux init=/bin/sh

Il sistema avvia il kernel ed esegue /bin/sh invece dello standard init. A questo punto avete ottenuto i privilegi di root e la shell di root. Siccome, però / è montata in sola lettura e molte altre partizioni non sono state ancora montate, avete bisogno di eseguire quanto segue per avere un sistema ragionevolmente funzionante.

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(Se il secondo campo di dati all'interno di /etc/passwd è "x" per ogni username, il vostro sistema usa le shadow password, per cui dovrete modificare /etc/shadow.) Per disabilitare la password di root, modificate il secondo campo nel file password in maniera che risulti vuoto. Ora potete fare il reboot ed il log in come root senza una password. Quando fa il boot nel runlevel 1, Debian (almeno dopo Potato) richiede una password, mentre alcune distribuzioni più vecchie no.

E' buona cosa avere un piccolo editor in /bin nel caso in cui /usr non fosse accessibile (vedere Editor di salvataggio, Sezione 11.2).

Considerate anche l'installazione del pacchetto sash. Se il sistema diventa non più avviabile, eseguite:

     boot: Linux init=/bin/sash

sash funziona come sostituto interattivo di sh persino quando /bin/sh è inutilizzabile. Ha un collegamento statico ed include molte utilità di base al suo interno (digitate "help" al prompt per una lista di riferimento).


8.1.2 "Ho scordato la password di root!" (2)

Fate il boot da qualunque set di dischi di emergenza boot/root. Se, per esempio, /dev/hda3 è la partizione di root originale, i seguenti comandi permetteranno di aprire il file password facilmente come sopra.

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

Il vantaggio di questo approccio rispetto al metodo precedente è che non richiede la conoscenza della password di lilo (se esiste). Però, bisogna essere in grado di impostare il BIOS, se non lo è già, in modo che il boot del sistema sia da floppy o da CD.


8.1.3 Non riesco a fare il boot

Nessun problema, persino se non vi siete presi la briga di fare un dischetto di boot durante l'installazione. Se lilo non funziona, usate come disco di boot il disco di installazione di Debian (il primo) ed eseguite il boot da questo disco. Al prompt del boot, assumendo che la partizione di root del vostro Linux è su /dev/hda12 e che volete il runlevel 3, digitate:

     boot: rescue root=/dev/hda12 3

A questo punto siete entrati in un sistema pressochè funzionante in toto, basato sul kernel del dischetto. (Potrete avere piccole noie, dovute alla mancanza di alcuni moduli).

Vedere anche Installare un pacchetto su un sistema non bootabile, Sezione 6.3.6 se avete un sistema danneggiato.

Se volete crearvi un vostro boot floppy, leggete il readme.txt sul rescue disk.


8.1.4 "Voglio disabilitare X al boot!"

Avere unstable/sid è divertente, ma xdm, gdm, kdm, e wdm difettosi lanciati durante il boot possono fare molto male.

Primo, guadagnate la shell di root digitando quanto segue al prompt del boot:

     boot: Linux vga=normal s

Dove Linux è l'etichetta per l'immagine del kernel che andate a lanciare, "vga=normal" vi assicura che lilo si esegue in uno schermo normale VGA ed "s" (o "S") è il parametro dato ad init per invocare la modalità singolo utente. Al prompt date la password di root.

Esistono vari modi per disabilitare tutti i demoni che lanciano X:

Qui il numero in rc2.d deve corrispondere al runlevel specificato in /etc/inittab. ?dm significa tutti gli xdm, gdm, kdm, e wdm.

L'unico, vero modo Debian è il primo della lista. L'ultimo è semplice, ma funziona solo sulla Debian e richiede una nuova impostazione in seguito tramite dpkg-reconfigure. Gli altri sono metodi generici per disabilitare i demoni.

Avete sempre la possibilità di lanciare X con il comando startx da qualsiasi shell.


8.1.5 Altri trucchi con il boot prompt

Potete fare il boot in un particolare runlevel e configurazione tramite il prompt di lilo. Dettagli si trovano nel BootPrompt-HOWTO (LDP).

Se volete fare il boot nel runlevel 4, date il seguente comando al prompt di lilo.

     boot: Linux 4

Se si vuole il boot in modalità singolo utente, conoscendo la password di root, potete usare uno dei seguenti esempi al prompt di lilo.

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

Se si vuole il boot con meno memoria di quanta il sistema ne abbia (mettiamo 48M in un sistema con 64M), basta dare il seguente comando al prompt di lilo:

     boot: Linux mem=48M

Evitate di specificare più memoria di quanta ne abbiate, altrimenti il kernel si pianterà inevitabilmente. Se si hanno più di 64M, per esempio 128M, con vecchi kernel o BIOS bisogna specificare il comando mem=128M al prompt, od includere una riga simile in /etc/lilo.conf, altrimenti non verrà utilizzata memoria sopra i 64MB.


8.1.6 Come impostare i parametri di boot (GRUB)

GRUB è un nuovo boot manager proveniente dal progetto Hurd, molto più flessibile di Lilo, ma con un modo di maneggiare i parametri di boot lievemente differente.

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

Dovete conoscere come Hurd nomina i device:

     the Hurd/GRUB       Linux               MSDOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (solitamente)
      (hd0,3)             /dev/hda4           F: (solitamente)
      (hd1,3)             /dev/hdb4           ?

Vedere /usr/share/doc/grub/README.Debian.gz e /usr/share/doc/grub-doc/html/ per i dettagli.


8.2 Registrazione degli eventi


8.2.1 Registrare gli eventi della shell

L'amministrazione di sistema in ambiente Unix richiede dei compiti molto più elaborati che in un ambiente di un normale PC. E' importante conoscere le modalità di configurazione di base, per poter risolvere i problemi del sistema. Le interfacce grafiche di configurazione basate su X sono carine e convenienti, ma comunque limitate, specialmente in casi di emergenza.

In questo contesto, la registrazione degli eventi della shell è una buona pratica, specialmente come root.

Emacs: Usate M-x shell per iniziare la registrazione in un buffer e C-x C-w per scrivere il buffer su un file.

Shell: Usate il comando screen con "^A H" come decritto in Scambio di console con screen, Sezione 8.6.28 od il comando script.

     $ script
     Script started, file is typescript
      ... fate quello che dovete ...
      Ctrl-D
     $ col -bx <typescript >savefile
     $ vi savefile

Si può usare quanto segue invece di script:

     $ bash -i 2>&1 | tee typescript

8.2.2 Registrare gli eventi di X

Se dovete registrare l'immagine di una applicazione di X, incluso xterm, usate gimp (GUI). Può catturare ogni singola finestra, oppure lo schermo intero. Alternative sono xwd (xbase-clients), import (imagemagick), o scrot (scrot).


8.3 Copia ed archiviazione di una intera sottodirectory


8.3.1 Comandi base per copiare una intera sottodirectory

Se avete necessità di riarrangiare la struttura dei file, muovete il contenuto, compresi i collegamenti con:

     Metodo standard:
     # cp -a /partenza/directory /destinazione/directory # richiede GNU cp
     # (cd /partenza/directory && tar cf - . ) | \
             (cd /destinazione/directory && tar xvfp - )
     Se è coinvolto un collegamento, è necessario un metodo più "pedante":
     # cd /percorso/alla/vecchia/directory
     # find . -depth -print0 | afio -p -xv -0a /mount/point/della/nuova/directory
     Da remoto:
     # (cd /origine/directory && tar cf - . ) | \
             ssh user@host.dom (cd /destinazione/directory && tar xvfp - )
     Se non ci sono collegamenti:
     # scp -pr user1@host1.dom:/origine/directory \
               user2@host2.dom:/destinazione/directory

Qui scp <==> rcp e ssh <==> rsh.

Le seguenti informazioni comparative su come copiare una intera sottodirectory sono state presentate da Manoj Srivastava <srivasta@debian.org> nella lista debian-user@lists.debian.org.


8.3.2 cp

Tradizionalmente, cp non è mai stato un gran candidato per tali scopi, poichè non dereferenzia i collegamenti simbolici, nè preserva i collegamenti. Un'altro fattore da considerare è lo spezzettamento dei files (files con buchi).

GNU cp ha superato questi limiti; comunque su un sistema non GNU, cp potrebbe avere ancora problemi. In più, usando cp non si possono creare archivi che siano piccoli e facilmente trasportabili.

     % cp -a . newdir

8.3.3 tar

Tar è andato oltre alcuni dei problemi che aveva cp con i collegamentos simbolici. Comunque sia, sebbene cpio sia in grado di trattare file speciali,il tradizionale tar no.

Il modo in cui tar tratta collegamenti multipli ad un file è di porre solo una copia del collegamento sul nastro, ma il nome collegato a quella copia è il solo utilizzabile per recuperare il file; cpio invece, mette una copia per ciascun collegamento, ma per recuperare il file potete usare uno qualsiasi dei nomi.

Nella transizione da Potato a Woody, il comando tar ha cambiato l'opzione per i file .bz2, per cui usate --bzip2 negli script al posto della forma breve -I (Potato) o -j (Woody).


8.3.4 pax

E' l'utilità POSIX Portable Archive Interchange (IEEE Std 1003.2-1992, pagine 380–388 (sezione 4.48) e pagine 936–940 (sezione E.4.48)), nuova di zecca. pax legge, scrive ed elenca i membri di un file archivio, e ne copia le directory secondo le gerarchie. Le operazioni di pax sono indipendenti dal formato dell'archivio e supportano una grossa varietà di formati diversi.

Le implementazioni di pax sono ancora molto nuove.

     # apt-get install pax
     $ pax -rw -p e . newdir
      oppure
     $ find . -depth  | pax -rw -p e  newdir

8.3.5 cpio

cpio copia i file dentro o fuori un archivio cpio o tar. L'archivio può essere un'altro file sul disco rigido, un nastro magnetico, oppure una pipe.

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio è un metodo migliore per trattare con archivi in formato cpio. In genere è più veloce di cpio, ha maggiori opzioni per i nastri e tratta in maniera più gentile con le corruzioni dei dati in entrata. Supporta gli archivi multi-volume durante le operazioni in modalità interattiva. afio può creare archivi molto più sicuri di quelli compressi con tar o cpio. afio è anche ottimo come "motore per l'archiviazione" negli script di backup.

     $ find . -depth -print0 | afio -px -0a new-dir

Tutti i miei backup su nastro usano afio.


8.4 Backup differenziali e sincronizzazione dei dati

I backup differenziali e la sincronizzazione dei dati possono essere implementati con vari metodi:

La combinazione di uno dei metodi menzionati con uno dei metodi di archiviazione descritti in Copia ed archiviazione di una intera sottodirectory, Sezione 8.3 associati ad un job automatico regolare descritto in Programmare gli eventi (cron, at), Sezione 8.6.27 creeranno un ottimo sistema per il backup.

Mostrerò tre utilità facili da usare.


8.4.1 Backup differenziale con rdiff

rdiff-backup fornisce dei backup semplici e validi con lo storico differenziale per file di qualsiasi tipo, compresi i collegamenti simbolici. Per salvare gran parte di ~/ su /mnt/backup:

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

Per recuperare i dati vecchi tre giorni da questo archivio in ~/old:

     $ rdiff-backup -r 3D /mnt/backup ~/old

Vedere rdiff-backup(1).


8.4.2 Backup giornalieri con pdumpfs

pdumpfs è un sistema semplice per il backup giornaliero, simile a dumpfs di Plan), che conserva ogni snapshot giornaliero. Potete accedere in ogni monento agli snapshot passati per recuperare un determinato file di un tale giorno. Fate il backup della vostra directory home con pdumpfs e cron!

pdumpfs produce uno snapshot YYYY/MM/DD nella directory di destinazione. Tutti i file sorgenti vengono copiati nella directory di snapshot per la prima volta. La seconda volta e le succesive, pdumpfs copia solo i file aggiornati o nuovi, immagazzinando quelli immodificati come collegamenti ai file dello snapshot del giorno precedente per salvare spazio su disco.

     $ pdumpfs src-dir dest-dir [dest-basename]

Vedere pdumpfs(8).


8.4.3 Backup differenziali regolari con RCS

Changetrack registra regolarmente i cambiamenti ai file di testo di configurazione negli archivi RCS. Vedere changetrack(1).

     # apt-get install changetrack
     # vi changetrack.conf

8.5 Recuperare un sistema bloccato


8.5.1 Uccidere un processo

Lanciate top per vedere quale processo si comporta in maniera "sconveniente". Premete "P" per ordinarli per utilizzo di cpu, "M" per consumo di memoria e "k" per uccidere il processo.In alternativa potete usare i comandi in stile BSD ps aux | less od in stile System V ps -efH | less. La sintassi del System V mostra l'ID dei processi padri PPID che può essere usato per uccidere i figli zombie (defunti).

Usate kill per uccidere (o mandare il segnale a) un processo per ID del processo, killall per fare lo stesso con il nome del comando a cui il processo appartiene. Segnali più frequentemente usati:

      1: HUP,  riavvia il demone
     15: TERM, uccisione normale
      9: KILL, uccisione "dura"

8.5.2 Alt-SysRq

L'assicurazione contro i malfunzionamenti di sistema è un'opzione di compilazione del kernel, denominata "Magic SysRQ key". Premendo ALT-SysRq su un sistema i386, seguito da uno dei tasti r 0 k e i s u b, fa la "magia".

Un'r'aw riavvia la tastiera quando cose tipo X si bloccano. Cambiare il loglevel a 0 riduce i messagi di errore. sa'k' (system attention key) uccide tutti i processi sulla console virtuale attuale. t'e'rminate uccide tutti i processi su terminale corrente tranne init. k'I'll uccide tutti i processi, tranne init.

`S'ync, `'u'mount, e re`b'oot sono utili per uscire da situazioni veramente spinose.

I kernel debian standard non sono compilati al momento con questa opzione attivata. Ricompilate il kernel per farlo. Informazioni dettagliate le trovate in /usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz o /usr/src/kernel-version/Documentation/sysrq.txt.gz.


8.6 Alcuni piccoli comandi da ricordare


8.6.1 Pager

less è il pager (browser del contenuto dei file). Premete `h' per aiuto. Fa molto di più di more. less può essere potenziato mediante l'esecuzione di eval $(lesspipe) o eval $(lessfile) nello script di inizializzazione della shell. Per ulteriori notizie guardate in /usr/share/doc/lessf/LESSOPEN. L'opzione -R permette l'output di caratteri raw ed abilita le sequenze ANSI con escape colorate. Vedere less(1).

w3m può essere un pager alternativo utile per alcuni sistemi di codifica (EUC).


8.6.2 Memoria libera

free e top danno buone informazioni sulle risorse di memoria. Non vi preoccupate sulle dimensioni della memoria "used" nella riga "Mem:", ma leggete quella sotto. (38792 nell'esempio qui sotto).

     $ free -k # per una macchina con 256MB
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

L'esatto ammontare della memoria fisica può essere confermato da grep '^Memory' /var/log/dmesg, che in questo caso dà "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)".

     Total         = 262144k = 256M (1k=1024, 1M=1024k)
     Free to dmesg = 256984k = Total - kernel - reserved - data - init
     Free to shell = 257136k = Total - kernel - reserved - data

Circa 5MB non sono utilizzabili dal sistema, perchè a disposizione del kernel.


8.6.3 Impostare l'ora (BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

Questo imposterà l'orologio del sistema e dell'hardware a MM/GG hh:mm, CCYY. Le ore sono allineate al fuso locale, ma l'orologio dell'hardware utilizza lo UTC.

Se l'ora dell'hardware (BIOS) è impostata su GMT, modificate le impostazioni a UTC=yes in /etc/default/rcS.


8.6.4 Impostare l'ora (NTP)

Riferimento: Managing Accurate Date and Time HOWTO.


8.6.4.1 Impostare l'ora tramite una connessione Internet permanente

Impostazione automatica dell'ora esatta tramite un server remoto:

     # ntpdate server

Se avete una connessione permanente, è bene averlo in /etc/cron.daily.


8.6.4.2 Impostare l'ora tramite una connessione Internet sporadica

Usate il pacchetto chrony.


8.6.5 Come controllare le funzionalità della console, come lo screensaver

Per disabilitare lo screensaver, usate i comandi seguenti:

In console:

     # setterm -powersave off

Lanciate la console kon2 (kanji) con:

     # kon -SaveTime 0

In X:

     # xset s off
      or
     # xset -dpms
      or
     # xscreensaver-command -prefs

Leggete le pagine di manuale corrispondenti per controllare le altre funzionalità della console. Vedere anche stty(1) per modificare e stampare le impostazioni della riga di comando.


8.6.6 Ricerca dei database amministrativi

Glibc offre getent(1) per la ricerca di voci inserite nei database amministrativi, cioè, passwd, group, hosts, services, protocols, o networks.

     getent database [chiave...]

8.6.7 Disabilitare il suono (beep)

Potete sempre staccare gli altoparlanti del PC ;-) Per la shell Bash:

     echo "set bell-style none">> ~/.inputrc

8.6.8 Messaggi di errore sulla console

Per placare i messaggi di errore sullo schermo, il primo posto da vedere è /etc/init.d/klogd. Impostate KLOGD="-c 3" in questo script ed eseguite /etc/init.d/klogd restart. metodo alternativo è eseguire dmesg -n3.

I livelli di errore significano:

Se c'è un particolare ed inutile messaggio di errore che vi perseguita, considerate l'ipotesi di una banalissima patch per il kernel, tipo shutup-abit-bp6 (disponibile presso in the examples subdirectory).

Un altro posto da guardare può essere /etc/syslog.conf; controllate per vedere se qualche messaggio viene inviato alla console.


8.6.9 Impostare i caratteri corretti per la console

Agli schermi di console nei sistemi simil-Unix si accede generalmente tramite librerie (n)curses. Queste offrono all'utente un metodo indipendente dal terminale di aggiornamento dei caratteri, con una ottimizzazione ragionevole. Vedere ncurses(3X) e terminfo(5).

Su un sistema Debian molte sono le voci predefinite:

     $ toe | less                  # tutte le voci
     $ toe /etc/terminfo/ | less   # voci riconfigurabili dall'utente

Esportate la vostra selezione come variabile d'ambiente TERM.

Se la voce terminfo per xterm non funziona con un xterm non-Debian, cambiate il tipo di terminale da "xterm" ad una delle versioni con minori opzioni tipo "xterm-r6", quando accedete da remoto ad un sistema Debian. Vedere /usr/share/doc/libncurses5/FAQ per ulteriori informazioni. "dumb" è il minimo comun denominatore per terminfo.


8.6.10 Riportare la console allo stato normale

Quando lo schermo impazzisce dopo $ cat qualsiasi-file-binario (potreste non essere in grado di vedere il comando dato mentre lo state digitando):

     $ reset

8.6.11 Convertire file di testo da DOS a Unix

Converte file un di testo DOS (fine riga = ^M^J) in un file Unix di testo (end-of-line = ^J).

     # apt-get install sysutils
     $ dos2unix dosfile

8.6.12 Convertire un file di testo con recode

Quanto segue converte i file di testo fra gli stili di fine riga DOS, Mac, e Unix:

     $ recode /cl../cr <dos.txt >mac.txt
     $ recode /cr.. <mac.txt >unix.txt
     $ recode ../cl <unix.txt >dos.txt

recode, libero, converte i file tra i vari set di caratteri e surface con:

     $ recode charset1/surface1..charset2/surface2 \
       <input.txt >output.txt

I set caratteri comunemente usati sono (vedere anche Introduzione ai locale, Sezione 9.7.3) [37] :

Surface comuni sono [38] :

Per maggiori notizie, leggere la descrizione pertinente in info recode.

Esistono anche degli strumenti di conversione più specializzati:


8.6.13 Sostituzione delle espressioni regolari

Sostituisce tutte le istanze FROM_REGEX con TO_TEXT in tutti i file FILES ...:

     $ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' FILES ...

-i sta per "in-place editing", -p è per "implicit loop over FILES ...". se la sostituzione è complessa, potete recuperare più facilmente gli errori usando il parametro -i.bak al posto di -i; così si mantiene ogni file originale, aggiungendo .bak come estensione.


8.6.14 Modificare un file "in situ" tramite uno script

Lo script seguente rimuove le righe 5–10 e le righe 16–20 "in situ".

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

Qui i comandi di ed sono gli stessi del modo comando di vi. La modifica dei file in questo modo rende facile la creazione di script.


8.6.15 Estrarre le differenze e fondere gli aggiornamenti da un file sorgente

Seguendo una delle seguenti procedure, si estrarranno le differenze dal file sorgente creando dei file diff unificati file.patch0 o file.patch1 a seconda della localizzazione del file:

     $ diff -u file.vecchio file.nuovo1 > file.patch0
     $ diff -u vecchio/file nuovo1/file > file.patch1

Il file diff (chiamato anche file patch) è usato per inviare gli aggiornamenti di un programma. Chi lo riceve applicherà questo aggiornamento ad un altro file con:

     $ patch -p0 file < file.patch0
     $ patch -p1 file < file.patch1

Se avete tre versioni dello stesso codice sorgente, potete farle confluire più efficacemente tutte insieme usando diff3:

     $ diff3 -m file.mio file.old file.tuo > file

8.6.16 Convertire grossi file in file più piccoli

     $ split -b 650m file   # divide il file in pezzetti di 650 MB
     $ cat x* >largefile    # riunisce i file in un unico file

8.6.17 Estrarre dati da un file tabella

Consideramo un file di testo chiamato DPL in cui tutti i nomi dei project leader Debian precedenti e la data di inizio della carica siano elencati in un formato con separazioni date da spazi.

     Ian     Murdock   August  1993
     Bruce   Perens    April   1996
     Ian     Jackson   January 1998
     Wichert Akkerman  January 1999
     Ben     Collins   April   2001
     Bdale   Garbee    April   2002
     Martin  Michlmayr March   2003

Awk viene usato frequentemente per estrarre i dati da questo tipo di file.

     $ awk '{ print $3 }' <DPL                   # mese di inzio
     August
     April
     January
     January
     April
     April
     March
     $ awk '($1=="Ian") { print }' <DPL          # DPL di nome Ian
     Ian     Murdock   August  1993
     Ian     Jackson   January 1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # Quando Perens ha iniziato
     April 1996

Anche le shell come la Bash possono essere usate per questi file:

     $ while read first last month year; do 
         echo $month
       done <DPL
     ... lo stesso output del primo esempio con Awk

Qui ilcomando interno read usa i caratteri in $IFS (internal field separators) per dividere le righe in parole.

Se cambiate IFS in ":", potete processare elegantemente /etc/passwd con la shell:

     $ oldIFS="$IFS"   # salva i vecchi valori
     $ IFS=":"
     $ while read user password uid gid rest_of_line; do
         if [ "$user" = "osamu" ]; then 
           echo "$user's ID is $uid"
         fi
       done < /etc/passwd
     osamu's ID is 1001
     $ IFS="$oldIFS"   # ripristina i vecchi valori

(Se si usa Awk per la stessa cosa, usate FS=":" per impostare il separatore di campo)

IFS viene anche usato dalla shell per dividere i risultati della espansione dei parametri, sostituzione dei comandi ed espansione aritmetica. Questi non sono possibili all'interno di parole tra virgolette, semplici o doppie. il valore predefinito di IFS è <space>, <tab>, e <newline> combinati.

Fate attenzione nell'uso di questi trucchi con IFS. Possono accadere strane cose quando la shell inetrpreta alcune parti degli script come proprio input.

     $ IFS=":,"                        # usa ":" e "," come IFS
     $ echo IFS=$IFS,   IFS="$IFS"     # echo è un Bash built-in
     IFS=  , IFS=:,
     $ date -R                         # solo l'output di un comando
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # sub shell --> input alla shell principale
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # riporta IFS al predefinito
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.18 Parti di script per il piping

Gli script seguenti fanno cose utili come parti di una pipe.

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # trova tutti i file /usr escludendone alcuni
     xargs -n 1 command   # lancia i comandi per tutti gli oggetti da stdin
     xargs -n 1 echo |     # divide oggetti separati da spazi in righe
     xargs echo      |    # unisce tutte le linee in un'unica riga
     grep -e pattern|     # estrae le righe contenenti pattern
     cut -d: -f3 -|       
             # estrae il terzo campo separato da : (file passwd, ecc.)
     awk '{ print $3 }' | # estrae il terzo campo separato da spazi bianchi
     awk -F'\t' '{ print $3 }' |
            # estrae il terzo campo separato da tabulazione
     col -bx |            # rimuove il backspace ed espande le tabs in spazi
     expand -|            # espande le tabs
     sort -u|             # trova e rimuove i doppioni
     
     tr '\n' ' '|         # concatena le righe in una riga unica
     tr '\r' ''|          # rimuove il CR (carriage return, a capo)
     tr 'A-Z' 'a-z'|      # converte il maiuscolo in minuscolo
     sed 's/^/# /'|       # commenta ogni riga
     sed 's/\.ext//g'|    # rimuove .ext
     sed  -n -e 2p|       # stampa la seconda riga 
     head -n 2 -|         # stampa le prime due righe
     tail -n 2 -|         # stampa le ultime due righe

8.6.19 Pezzi di script ricorsivi

Il metodo seguente di agire ricorsivamente su ciascun file cercando corrispondenze *.ext assicura la gestione corretta dei nomi bizzarri dei file, tipo quelli con gli spazi, ed esegue il processo equivalente:


8.6.20 Brevi follie in Perl script

Sebbene tutti gli script Awk possano essere riscritti con Perl usando a2p(1), gli ad una riga di Awk sono convertiti meglio a script in perl ad una riga manualmente. Per esempio

     awk '($2=="1957") { print $3 }' |

può essere scritto in uno dei seguenti modi:

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

Siccome tutti gli spazi tra gli argomenti di perl nelle righe sopra possono essere rimossi traendo vantaggio dalla conversione automatica tra numeri e stringhe in Perl:

     perl -lane 'print$F[2]if$F[1]eq+1957' |

Vedere perlrun(1) per le opzioni da riga di comando. Per altri pazzi script in Perl, http://perlgolf.sourceforge.net può essere interessante.


8.6.21 Catturare il testo od un archivio delle ML da una pagina web

Il seguente comando legge la pagina web e la copia in un file di testo. Molto utile quando si copiano delle configurazioni dalla rete.

     $ lynx -dump http://www.remote-site.com/help-info.html >textfile

Anche links e w3m possono essere usati, con piccole differenze nel rendering.

Se si tratta di un archivio di una lista di messaggi, usate munpack per ottenere i contenuti mime dal testo.


8.6.22 Stampare bene una pagina Web

Quanto segue stampa una pagina Web in un file o stampante PostScript.

     $ apt-get install html2ps
     $ html2ps URL | lpr

Vedere lpr/lpd, Sezione 3.6.1. Controllate anche i pacchetti a2ps e mpage per la creazione di file PostScript.


8.6.23 Stampare bene una pagina di manuale

Quanto segue stampa una pagina di manuale in un file o stampante PostScript.

     $ man -Tps some-man-page | lpr
     $ man -Tps some-man-page | mpage -2 | lpr

8.6.24 Unire due file Postscript o PDF

Si possono unire due file Postscript o PDF.

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.25 Cronometrare un comando

Mostra il tempo utilizzato da un processo.

     # time qualsiasi-comando >/dev/null
     real    0m0.035s       # tempo sull'orologio a muro (tempo realmente passato)
     user    0m0.000s       # tempo in modalità utente
     sys     0m0.020s       # tempo in modalità kernel

8.6.26 Il comando nice

Usate nice (dal pacchetto GNU shellutils) per impostare il valore nice di un comando quando viene lanciato. renice (bsdutils) o top possono dare il renice ad un processo. Un valore di nice di 19 rappresenta il processo più lento (priorità bassa); valori negativi sono "not-nice", con -20 che rappresenta un processo molto veloce (alta priorità). Solo il superuser può impostare valori di nice negativi.

     # nice  -19 top                                         # molto nice
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # molto veloce

Talvolta un valore estremo di nice fa più danni che bene al sistema. Usate questo comando con cautela.


8.6.27 Programmare gli eventi (cron, at)

Usate cron e at per programmare i task in Linux. Vedere at(1), crontab(5), crontab(8).

Eseguite il comando crontab -e per creare o modificare un file crontab per impostare degli eventi regolarmente programmati. Ecco un esempio di file crontab:

     # usa /bin/sh per eseguire i comandi, non importa cosa dice /etc/passwd
     SHELL=/bin/sh
     # invia ogni output a `paul', non importa a chi appartiene crontab
     MAILTO=paul
     # Min Hour DayOfMonth Month DayOfWeek comando 
     # esecuzione alle 00:05, ogni giorno
     5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # esecuzione alle 14:15 il primo giorno del mese -- output inviato a paul
     15 14 1  * *   $HOME/bin/monthly
     # esecuzione alle 22:00 i giorni feriali (Lun-Ven) (1-5), annoia Joe. % per una nuova riga, l'ultimo % per cc:
     0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
     23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
     5  4 *   * sun echo "run at 04:05 every sunday"
     # esecuzione alle 03:40 il primo lunedi di ogni mese
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

Usate il comando at per programmare gli eventi che accadono una sola volta:

     $ echo 'command -args'| at 3:40 monday

8.6.28 Scambio di console con screen

Il programma screen vi permette di far girare terminali virtuali multipli ciascuno con la propria shell interattiva, su un singolo terminale fisico, o su una finestra di emulazione di terminale. Anche se usate le console virtuali di Linux o finestre xterm multiple, vale comunque la pena di esplorare screen per la sua ricchezza di opzioni, che includono


8.6.28.1 Scenario: accesso remoto

Se accedete frequentemente ad una macchina Linux da terminale remoto o tramite un programma di terminale VT100,, screen renderà la vostra vita molto più semplice con la funzione detach.

  • Supponiamo che siate connessi mediante una connessione dialup e che state conducendo una sessione di screen con editors e altri programmi aperti su molte finestre.

  • Improvvisamente dovete abbandonare il terminale, ma non volete perdere tutto il lavoro alla deconnessione.

  • Basta digitare ^A d per staccare la sessione, poi deconnettersi. (Oppure, più veloce ancora, digitate ^A DD per dire a screen di staccare la sessione e deconnettersi da solo.)

  • Quando vi riconnettete di nuovo, date il comando screen -r, e screen magicamente riattaccherà tutte le finestre che avevate aperto.


  • 8.6.28.2 Comandi tipici di screen

    Una volta lanciato screen, tutto l'input della tastiera viene indirizzato alla finestra corrente, tranne il tasto di comando, di default ^A. Tutti i comandi per screen vengono dati premendo ^A più un tasto singolo [più alcuni parametri]. Comandi utili:

         ^A ?     mostra una schermata di aiuto (mostra i comandi da tastiera)
         ^A c     crea una nuova finestra e passa ad essa
         ^A n     va alla finestra successiva
         ^A p     va alla finestra precedente
         ^A 0     va alla finestra numero 0
         ^A w     mostra una lsta di finestre
         ^A a     manda un Ctrl-A alla finestra corrente come input da tastiera
         ^A h     scrive una copia della finestra corrente su file 
         ^A H     inizia/termina la registrazione della finestra corrente su file
         ^A ^X    blocca il terminale (protetto da password)
         ^A d     stacca la sessione dal terminale
         ^A DD    stacca la sessione ed esce
    

    Questo è solo un piccolo assaggio dei comandi e caratteristiche di screen. Se c'è qualcosa che volete che screen faccia, è probabile che lo sappia fare! Vedere screen(1) per i dettagli.


    8.6.28.3 Backspace e/o Ctrl-H durante una sessione di screen

    Se notate che il backspace e/o Ctrl-H non funzionano appropriatamente mentre state facendo girare screen, aprite /etc/screenrc, trovate la riga

         bindkey -k kb stuff "\177"
    

    e commentatela (cioè, aggiungete "#" come primo carattere).


    8.6.28.4 Programma equivalente a screen per X

    Vedetevi xmove. Vedere xmove(1).


    8.6.29 Testare la rete: le basi

    Installate i pacchetti netkit-ping, traceroute, dnsutils, ipchains (per Kernel 2.2), iptables (per Kernel 2.4), e net-tools e:

         $ ping yahoo.com            # prova la connessione internet
         $ traceroute yahoo.com      # traccia i pacchetti IP
         $ ifconfig                  # prova la configurazione dell'host
         $ route -n                  # prova la configurazione di routing
         $ dig [@dns-server.com] host.dom [{a|mx|any}] |less
               # controlla i record DNS di host.dom tramite dns-server.com 
               # per {mx|any} record
         $ ipchains  -L -n |less     # controlla il packet filter (kernel 2.2)
         $ iptables -L -n |less      # controlla il packet filter (kernel 2.4)
         $ netstat -a                # scopre tutte le porte aperte
         $ netstat -l --inet         # trova le porte in ascolto
         $ netstat -ln --tcp         # trova le porte tcp in ascolto (numerico)
    

    8.6.30 Eliminare la posta dallo spool locale

    Per eliminare la posta:

         # exim -q    # elimina la posta in attesa
         # exim -qf   # elimina tutta la posta
         # exim -qff  # elimina persino la posta "congelata"
    

    -qff può essere migliore come opzione per lo script /etc/ppp/ip-up.d/exim. Per Sarge, sostituite exim con exim4.


    8.6.31 Rimuovere la posta congelata dallo spool locale

    Per rimuovere la posta bloccata dallo spool locale assieme al messaggio di errore nell'invio:

         # exim -Mg `mailq | grep frozen | awk '{ print $3 }'`
    

    Per Sarge, sostituite exim con exim4.


    8.6.32 Riinviare il contenuto delle caselle di posta

    Se la vostra directory home è piena e procmail non è riuscito ad inviare la posta, dovete inviarla a mano alle varie caselle di posta della directory home, da /var/mail/username. Dopo aver fatto spazio nella vostra directory home, lanciate:

         # /etc/init.d/exim stop
         # formail -s procmail </var/mail/username
         # /etc/init.d/exim start
    

    Per Sarge, sostituite exim con exim4.


    8.6.33 Ripulire il contenuto di un file

    Per ripulire un file dal suo contenuto, come ad esempio un file di log, non usate rm per cancellarlo, e poi crearne un nuovo vuoto, poichè ci potrebbero essere ancora degli accessi al file nell'intervallo fra i comandi. Quanto segue è il modo sicura di ripulire un file dal suo contenuto.

         $ :>file-da-essere-ripulito
    

    8.6.34 File fantoccio

    I comandi seguenti creano dei file fantoccio o vuoti:

         $ dd if=/dev/zero    of=nomefile bs=1k count=5 # 5KB di zeri 
         $ dd if=/dev/urandom of=nomefile bs=1M count=7 # 7MB di contenuto casuale 
         $ touch nomefile # crea un file di 0B (se il file esiste, aggiorna mtime)
    

    Per esempio, i seguenti comandi eseguiti dalla shell del boot floppy Debian cancelleranno tutto il contenuto del disco rigido /dev/hda.

         # dd if=/dev/urandom of=/dev/hda ; dd if=/dev/zero of=/dev/hda
    

    8.6.35 chroot

    Il programma chroot, chroot(8), ci permette di far girare istanze diverse dell'ambiente GNU/Linux su un sistema singolo e simultaneamente senza dover fare il reboot.

    Si può far girare un programma che utilizza molta memoria come apt-get o dselect su una macchina host mentre si monta via NFS una macchina satellite sull'host in lettura/scrittura e con il chroot point che agisce come punto di montaggio della macchina satellite.


    8.6.35.1 Far girare versioni diverse di Debian con chroot

    Si può creare facilmente un ambiente chroot Debian tramite il comando debootstrap in Woody. Per esempio, per creare Sid sotto chroot in /sid-root mentre si ha a disposizione un accesso veloce ad Internet:

         main # cd / ; mkdir /sid-root
         main # debootstrap sid /sid-root http://ftp.debian.org/debian/
         ... guardatelo mentre si scarica l'intero sistema
         main # echo "proc-sid /sid-root/proc proc none 0 0" >> /etc/fstab
         main # mount proc-sid /sid-root/proc -t proc
         main # cp /etc/hosts /sid-root/etc/hosts
         main # chroot /sid-root /bin/bash
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-setup # set-up /etc/apt/sources.list
         chroot # vi /etc/apt/sources.list # punta su unstable
         chroot # dselect  # potete usare aptitude, installate mc e vim :-)
    

    A questo punto dovreste avere un sistema Debian completo e funzionante, dove giocare senza paura di danneggiare la vostra installazione Debian principale.

    Il trucco di debootstrap può anche essere usato per installare la Debian su un sistema senza usare il disco di installazione Debian ma uno di una qualsiasi altra distribuzione GNU/Linux. Vedere http://www.debian.org/releases/stable/i386/apcs04.


    8.6.35.2 Impostare il login per chroot

    Digitare chroot /sid-root /bin/bash è semplice, ma tiene in giro ogni sorta di variabile d'ambiente che magari non vorreste, inoltre ha altri problemi. Un approccio sicuramente migliore è di lanciare un altro processo di login su un terminale virtuale separato, da dove fare direttamente il login in chroot.

    Dato che su un sistema Debian standard da tty1 a tty6 girano le consoles Linux e su tty7 ci gira il X Window System, impostiamo per esempio tty8 per una console "chrooted". Dopo aver creato il sistema chroot come descritto in Far girare versioni diverse di Debian con chroot, Sezione 8.6.35.1, digitate dalla shell di root del sistema principale:

         main # echo "8:23:respawn:/usr/sbin/chroot /sid-root "\
                "/sbin/getty 38400 tty8"  >> /etc/inittab
         main # init q    # ricarica init
    

    8.6.35.3 Impostare X per chroot

    Volete far girare gli ultimissimi X e GNOME con sicurezza nel vostro chroot? Ciò è interamente possibile! Il seguente esempio farà girare GDM sul terminale virtuale vt9.

    Per prima cosa installate un sistema chroot usando il metodo descritto in Far girare versioni diverse di Debian con chroot, Sezione 8.6.35.1. Da root del sistema principale, copiate i file chiave di configurazione nel sistema chroot.

         main # cp /etc/X11/XF86Config-4 /sid-root/etc/X11/XF86Config-4
         main # chroot /sid-root # od usate la console di chroot
         chroot # cd /dev; /sbin/MAKEDEV generic ; cd -
         chroot # apt-get install gdm gnome x-window-system
         chroot # vi /etc/gdm/gdm.conf # date s/vt7/vt9/ nella sezione [servers]
         chroot # /etc/init.d/gdm start
    

    Qui /etc/gdm/gdm.conf è stato modificato per lanciare la console virtuale da vt7 a vt9.

    A questo punto potete andare facilmente avanti e indietro tra gli ambienti X completi del vostro sistema chroot e principale semplicemente saltando fra i terminali virtuali; p.es. usando Ctrl-Alt-F7 e Ctrl-Alt-F9. Buon divertimento!

    [FIXME] Add a comment and link to the init script of the chrooted gdm.


    8.6.35.4 Far girare altre distribuzioni con chroot

    Si può creare facilmente un ambiente chroot con un'altra distribuzione. Installate un sistema in una o più partizioni separate mediante l'installer dell'altra distribuzione. Se la sua partizione di root è in /dev/hda9.

         main # cd / ; mkdir /altra-dist
         main # mount -t ext3 /dev/hda9 /altra-dist
         main # chroot /altra-dist /bin/bash
    

    Il resto è simile a Far girare versioni diverse di Debian con chroot, Sezione 8.6.35.1, Impostare il login per chroot, Sezione 8.6.35.2, e Impostare X per chroot, Sezione 8.6.35.3.


    8.6.35.5 Compilare i pacchetti con chroot

    Esiste un pacchetto chroot più specializzato, pbuilder, che costruisce un sistema chroot e compila un pacchetto al suo interno. E' un sistema ideale per controllare se le dipendenze di compilazione di un pacchetto sono corrette e per essere certi che dipendenze non necessarie o sbagliate non esistano nel pacchetto risultante.


    8.6.36 Come controllare i collegamenti

    potete controllare se due file sono lo stesso file con due collegamenti tramite:

         $ ls -li file1 file2
    

    8.6.37 mount il file immagine del disco rigido

    Se file.img contiene l'immagine del contenuto di un disco rigido ed il disco originale aveva una configurazione che dà xxxx = (bytes/settore) * (settori/cilindro), allora quanto segue lo monterà in /mnt:

         # mount -o loop,offset=xxxx file.img /mnt
    

    Notate cha molti dischi rigidi hanno 512 bytes/settore.


    8.6.38 Samba

    Le basi per ottenere un file da Windows:

         # mount -t smbfs -o username=mionome,uid=mio_uid,gid=mio_gid \
                 //server/share /mnt/smb  # monta i file Windows su Linux
         # smbmount //server/share /mnt/smb \
                 -o "username=mionome,uid=mio_uid,gid=mio_gid"
         # smbclient -L 192.168.1.2 # elenca le condivisioni su un computer
    

    I PC collegati tramite Samba possono essere controllati sotto Linux tramite:

         # smbclient -N -L ip_address_del_vostro_PC | less
         # nmblookup -T "*"
    

    8.6.39 Utilità per filesystem estranei

    Molti filesystem estranei hanno il supporto per il kernel Linux, per cui possono essere raggiunti semplicemente montando i dispositivi che li contengono. Per alcuni filesystem, esistono anche degli strumenti specializzati per accedervi senza montarne i dispositivi. Ciò si ottiene con programmi che girano nello user space, per cui il supporto specifico nel kernel per i filesystem non è necessario.

    Per creare e controllare filesystem MS-DOS FAT, dosfstools è utile.


    8.7 Errori tipici da notare

    Ecco alcuni esempi di azioni pericolose. Il loro impatto negativo negativo verrà potenziato se state usando un account privilegiato: root.


    8.7.1 rm -rf .*

    In "rm -rf .*", ".*" si espande ad includere "." e "..", e se vi capita di avere i privilegi in scrittura sulla directory superiore, finirete col rimuovere anche tutte le directory vicine alla directory corrente.


    8.7.2 rm /etc/passwd

    Perdere dei file importanti come /etc/passwd a causa della propria stupidità è pesante. Il sistema Debian ne effettua dei backup regolari in /var/backups/. Quando recuperate questi file, potreste impostare manualmente i giusti permessi.

         # cp /var/backups/passwd /etc/passwd
         # chmod 644 /etc/passwd
    

    Vedere anche Recuperare i dati sulla selezione dei pacchetti, Sezione 6.3.4.


    [ precedente ] [ Contenuti ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ successivo ]


    La guida Debian

    CVS, gio gen 18 11:52:32 UTC 2007

    Osamu Aoki osamu#at#debian.org
    Traduzione italiana: Davide Di Lazzaro mc0315#at#mclink.it
    Autori, Sezione A.1