Per informazioni dettagliate sul prompt del boot, vedere il BootPrompt-HOWTO
dal LDP.
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).
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.
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.
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:
/etc/init.d/?dm
.
/etc/rc2.d/S99?dm
/etc/rc2.d/K99?dm
.
/etc/rc2.d/S99?dm
.
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.
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.
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
e
/usr/share/doc/grub-doc/html/
per i dettagli.
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
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
).
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.
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
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).
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
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
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
.
I backup differenziali e la sincronizzazione dei dati possono essere implementati con vari metodi:
rcs
: backup con storico, solo testo
rdiff-backup
: backup con storico. I collegamenti simbolici sono
OK.
pdumpfs
: backup con storico all'interno di un filesystem.
Collegamenti simbolici OK.
rsync
: sincronizzazione ad 1 via
unison
: sincronizzazione a 2 vie
cvs
: sincronizzazione multivia con server backup e storico, solo
testo, maturo. Vedere Concurrent Version System
(CVS), Sezione 12.1.
arch
: sincronizzazione multivia con server backup e storico, non
esiste qualcosa come una "working directory".
subversion
: sincronizzazione multivia con server backup e storico,
Apache.
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.
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)
.
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)
.
Changetrack
registra regolarmente i cambiamenti ai file di testo
di configurazione negli archivi RCS. Vedere changetrack(1)
.
# apt-get install changetrack # vi changetrack.conf
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"
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
.
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).
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.
# 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
.
Riferimento: Managing
Accurate Date and Time HOWTO
.
Impostazione automatica dell'ora esatta tramite un server remoto:
# ntpdate server
Se avete una connessione permanente, è bene averlo in
/etc/cron.daily
.
Usate il pacchetto chrony
.
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.
Glibc offre getent(1)
per la ricerca di voci inserite nei database
amministrativi, cioè, passwd, group, hosts, services, protocols, o networks.
getent database [chiave...]
Potete sempre staccare gli altoparlanti del PC ;-) Per la shell Bash:
echo "set bell-style none">> ~/.inputrc
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.
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.
Quando lo schermo impazzisce dopo $ cat qualsiasi-file-binario (potreste non essere in grado di vedere il comando dato mentre lo state digitando):
$ reset
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
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:
iconv
— locale encoding conversions
konwert
— fancy encoding conversions
uuencode
e uudecode
— per Unix.
mimencode
— per la posta.
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.
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.
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
$ split -b 650m file # divide il file in pezzetti di 650 MB $ cat x* >largefile # riunisce i file in un unico file
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
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
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:
for x in *.ext; do if test -f "$x"; then command "$x" fi done
find
e xargs
:
find . -type f -maxdepth 1 -name '*.ext' -print0 | \ xargs -0 -n 1 command
find
con l'opzione -exec:
find . -type f -maxdepth 1 -name '*.ext' \ -exec command '{}' \;
find
e l'opzione -exec:
find . -type f -maxdepth 1 -name '*.ext' \ -exec sh -c "command '{}' && echo 'successful'" \;
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.
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.
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.
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
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
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
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.
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
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
screen
dal vostro terminale e di riattacarla in seguito.
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.
screen
con editors e altri programmi
aperti su molte finestre.
screen
di staccare la sessione e deconnettersi da solo.)
screen
magicamente riattaccherà tutte le finestre
che avevate aperto.
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.
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).
screen
per X
Vedetevi xmove
. Vedere xmove(1)
.
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)
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
.
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
.
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
.
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
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
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.
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 # 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/ch-preparing#s-linux-upgrade
.
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
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 # 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.
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.
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.
potete controllare se due file sono lo stesso file con due collegamenti tramite:
$ ls -li file1 file2
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.
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 "*"
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.
mtools
: per filesystem MSDOS filesystem (MS-DOS, Windows)
cpmtools
: per CP/M
hfsutils
: per HFS (Macintosh nativo)
hfsplus
: per HFS+ (moderno Macintosh)
Per creare e controllare filesystem MS-DOS FAT, dosfstools
è
utile.
Ecco alcuni esempi di azioni pericolose. Il loro impatto negativo negativo verrà potenziato se state usando un account privilegiato: root.
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.
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.
La guida Debian
1.08-3, dom mag 1 07:45:18 UTC 2005osamu@debian.org
dsewell@virginia.edu
mc0315@mclink.it