103.2 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
103 Comandi GNU e Unix |
Obiettivo: |
103.2 Elaborare flussi di testo utilizzando i filtri |
Lezione: |
1 di 1 |
Introduzione
Trattare il testo è una parte importante del lavoro di ogni amministratore di sistema. Doug McIlroy, un membro del team di sviluppo originale di Unix, ha sintetizzato la filosofia Unix e ha detto (tra le altre cose importanti): "[è necessario] Scrivere programmi per gestire i flussi di testo, perché questa è un’interfaccia universale". Linux si ispira al funzionamento del sistema Unix e adotta fortemente la sua filosofia, quindi un amministratore deve aspettarsi molti strumenti di manipolazione del testo all’interno di una distribuzione Linux.
Una Rapida Rassegna su Reindirizzamenti e Pipe
- Ulteriori riferimenti alla filosofia Unix
-
-
Scrivi programmi che facciano una cosa e la facciano bene.
-
Scrivi programmi che lavorino insieme.
-
Un modo importante per far lavorare i programmi insieme è attraverso il piping e i reindirizzamenti (redirections). Praticamente tutti i programmi di manipolazione del testo partono da un input standard (stdin), lo inviano a un output standard (stdout) e inviano eventuali errori a un output degli errori standard (stderr). Se non diversamente specificato, l’input standard è quello che viene digitato sulla tastiera (il programma lo legge dopo aver premuto il tasto Invio). Allo stesso modo, l’output standard e gli errori vengono visualizzati nella schermata del terminale. Vediamo come funziona il tutto.
Nel tuo terminale, digita cat
e quindi premi il tasto Invio. Quindi digitare del testo casuale.
$ cat This is a test This is a test Hey! Hey! It is repeating everything I type! It is repeating everything I type! (I will hit ctrl+c so I will stop this nonsense) (I will hit ctrl+c so I will stop this nonsense) ^C
Per maggiori informazioni sul comando cat
(il termine deriva da “concatenare”) fare riferimento alle pagine di man.
Note
|
Se stai lavorando su un’installazione davvero semplice di un server Linux, alcuni comandi come |
Come dimostrato sopra, se non specifichi da dove cat
deve leggere, questo lo farà dall’input standard (qualunque cosa tu digiti) e produrrà tutto ciò che legge sulla tua finestra del terminale (il suo output standard).
Ora prova quanto segue:
$ cat > mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this ^C $ cat mytextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Il carattere >
(Maggiore di) dice a cat
di indirizzare il suo output sul file mytextfile
, non sullo standard output. Ora prova questo:
$ cat mytextfile > mynewtextfile $ cat mynewtextfile This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Questo ha l’effetto di copiare mytextfile
in mynewtextfile
. Puoi effettivamente verificare che questi due file abbiano lo stesso contenuto eseguendo il comando diff
:
$ diff mynewtextfile mytextfile
Poiché non esiste alcun output, i file sono uguali. Ora prova un reindirizzamento accodato (append redirection) (>>
):
$ echo 'This is my new line' >> mynewtextfile $ diff mynewtextfile mytextfile 4d3 < This is my new line
Finora abbiamo usato i reindirizzamenti per creare e manipolare i file. Possiamo anche usare le pipe (rappresentate dal simbolo |
) per reindirizzare l’output di un programma ad un altro programma. Cerchiamo di trovare le righe in cui si trova la parola “this”:
$ cat mytextfile | grep this I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this $ cat mytextfile | grep -i this This is a test I hope cat is storing this to mytextfile as I redirected the output I will hit ctrl+c now and check this
Ora abbiamo reindirizzato l’output di cat
a un altro comando: grep
. Nota che quando ignoriamo maiuscole e minuscole (usando l’opzione -i
) otteniamo di conseguenza una riga in più.
Elaborare Flussi di Testo
Lettura di un File Compresso
Creeremo un file chiamato ftu.txt
contenente un elenco dei seguenti comandi:
bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Ora useremo il comando grep
per stampare tutte le linee contenenti la stringa cat
:
$ cat ftu.txt | grep cat bzcat cat xzcat zcat
Un altro modo per ottenere queste informazioni è semplicemente usare il comando grep
per filtrare direttamente il testo, senza la necessità di usare un’altra applicazione per inviare il flusso di testo all'stdout.
$ grep cat ftu.txt bzcat cat xzcat zcat
Note
|
Ricorda che ci sono molti modi per eseguire la stessa attività usando Linux. |
Ci sono altri comandi che gestiscono i file compressi (bzcat
per i file compressi bzip
, xzcat
per i file compressi xz
e zcat
per i file compressi gzip
) e ognuno viene usato per visualizzare il contenuto di un file compresso basato sull’algoritmo di compressione utilizzato.
Verifica che il file appena creato ftu.txt
sia l’unico nella directory, quindi crea una versione compressa del file gzip
:
$ ls ftu* ftu.txt $ gzip ftu.txt $ ls ftu* ftu.txt.gz
Quindi, usa il comando zcat
per visualizzare il contenuto del file compresso con gzip:
$ zcat ftu.txt.gz bzcat cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzcat zcat
Nota che gzip
comprime ftu.txt
in ftu.txt.gz
e rimuoverà il file originale. Di default, non verrà visualizzato alcun output dal comando gzip
. Comunque, se vuoi che gzip
ti dica cosa sta facendo, usa l’opzione -v
per l’output “verboso”.
Visualizzare un File in un Paginatore
Sai che cat
concatena un file nell’output standard (una volta che viene fornito un file dopo il comando). Il file /var/log/syslog
è dove il tuo sistema Linux memorizza tutto quello che sta accadendo nel sistema. Usare il comando sudo
per elevare i privilegi in modo da poter leggere il file /var/log/syslog
:
$ sudo cat /var/log/syslog
-
vedrai i messaggi scorrere molto velocemente nella finestra del tuo terminale. È possibile reindirizzare l’output al programma
less
in modo che i risultati vengano impaginati. Usandoless
puoi usare i tasti freccia per navigare nell’output e anche usare i comandi come utilizzassivi
per navigare e cercare in tutto il testo.
Tuttavia, invece di reindirizzare il comando cat
in un programma di impaginazione, è più pragmatico usare direttamente il programma di impaginazione:
$ sudo less /var/log/syslog ... (output omitted for clarity)
Ottenere una Parte di un File di Testo
Se è necessario rivedere solo l’inizio o la fine di un file, sono disponibili altri metodi. Il comando head
è usato per leggere di default le prime dieci righe di un file, e il comando tail
è usato per leggere di default. le ultime dieci righe di un file. Ora prova:
$ sudo head /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) $ sudo tail /var/log/syslog Nov 13 10:24:45 hypatia kernel: [ 8001.679238] mce: CPU7: Core temperature/speed normal Nov 13 10:24:46 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:24:46 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:24:47 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:24:47 hypatia systemd[2004]: Started Tracker metadata extractor. Nov 13 10:24:54 hypatia kernel: [ 8010.462227] mce: CPU0: Core temperature above threshold, cpu clock throttled (total events = 502907) Nov 13 10:24:54 hypatia kernel: [ 8010.462228] mce: CPU4: Core temperature above threshold, cpu clock throttled (total events = 502911) Nov 13 10:24:54 hypatia kernel: [ 8010.469221] mce: CPU0: Core temperature/speed normal Nov 13 10:24:54 hypatia kernel: [ 8010.469222] mce: CPU4: Core temperature/speed normal Nov 13 10:25:03 hypatia systemd[2004]: tracker-extract.service: Succeeded.
Per indicate il numero di righe visualizzate, possiamo reindirizzare l’output del comando head
al comando nl
, che mostrerà il numero di righe di testo trasmesse al comando:
$ sudo head /var/log/syslog | nl 1 Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed 2 Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. 3 Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. 4 Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) 5 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' 6 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' 7 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' 8 Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' 9 Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! 10 Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high)
Possiamo fare lo stesso eseguendo il piping dell’output del comando tail
al comando wc
, che di default conta il numero di parole all’interno di un documento, e usando l’opzione -l
per stampare il numero di righe di testo che il comando ha letto:
$ sudo tail /var/log/syslog | wc -l 10
Se un amministratore deve visualizzare più (o meno) parti dall’inizio o dalla fine di un file, l’opzione -n
può essere usata per definire l’output dei comandi:
$ sudo tail -n 5 /var/log/syslog Nov 13 10:37:24 hypatia systemd[2004]: tracker-extract.service: Succeeded. Nov 13 10:37:42 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Activating via systemd: service name='org.freedesktop.Tracker1.Miner.Extract' unit='tracker-extract.service' requested by ':1.73' (uid=1000 pid=2425 comm="/usr/lib/tracker/tracker-miner-fs ") Nov 13 10:37:42 hypatia systemd[2004]: Starting Tracker metadata extractor... Nov 13 10:37:43 hypatia dbus-daemon[2023]: [session uid=1000 pid=2023] Successfully activated service 'org.freedesktop.Tracker1.Miner.Extract' Nov 13 10:37:43 hypatia systemd[2004]: Started Tracker metadata extractor. $ sudo head -n 12 /var/log/syslog Nov 12 08:04:30 hypatia rsyslogd: [origin software="rsyslogd" swVersion="8.1910.0" x-pid="811" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 12 08:04:30 hypatia systemd[1]: logrotate.service: Succeeded. Nov 12 08:04:30 hypatia systemd[1]: Started Rotate log files. Nov 12 08:04:30 hypatia vdr: [928] video directory scanner thread started (pid=882, tid=928, prio=low) Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'A - ATSC' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'C - DVB-C' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'S - DVB-S' Nov 12 08:04:30 hypatia vdr: [882] registered source parameters for 'T - DVB-T' Nov 12 08:04:30 hypatia vdr[882]: vdr: no primary device found - using first device! Nov 12 08:04:30 hypatia vdr: [929] epg data reader thread started (pid=882, tid=929, prio=high) Nov 12 08:04:30 hypatia vdr: [882] no DVB device found Nov 12 08:04:30 hypatia vdr: [882] initializing plugin: vnsiserver (1.8.0): VDR-Network-Streaming-Interface (VNSI) Server
Le Basi di sed, l’Editor di Flussi di Testo
Diamo un’occhiata agli altri file, termini e utilità che non hanno "cat" nei loro nomi. Possiamo farlo passando l’opzione -v
a grep
, che indicherà al comando di produrre solo le righe che non contengono cat
:
$ zcat ftu.txt.gz | grep -v cat cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Gran parte di ciò che possiamo fare con grep
possiamo anche farla con sed
- l’editor di flussi per filtrare e trasformare il testo (come indicato nella pagina di manuale di sed
). Per prima cosa ripristineremo il nostro file ftu.txt
decomprimendo il nostro archivio gzip
:
$ gunzip ftu.txt.gz $ ls ftu* ftu.txt
Ora, possiamo usare sed
per elencare solo le righe che contengono la stringa cat
:
$ sed -n /cat/p < ftu.txt bzcat cat xzcat zcat
Abbiamo usato il segno minore <
per indirizzare il contenuto del file ftu.txt
nel nostro comando sed
. La stringa racchiusa tra slash (ovvero /cat/
) è il termine che stiamo cercando. L’opzione -n
indica a sed
di non produrre output (tranne quello successivamente indicato dal comando p
). Prova a eseguire questo stesso comando senza l’opzione -n
per vedere cosa succede. Quindi prova questo:
$ sed /cat/d < ftu.txt cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc
Se non usiamo l’opzione -n
, sed
visualizzerà il contenuto proveniente dal file ad eccezione di ciò che d
indica a sed
di cancellare dal suo output.
Un uso comune di sed
è trovare e sostituire il testo all’interno di un file. Supponiamo di voler cambiare ogni ricorrenza di cat
in dog
. Puoi usare sed
per fare ciò fornendo l’opzione s
per scambiare ogni occorrenza del primo termine, cat
, per il secondo termine, dog
:
$ sed s/cat/dog/ < ftu.txt bzdog dog cut head less md5sum nl od paste sed sha256sum sha512sum sort split tail tr uniq wc xzdog zdog
Invece di usare un operatore di reindirizzamento (<
) per passare il file ftu.txt
nel nostro comando sed
, possiamo semplicemente far funzionare direttamente il comando sed
sul file. Lo proveremo ora, creando contemporaneamente un backup del file originale:
$ sed -i.backup s/cat/dog/ ftu.txt $ ls ftu* ftu.txt ftu.txt.backup
L’opzione -i
eseguirà un’operazione sed
sul tuo file originale. Se non usi il .backup
dopo il parametro -i
, avresti semplicemente riscritto il tuo file originale. Qualunque cosa tu usi come testo dopo il parametro -i
sarà il nome in cui il file originale verrà salvato prima delle modifiche che hai richiesto a sed
.
Garantire l’Integrità dei Dati
Abbiamo dimostrato quanto sia facile manipolare i file in Linux. Ci sono momenti in cui potresti voler distribuire un file a qualcun altro e vuoi essere sicuro che il destinatario riceva una copia autentica del file originale. Un uso molto comune di questa tecnica viene praticato quando i server di distribuzione Linux ospitano immagini CD o DVD scaricabili del loro software insieme a file che contengono i valori di checksum calcolati di tali immagini disco. Ecco per esempio un elenco da un mirror di download della distribuzione Debian:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [PARENTDIR] Parent Directory - [SUM] MD5SUMS 2019-09-08 17:46 274 [CRT] MD5SUMS.sign 2019-09-08 17:52 833 [SUM] SHA1SUMS 2019-09-08 17:46 306 [CRT] SHA1SUMS.sign 2019-09-08 17:52 833 [SUM] SHA256SUMS 2019-09-08 17:46 402 [CRT] SHA256SUMS.sign 2019-09-08 17:52 833 [SUM] SHA512SUMS 2019-09-08 17:46 658 [CRT] SHA512SUMS.sign 2019-09-08 17:52 833 [ISO] debian-10.1.0-amd64-netinst.iso 2019-09-08 04:37 335M [ISO] debian-10.1.0-amd64-xfce-CD-1.iso 2019-09-08 04:38 641M [ISO] debian-edu-10.1.0-amd64-netinst.iso 2019-09-08 04:38 405M [ISO] debian-mac-10.1.0-amd64-netinst.iso 2019-09-08 04:38 334M ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Nell’elenco sopra, i file di immagine dell’installatore Debian sono accompagnati da file di testo che contengono checksum dei file generati da vari algoritmi (MD5, SHA1, SHA256 e SHA512).
Note
|
Un checksum è un valore derivato da un calcolo matematico, basato su una funzione hash crittografica, rispetto a un file. Esistono diversi tipi di funzioni hash crittografiche che variano di intensità. L’esame prevede che tu abbia familiarità con l’uso di |
Una volta scaricato un file (per esempio, l’immagine debian-10.1.0-amd64-netinst.iso
), confronterai il checksum del file scaricato con un valore di checksum che ti è stato fornito.
Ecco un esempio per illustrare quanto fin qui detto. Calcoleremo il valore SHA256 del file ftu.txt
usando il comando sha256sum
:
$ sha256sum ftu.txt 345452304fc26999a715652543c352e5fc7ee0c1b9deac6f57542ec91daf261c ftu.txt
La lunga stringa di caratteri che precede il nome del file è il valore di checksum SHA256 di questo file di testo. Creiamo un file che contenga quel valore, in modo da poterlo utilizzare per verificare l’integrità del nostro file originale di testo. Possiamo farlo con lo stesso comando sha256sum
e reindirizzare l’output su un file:
$ sha256sum ftu.txt > sha256.txt
Ora, per verificare il file ftu.txt
, utilizziamo semplicemente lo stesso comando e forniamo il nome file che contiene il nostro valore di checksum insieme all’opzione -c
:
$ sha256sum -c sha256.txt ftu.txt: OK
Il valore contenuto nel file corrisponde al checksum SHA256 calcolato per il nostro file ftu.txt
, proprio come ci aspetteremmo. Tuttavia, se il file originale fosse modificato (come alcuni byte persi durante il download di un file, o se qualcuno lo avesse deliberatamente manomesso), il controllo del valore fallirebbe. In tali casi sappiamo che il nostro file è danneggiato o corrotto e non possiamo fidarci dell’integrità del suo contenuto. Per dimostrare il punto, aggiungeremo del testo alla fine del file:
$ echo "new entry" >> ftu.txt
Ora faremo un tentativo di verificare l’integrità del file:
$ sha256sum -c sha256.txt ftu.txt: FAILED sha256sum: WARNING: 1 computed checksum did NOT match
Vediamo che il checksum non corrisponde a quanto previsto per il file. Pertanto, non potevamo fidarci dell’integrità di questo file. Potremmo tentare di scaricare una nuova copia di un file, segnalare l’errore del checksum al mittente del file o segnalarlo a un team di sicurezza del data center in base all’importanza del file.
Guardare più in Profondità nei File
Il comando octal dump (od
) è spesso usato per il debug di applicazioni e vari file. Di per sé, il comando od
elencherà semplicemente i contenuti di un file in formato ottale. Possiamo usare il nostro file ftu.txt
in precedenza per esercitarci con questo comando:
$ od ftu.txt 0000000 075142 060543 005164 060543 005164 072543 005164 062550 0000020 062141 066012 071545 005163 062155 071465 066565 067012 0000040 005154 062157 070012 071541 062564 071412 062145 071412 0000060 060550 032462 071466 066565 071412 060550 030465 071462 0000100 066565 071412 071157 005164 070163 064554 005164 060564 0000120 066151 072012 005162 067165 070551 073412 005143 075170 0000140 060543 005164 061572 072141 000012 0000151
La prima colonna di output è il byte offset per ogni riga di output. Poiché od
stampa le informazioni in formato ottale di default, ogni riga inizia con un byte offset di otto bit, seguito da otto colonne, ognuna contenente il valore ottale dei dati all’interno di quella colonna.
Tip
|
Ricordiamoci che un byte è composto da 8 bit. |
Se dovessi visualizzare il contenuto di un file in formato esadecimale, usa l’opzione -x
:
$ od -x ftu.txt 0000000 7a62 6163 0a74 6163 0a74 7563 0a74 6568 0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a 0000040 0a6c 646f 700a 7361 6574 730a 6465 730a 0000060 6168 3532 7336 6d75 730a 6168 3135 7332 0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174 0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78 0000140 6163 0a74 637a 7461 000a 0000151
Ora ciascuna delle otto colonne dopo il byte offset è rappresentata dal loro equivalente esadecimale.
Un utile uso del comando od
è per il debug degli script. Per esempio, il comando od
può mostrarci caratteri normalmente non presenti in un file, come per esempio quelli di newline. Possiamo farlo con l’opzione -c
, in modo che, invece di visualizzare la notazione numerica per ogni byte, queste voci di colonna verranno mostrate come equivalenti di carattere:
$ od -c ftu.txt 0000000 b z c a t \n c a t \n c u t \n h e 0000020 a d \n l e s s \n m d 5 s u m \n n 0000040 l \n o d \n p a s t e \n s e d \n s 0000060 h a 2 5 6 s u m \n s h a 5 1 2 s 0000100 u m \n s o r t \n s p l i t \n t a 0000120 i l \n t r \n u n i q \n w c \n x z 0000140 c a t \n z c a t \n 0000151
Tutte le voci newline all’interno del file sono rappresentate dai caratteri nascosti \n
. Se si desidera solo visualizzare tutti i caratteri all’interno di un file e non è necessario visualizzare le informazioni di byte offset, questa colonna può essere rimossa dall’output in questo modo:
$ od -An -c ftu.txt b z c a t \n c a t \n c u t \n h e a d \n l e s s \n m d 5 s u m \n n l \n o d \n p a s t e \n s e d \n s h a 2 5 6 s u m \n s h a 5 1 2 s u m \n s o r t \n s p l i t \n t a i l \n t r \n u n i q \n w c \n x z c a t \n z c a t \n
Esercizi Guidati
-
Qualcuno ha appena donato un laptop alla tua scuola e ora desideri installare Linux su di esso. Non esiste un manuale e sei stato costretto ad avviarlo senza interfaccia grafica da una chiavetta USB. Ottieni un terminale shell e sai che, per ogni processore, ci saranno una serie di riferimenti nel file
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (linee saltate) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (altre linee saltate)
-
Usando i comandi
grep
ewc
mostra quanti processori hai. -
Fai la stessa cosa con
sed
invece che congrep
.
-
-
Esplora il tuo file locale
/etc/passwd
con i comandigrep
,sed
,head
etail
per le attività seguenti:-
Quali utenti hanno accesso a una shell Bash?
-
Il tuo sistema ha vari utenti che esistono per gestire programmi specifici o per scopi amministrativi. Non hanno accesso a una shell. Quanti ne esistono nel tuo sistema?
-
Quanti utenti esistono nel tuo sistema (ricorda: usa solo il file
/etc/passwd
)? -
Elenca solo la prima riga, l’ultima riga e la decima riga del tuo file
/etc/passwd
.
-
-
Considera questo esempio di file
/etc/passwd
. Copiare le righe seguenti in un file locale chiamatomypasswd
per questo esercizio.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Elenca tutti gli utenti nel gruppo
1000
(usased
per selezionare solo il campo appropriato) dal tuo filemypasswd
. -
Elenca solo i nomi completi di tutti gli utenti di questo gruppo (usa
sed
ecut
).
-
Esercizi Esplorativi
-
Ancora una volta usando il file
mypasswd
degli esercizi precedenti, creare un comando Bash che selezioni un individuo del Main Office per fargli vincere un concorso a premi. Utilizzare il comandosed
per visualizzare solo le righe realative al main Office, quindi una sequenza di comandicut
per recuperare il nome di ciascun utente da queste righe. Successivamente si procederà a ordinare casualmente questi nomi e a visualizzare solo il nome in testa all’elenco. -
Quante persone lavorano in Finance, Engineering e Sales? (Prova a utilizzare il comando
uniq
.) -
Ora vuoi preparare un file CSV (valori separati da virgola) in modo da poter importare facilmente, dal file
mypasswd
nell’esempio precedente, il filenames.csv
in LibreOffice. Il contenuto del file avrà il seguente formato:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
TipUtilizza i comandi sed
,cut
epaste
per ottenere i risultati desiderati. Nota che la virgola (,
) sarà il delimitatore per questo file. -
Supponiamo che il foglio di calcolo
names.csv
creato nell’esercizio precedente sia un file importante e vogliamo assicurarci che nessuno lo manometterà dal momento in cui lo inviamo a qualcuno fino a quando il nostro destinatario lo riceverà. Come possiamo assicurare l’integrità di questo file usandomd5sum
? -
Ti sei ripromesso di leggere cento righe di un testo classico al giorno e hai deciso di iniziare con Mariner and Mystic di Herman Melville. Elabora un comando usando
split
che separerà questo libro in sezioni di 100 righe ciascuna. Per ottenere il libro in formato testo normale, cercalo su https://www.gutenberg.org. -
Usando
ls -l
nella directory/etc
, che tipo di elenco ottieni? Usando il comandocut
sull’output del comandols
come visualizzeresti solo i nomi dei file? E come il nome del file e del proprietario dei file? Insieme ai comandils -l
ecut
, usa il comandotr
per sostituire più occorrenze di uno spazio con un singolo spazio per aiutare a formattare l’output generato da un comandocut
. -
Questo esercizio presuppone che tu sia su una macchina reale (non una macchina virtuale). Devi anche avere una chiavetta USB con te. Esamina le pagine del manuale per il comando
tail
e scopri come seguire un file mentre il testo viene aggiunto ad esso. Durante il monitoraggio dell’output di un comandotail
sul file/var/log/syslog
, inserire una chiavetta USB. Scrivi il comando completo che utilizzeresti per ottenere Product, Manufacturer e total amount of memory della tua chiavetta USB.
Sommario
La gestione dei flussi di testo è di grande importanza in qualsiasi sistema Linux. I flussi di testo possono essere elaborati utilizzando gli script per automatizzare le attività quotidiane o trovare informazioni di debug rilevanti nei file di log. Ecco un breve riassunto dei comandi trattati in questa lezione:
cat
-
Usato per combinare o leggere file di testo semplice..
bzcat
-
Permette l’elaborazione o la lettura di file compressi usando il metodo
bzip2
. xzcat
-
Permette l’elaborazione o la lettura di file compressi usando il metodo
xz
. zcat
-
Permette l’elaborazione o la lettura di file compressi usando il metodo
gzip
. less
-
Questo comando impagina il contenuto di un file e consente la navigazione e la funzionalità di ricerca.
head
-
Questo comando visualizza le prime 10 righe di un file per impostazione predefinita. Con l’uso dell’opzione
-n
è possibile visualizzare più o meno righe. tail
-
Questo comando visualizza le ultime 10 righe di un file per impostazione predefinita. Con l’uso dell’opzione
-n
è possibile visualizzare più o meno righe. L’opzione-f
è usata per seguire l’output di un file di testo in cui vengono scritti nuovi dati. wc
-
Abbreviazione di “word count”, ma a seconda dei parametri che si utilizzano conterà caratteri, parole e righe.
sort
-
Utilizzato per organizzare l’output di un elenco in ordine alfabetico, in ordine alfabetico inverso o in ordine casuale.
uniq
-
Utilizzato per elencare (e contare) stringhe uguali.
od
-
Il comando "octal dump" viene utilizzato per visualizzare un file binario in notazione ottale, decimale o esadecimale.
nl
-
Il comando “number line” visualizza il numero di linee in un file, oltre che a ricreare un file con ogni riga preceduta dal suo numero di riga.
sed
-
L’editor di flusso può essere utilizzato per trovare occorrenze corrispondenti delle stringhe utilizzando Regular Expressions e per modificare i file utilizzando modelli predefiniti.
tr
-
Il comando "translate" può sostituire i caratteri e rimuove e comprime i caratteri ricorrenti.
cut
-
Questo comando può estrapolare parti di file di testo come fossero campi, se identificati da un delimitatore di caratteri.
paste
-
Unisce i file in colonne in base all’uso dei separatori di campo.
split
-
Questo comando può dividere file più grandi in file più piccoli a seconda dei criteri impostati dalle opzioni del comando.
md5sum
-
Utilizzato per il calcolo del valore hash MD5 di un file. Utilizzato anche per verificare un file rispetto a un valore hash esistente per garantirne l’integrità.
sha256sum
-
Utilizzato per il calcolo del valore hash SHA256 di un file. Utilizzato anche per verificare un file rispetto a un valore hash esistente per garantirne l’integrità.
sha512sum
-
Utilizzato per il calcolo del valore hash SHA512 di un file. Utilizzato anche per verificare un file rispetto a un valore hash esistente per garantirne l’integrità.
Risposte agli Esercizi Guidati
-
Qualcuno ha appena donato un laptop alla tua scuola e ora desideri installare Linux su di esso. Non esiste un manuale e sei stato costretto ad avviarlo senza interfaccia grafica da una chiavetta USB. Ottieni un terminale shell e sai che, per ogni processore, ci saranno una serie di riferimenti nel file
/proc/cpuinfo
:processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 (linee saltate) processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 158 (altre linee saltate)
-
Usando i comandi
grep
ewc
mostra quanti processori hai.Ecco due varianti:
$ cat /proc/cpuinfo | grep processor | wc -l $ grep processor /proc/cpuinfo | wc -l
Ora che sai che ci sono diversi modi in cui puoi fare la stessa cosa, ma quando dovresti usare l’uno o l’altro? Dipende davvero da diversi fattori, i due più importanti sono le prestazioni e la leggibilità. La maggior parte delle volte utilizzerai i comandi della shell all’interno di script per automatizzare le tue attività e più grandi e complessi saranno gli script, più dovrai preoccuparti di mantenerli veloci.
-
Fai la stessa cosa con
sed
invece digrep
Ora, invece di
grep
, proveremo consed
:$ sed -n /processor/p /proc/cpuinfo | wc -l
Qui abbiamo usato
sed
con l’opzione-n
in modo chesed
non stamperà nulla tranne ciò che corrisponde all’espressioneprocessor
, come indicato dal comandop
. Come abbiamo fatto con le soluzionigrep
,wc -l
conterà il numero di linee, quindi il numero di processori che abbiamo.Studia il prossimo esempio:
$ sed -n /processor/p /proc/cpuinfo | sed -n '$='
Questa sequenza di comandi fornisce risultati identici all’esempio precedente in cui l’output di
sed
è stato reindirizzato al comandowc
. La differenza qui è che invece di usarewc -l
per contare il numero di righe,sed
viene nuovamente invocato per fornire funzionalità equivalenti. Ancora una volta, stiamo sopprimendo l’output dised
con l’opzione-n
, ad eccezione dell’espressione che stiamo esplicitamente chiamando, che è'$='
. Questa espressione dice ased
di trovare l’ultima riga ($
) e quindi di visualizzarne il numero relativo (=
).
-
-
Esplora il tuo file locale
/etc/passwd
con i comandigrep
,sed
,head
etail
per le attività seguenti:-
Quali utenti hanno accesso a una shell Bash?
$ grep ":/bin/bash$" /etc/passwd
Miglioreremo questa risposta visualizzando solo il nome dell’utente che utilizza la shell Bash.
$ grep ":/bin/bash$" /etc/passwd | cut -d: -f1
Il nome utente è il primo campo (parametro
-f1
del comandocut
) e il file/etc/passwd
usa:
come separatore (parametro-d:
del comandocut
) così basta reindirizzare l’output del comandogrep
al comandocut
appropriato. -
Il tuo sistema ha vari utenti per gestire programmi specifici o per scopi amministrativi. Non hanno accesso a una shell. Quanti ne esistono nel tuo sistema?
Il modo più semplice per trovarli è stampare le righe per gli account che non usano la shell Bash:
$ grep -v ":/bin/bash$" /etc/passwd | wc -l
-
Quanti utenti e gruppi esistono nel tuo sistema (ricorda: usa solo il file
/etc/passwd
)Il primo campo di una determinata riga nel file
/etc/passwd
è il nome utente, il secondo è in genere unax
che indica che la password dell’utente non è memorizzata qui (è crittografata nel file/etc/shadow
). Il terzo è l’id utente (UID) e il quarto è l’id gruppo (GID). Quindi questo dovrebbe darci il numero di utenti:$ cut -d: -f3 /etc/passwd | wc -l
Bene, il più delle volte questo dovrebbe bastare. Tuttavia, ci sono situazioni in cui imposterai diversi super utenti o altri tipi speciali di utenti che condividono lo stesso UID (ID utente). Quindi, per essere al sicuro, inoltreremo il risultato del nostro comando
cut
al comandosort
e poi conteremo il numero di righe.$ cut -d: -f3 /etc/passwd | sort -u | wc -l
Ora, il numero di gruppi:
$ cut -d: -f4 /etc/passwd | sort -u | wc -l
-
Elenca solo la prima riga, l’ultima riga e la decima riga del tuo file
/etc/passwd
Questo si realizzerà attraverso:
$ sed -n -e '1'p -e '10'p -e '$'p /etc/passwd
Ricorda che il parametro
-n
dice ased
di non stampare altro che ciò che è specificato dal parametrop
. Il simbolo del dollaro ($
) usato nell’esempio indica l’ultima riga del file.
-
-
Considera questo esempio di file
/etc/passwd
. Copia le righe seguenti in un file locale chiamatomypasswd
per questo esercizio.root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync nvidia-persistenced:x:121:128:NVIDIA Persistence Daemon,,,:/nonexistent:/sbin/nologin libvirt-qemu:x:64055:130:Libvirt Qemu,,,:/var/lib/libvirt:/usr/sbin/nologin libvirt-dnsmasq:x:122:133:Libvirt Dnsmasq,,,:/var/lib/libvirt/dnsmasq:/usr/sbin/nologin carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash dave:x:1001:1000:Dave Edwards,Finance,,,Main Office:/home/dave:/bin/ksh emma:x:1002:1000:Emma Jones,Finance,,,Main Office:/home/emma:/bin/bash frank:x:1003:1000:Frank Cassidy,Finance,,,Main Office:/home/frank:/bin/bash grace:x:1004:1000:Grace Kearns,Engineering,,,Main Office:/home/grace:/bin/ksh henry:x:1005:1000:Henry Adams,Sales,,,Main Office:/home/henry:/bin/bash john:x:1006:1000:John Chapel,Sales,,,Main Office:/home/john:/bin/bash
-
Elenca tutti gli utenti nel gruppo
1000
(usased
per selezionare solo il campo appropriato) dal tuo filemypasswd
.Il GID è il quarto campo nel file
/etc/passwd
. Potresti essere tentato di provare questo:$ sed -n /1000/p mypasswd
In questo caso otterrai anche questa riga:
carol:x:1000:2000:Carol Smith,Finance,,,Main Office:/home/carol:/bin/bash
Sai che questo non è corretto poiché Carol Smith è un membro del GID 2000 e la corrispondenza è avvenuta a causa dell’UID. Tuttavia, potresti aver notato che dopo il GID il campo successivo inizia con un carattere maiuscolo. Possiamo usare un’espressione regolare per risolvere questo problema.
$ sed -n /:1000:[A-Z]/p mypasswd
L’espressione
[A-Z]
corrisponderà a ogni singolo carattere maiuscolo. Imparerai di più al riguardo nella lezione dedicata. -
Elenca solo i nomi completi di tutti gli utenti per questo gruppo (usa
sed
ecut
):Usa la stessa tecnica che hai usato per risolvere la prima parte di questo esercizio e inoltralo a un comando
cut
.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 Dave Edwards,Finance,,,Main Office Emma Jones,Finance,,,Main Office Frank Cassidy,Finance,,,Main Office Grace Kearns,Engineering,,,Main Office Henry Adams,Sales,,,Main Office John Chapel,Sales,,,Main Office
Non ci siamo ancora! Nota come i campi all’interno dei tuoi risultati possono essere separati da
,
. Quindi reindirizzeremo l’output ad un altro comandocut
, usando,
come delimitatore.$ sed -n /:1000:[A-Z]/p mypasswd | cut -d: -f5 | cut -d, -f1 Dave Edwards Emma Jones Frank Cassidy Grace Kearns Henry Adams John Chapel
-
Risposte agli Esercizi Esplorativi
-
Ancora una volta usando il file
mypasswd
degli esercizi precedenti, crea un comando Bash che selezionerà un individuo dal Main Office per vincere una lotteria. Usa il comandosed
per stampare solo le righe per il Main Office, e poi una sequenza di comandicut
per recuperare il primo nome di ogni utente da queste righe. Successivamente dovrai ordinare in modo casuale questi nomi e stampare solo il nome superiore dall’elenco.Prima esplora come l’opzione
-R
manipoli l’output del comandosort
. Ripeti questo comando un paio di volte sulla tua macchina (nota che dovrai racchiudere 'Main Office' tra virgolette singole, quindised
lo gestirà come una singola stringa):$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R
Ecco la soluzione al tuo problema:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1 | sort -R | head -1
-
Quante persone lavorano in Finance, Engineering e Sales? (Prova a utilizzare il comando
uniq
.)Continua a sviluppare ciò che hai imparato dagli esercizi precedenti. Prova quanto segue:
$ sed -n /'Main Office'/p mypasswd $ sed -n /'Main Office'/p mypasswd | cut -d, -f2
Nota ora che non ci interessa il delimitatore
:
. Vogliamo solo il secondo campo quando dividiamo le righe con i caratteri ",".$ sed -n /'Main Office'/p mypasswd | cut -d, -f2 | uniq -c 4 Finance 1 Engineering 2 Sales
Il comando
uniq
produrrà solo le righe uniche (non le righe ripetute) e il parametro-c
dice auniq
di contare le occorrenze delle righe uguali. C’è un avvertimento qui:uniq
prenderà in considerazione solo le linee adiacenti. Quando questo non sarà il caso, dovrai usare il comandosort
. -
Ora vuoi preparare un file CSV (valori separati da virgola) in modo da poter importare facilmente, dal file
mypasswd
nell’esempio precedente, il filenames.csv
in LibreOffice. Il contenuto del file avrà il seguente formato:First Name,Last Name,Position Carol,Smith,Finance ... John,Chapel,Sales
Suggerimento: usa i comandi
sed
,cut
epaste
per ottenere i risultati desiderati. Nota che la virgola (,) sarà il delimitatore per questo file.Inizia con i comandi
sed
ecut
, partendo da ciò che abbiamo imparato dagli esercizi precedenti:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f1 > firstname
Ora abbiamo il file
firstname
con i nomi dei nostri dipendenti.$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d" " -f2 | cut -d, -f1 > lastname
Ora abbiamo il file
lastname
contenente i cognomi di ogni dipendente.Successivamente determiniamo in quale reparto lavora ogni dipendente:
$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f2 > department
Prima di lavorare alla soluzione finale, prova i seguenti comandi per vedere che tipo di output generano:
$ cat firstname lastname department $ paste firstname lastname department
E ora per la soluzione finale:
$ paste firstname lastname department | tr '\t' , $ paste firstname lastname department | tr '\t' , > names.csv
Qui usiamo il comando
tr
per “translate”\t
, il separatore di tabulazione, con un,
.tr
è molto utile quando dobbiamo sostituire un carattere con un altro. Assicurati di rivedere le pagine man sia pertr
che perpaste
. Per esempio, possiamo usare l’opzione-d
per il delimitatore, per rendere meno complesso il comando precedente:$ paste -d, firstname lastname department
Abbiamo usato il comando
paste
già una volta per familiarizzare con esso. Tuttavia avremmo potuto eseguire facilmente tutte le attività in una singola catena di comandi:$ sed -n /'Main Office'/p mypasswd | cut -d: -f5 | cut -d, -f1,2 | tr ' ' , > names.csv
-
Supponiamo che il foglio di calcolo
names.csv
creato nell’esercizio precedente sia un file importante e vogliamo assicurarci che nessuno lo manometterà dal momento in cui lo inviamo a qualcuno fino a quando il nostro destinatario lo riceverà. Come possiamo assicurare l’integrità di questo file usandomd5sum
?Se guardi nelle pagine man di
md5sum
,sha256sum
esha512sum
vedrai che iniziano tutte con il seguente testo:“compute and check XXX message digest”
Dove “XXX” è l’algoritmo che verrà utilizzato per creare questo messaggio digest.
Useremo
md5sum
come esempio e successivamente potrai provare con gli altri comandi.$ md5sum names.csv 61f0251fcab61d9575b1d0cbf0195e25 names.csv
Ora, per esempio, puoi rendere disponibile il file tramite un servizio ftp sicuro e inviare il message digest generato utilizzando un altro mezzo di comunicazione sicuro. Se il file è stato in qualche modo alterato, il message digest sarà completamente diverso. Solo per dimostrarlo, modifica
names.csv
e cambia Jones in James come dimostrato qui:$ sed -i.backup s/Jones/James/ names.csv $ md5sum names.csv f44a0d68cb480466099021bf6d6d2e65 names.csv
Ogni volta che rendi i file disponibili per il download, è sempre buona norma distribuire anche un corrispondente message digest in modo che le persone che scaricano il tuo file possano produrre un nuovo message digest e confrontarlo con l’originale. Se navighi su https://kernel.org troverai la pagina https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc dove puoi ottenere lo sha256sum per tutti i file disponibili per il download.
-
Ti sei ripromesso di leggere cento righe di un testo classico al giorno e hai deciso di iniziare con Mariner and Mystic di Herman Melville. Elabora un comando usando
split
che separerà questo libro in sezioni di 100 righe ciascuna. Per ottenere il libro in formato testo normale, cercalo su https://www.gutenberg.org.Per prima cosa otterremo l’intero libro dal sito di Project Gutenberg, dove è possibile ottenere questo e altri libri di pubblico dominio.
$ wget https://www.gutenberg.org/files/50461/50461-0.txt
Potrebbe essere necessario installare
wget
se non è già installato nel tuo sistema. In alternativa, puoi anche usarecurl
. Usaless
per verificare il libro:$ less 50461-0.txt
Ora divideremo il libro in blocchi di 100 righe ciascuno:
$ split -l 100 -d 50461-0.txt melville
50461-0.txt
è il file che divideremo.melville
sarà il prefisso del nome per i file divisi.-L 100
specifica il numero di righe e l’opzione-d
dice asplit
di numerare i file attraverso un suffisso. Puoi usarenl
su uno qualsiasi dei file divisi (probabilmente non sull’ultimo) e confermare che ognuno di essi abbia 100 righe. -
Usando
ls -l
nella directory/etc
, che tipo di elenco ottieni? Usando il comandocut
sull’output del comandols
come visualizzeresti solo i nomi dei file? E come il nome del file e del proprietario dei file? Insieme ai comandils -l
ecut
, usa il comandotr
per sostituire più occorrenze di uno spazio con un singolo spazio per aiutare a formattare l’output generato da un comandocut
.Il comando
ls
darà solo i nomi dei file. Possiamo, tuttavia, elaborare l’output dils -l
(lunga lista) per estrarre informazioni più specifiche.$ ls -l /etc | tr -s ' ' , drwxr-xr-x,3,root,root,4096,out,24,16:58,acpi -rw-r--r--,1,root,root,3028,dez,17,2018,adduser.conf -rw-r--r--,1,root,root,10,out,2,17:38,adjtime drwxr-xr-x,2,root,root,12288,out,31,09:40,alternatives -rw-r--r--,1,root,root,401,mai,29,2017,anacrontab -rw-r--r--,1,root,root,433,out,1,2017,apg.conf drwxr-xr-x,6,root,root,4096,dez,17,2018,apm drwxr-xr-x,3,root,root,4096,out,24,16:58,apparmor drwxr-xr-x,9,root,root,4096,nov,6,20:20,apparmor.d
L’opzione
-s
indica atr
di ridurre gli spazi ripetuti in un singolo spazio. Il comandotr
funziona per qualsiasi tipo di carattere ripetitivo specificato. Quindi sostituiamo gli spazi con una virgola,
. In realtà non abbiamo bisogno di sostituire gli spazi nel nostro esempio, quindi ometteremo,
.$ ls -l /etc | tr -s ' ' drwxr-xr-x 3 root root 4096 out 24 16:58 acpi -rw-r--r-- 1 root root 3028 dez 17 2018 adduser.conf -rw-r--r-- 1 root root 10 out 2 17:38 adjtime drwxr-xr-x 2 root root 12288 out 31 09:40 alternatives -rw-r--r-- 1 root root 401 mai 29 2017 anacrontab -rw-r--r-- 1 root root 433 out 1 2017 apg.conf drwxr-xr-x 6 root root 4096 dez 17 2018 apm drwxr-xr-x 3 root root 4096 out 24 16:58 apparmor
Se voglio solo i nomi dei file, tutto ciò di cui abbiamo bisogno è il nono campo:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9
Per il nome file e il proprietario di un file avremo bisogno del nono e del terzo campo:
$ ls -l /etc | tr -s ' ' | cut -d" " -f9,3
E se avessimo solo bisogno dei nomi delle cartelle e del loro proprietario?
$ ls -l /etc | grep ^d | tr -s ' ' | cut -d" " -f9,3
-
Questo esercizio presuppone che tu sia su una macchina reale (non una macchina virtuale). Devi anche avere una chiavetta USB con te. Esamina le pagine del manuale per il comando
tail
e scopri come seguire un file mentre il testo viene aggiunto ad esso. Durante il monitoraggio dell’output di un comandotail
sul file/var/log/syslog
, inserire una chiavetta USB. Scrivi il comando completo che utilizzeresti per ottenere Product, Manufacturer e total amount of memory della tua chiavetta USB.$ tail -f /var/log/syslog | grep -i 'product\:\|blocks\|manufacturer' Nov 8 06:01:35 brod-avell kernel: [124954.369361] usb 1-4.3: Product: Cruzer Blade Nov 8 06:01:35 brod-avell kernel: [124954.369364] usb 1-4.3: Manufacturer: SanDisk Nov 8 06:01:37 brod-avell kernel: [124955.419267] sd 2:0:0:0: [sdc] 61056064 512-byte logical blocks: (31.3 GB/29.1 GiB)
Ovviamente questo è un esempio e i risultati possono variare a seconda del produttore della memory stick USB. Notate ora che usiamo il parametro
-i
con il comandogrep
poiché non siamo sicuri che le stringhe, che stiamo cercando, siano in maiuscolo o minuscolo. Abbiamo anche usato|
come OR logico, quindi cerchiamo le linee che contengonoproduct
oblocks
omanufacturer
.