Script e comandi utili

Da Linux User Group Scandiano.

Questo spazio è dedicato agli script e comandi concatenati che posso risultare utili al mantenimento e alla gestione di un sitema GNU/Linux.

Indice

Sistema

Controllare se un servizio è in esecuzione

Script che controlla se un determinato servizio (in questo caso apache) è in esecuzione e se non lo è lo riavvia.

#!/bin/bash

if $(ps ax | grep apache2 | grep -v grep > /dev/null ) ;
then
        exit ;
else
        /etc/init.d/apache2 restart ;
fi

Un altro modo per fare la stessa cosa:

#!/bin/bash

TAG="MOTION"

CONTROL=$(ps ax | grep motion | grep -v grep | awk '{print $5}')

sleep 5 ;

if [ -n "$CONTROL" ]
then
        echo "Motion già in esecuzione" ;
        exit 0 ;
else
        echo "Motion non attivo, RIAVVIO motion!"
        motion ;
        logger riavvio servizio non attivo -t $TAG ;
        exit 1 ;
fi

Questo script prende l'output opportunamente filtrato da grep e se la stringa NON è vuota (-n "$CONTROL") esce perché motion è già in esecuzione, altrimenti riavvia il servizio e riporta con logger un eventuale avvio.

ATTENZIONE: il nome dello script non deve contenere "traccia" del nome del servizio da cercare, grep altrimenti troverà come servizio corrispondente lo stesso script e non funzionerà come ci si aspetterebbe: in questo caso ad esempio sarebbe un errore nominarlo "riavvio_motion".

Controllare se un programma è installato

Per controllare se un programma è installato possiamo utilizzare il comando aptitude. Se ad esempio vogliamo controllare se è installato zenity possiamo usare il comando

aptitude search zenity

Il comando restituirà un output simile al seguente:

p   octave-zenity                   - simple graphical user interfaces using zen
i A zenity                          - Display graphical dialog boxes from shell 
i A zenity-common                   - Display graphical dialog boxes from shell 

La "i" all'inizio della riga indica che il programma è installato.

Possiamo controllare se un programma è installato anche con il comando dpkg tuttavia, mentre aptitude permette di effettuare una vera e propria ricerca sul nome del pacchetto, con dpkg, per avere una risposta sensata dobbiamo scrivere il nome esatto del pacchetto.

dpkg -s zenity

Se il programma è installato il comando restituirà tutti i dettagli del programma (architettura, maintainer, dipendeze ecc). La cosa interessante è che se dopo il comando dpkg eseguiamo il comando

echo $?

otterremo il codice di uscita di dpkg che sarà 0 se il programma è installato e 1 se il programma non è installato. Pertanto dpkg si presta molto bene ad essere utilizzato all'interno di script bash per individuare se un programma è installato o no. Un esempio potrebbe essere il seguente:

dpkg -s zenity &> /dev/null
echo $?

che restituisce 0 se zenity è installato e 1 se non è installato

Terminare il processo di una determinata connessione

Con questo comando killiamo il processo (PID) di una connessione tcp:

kill -9 `netstat -pn | grep 192.168.1.14 | awk '{print $7}' | sed -n 1p | sed 's/\/apache2//g'`

Vediamo il significato del comando:

  • kill -9 [numero del processo]: questo serve per killare un determinato processo. Tra i due apici (``) cercheremo ora di estrapolare il numero del PID che ci interessa dal comando netstat
  • netstat -pn: riporta le connessioni attive senza risolvere i nomi (-n) e mostrando il PID (-p)
  • grep 192.168.1.14: prende solo le righe con questo indirizzo IP
  • awk '{print $7}': prende solo la settima colonna, in questo caso quella con il PID (nella forma PID/programma ad esempio 13099/apache2)
  • sed -n 1p: prende solo la prima riga dell'output (ci serve per avere un solo numero PID alla volta, ovviamente con più risultati dobbiamo lanciare il comando più volte)
  • sed 's/\/apache2//g': toglie dal risultato la parola /apache2 e lascia il numero del PID.


Trovare lista pacchetti installati con aptitude

Con questo comando vediamo tutti i pacchetti installati:

aptitude search '~i'

In questo modo filtriamo maggiormente il risultato, nell'esempio avremo tutti i pacchetti installati che contengono la parola myslq:

aptitude search '~i mysql'

Elencare pacchetti installati in un file di testo e ripristinare gli stessi pacchetti in un altro pc con la medesima distribuzione

ATTENZIONE: il ripristino funziona solo se i pacchetti installati sono esclusivamente liberi ed open source(ad esempio non funziona se ho installato i ttf ms corefonts )!

Con questa riga di comandi concatenati creiamo un file di testo sulla Scrivania che contiene un elenco dei pacchetti attualmente presenti nel PC in uso:

 dpkg --get-selections "*" > /home/nomeutente/Scrivania/elenco_pacchetti.txt

in questo file verrà scritto l'elenco dei programmi installati.Se devi ripristinare l'elenco, copia il file sull'altro sistema, poi digita:

dselect update
dpkg --set-selections < elenco_pacchetti.txt
apt-get -u dselect-upgrade

a questo punto verranno installati tutti i pacchetti: attento però verrà davvero riprodotta la stessa situazione, copiando anche le librerie mancanti... se nella versione nuova qualche pacchetto è diventato obsoleto ti darà errore perché cercherà di installarlo comunque... io userei questa procedura per due distro uguali: non so se è il tuo caso... e controlla il file prodotto prima di procedere, magari usa l'opzione "simulate" con apt-get per fare delle prove... le configurazioni per i programmi utente di solito li trovi nelle tua home... dipende in genere dal programma, potresti salvarti l'intera home e copiarla sul nuovo sistema... le configurazioni di sistema le trovi solitamente in /etc... comunque nelle proprietà di ogni pacchetto ci sono i file installati e dove sono stati installati... secondo me non c'è un modo comune per salvare le configurazioni, ma è una cosa abbastanza semplice: nel caso di cups ad esempio ti basta salvare la cartella che hai in etc per mantenere le stampanti. ATTENZIONE: il ripristino funziona solo se i pacchetti installati sono esclusivamente liberi ed open source(ad esempio non funziona se ho installato i ttf ms corefonts )!

Esiste anche un secondo metodo per elencare i pacchetti installati in un file di testo. Digita:


dpkg --list > /home/nomeutente/Scrivania/elencopacchettidettagliato.txt

Questo metodo ti crea un elenco più dettagliato ma non potrai poi utilizzare il file di testo così ottenuto per ripristinare un sistema identico ma solo consultarlo.

Controllare quale distribuzione LINUX è installata nel pc in uso

Con questo comando posso verificare quale distro linux è installata nel pc in uso. Digita:


lsb_release -a

Questo metodo di solito è affidabile ma non tutte le distro sono sempre ricomprese.

Controllare quale KERNEL LINUX è installato nel pc con UNAME

Uso il comando uname -a per verificare il kernel installato


uname -a

poi premo invio oppure


uname -r

poi premo invio oppure


uname -mrs

poi premo invio.

Controllare le specifiche tecniche dell'hardware in uso

Con questo comando verifichiamo le caratteristiche dell'hardware in uso. Digitiamo:


sudo lshw

O meglio


sudo lshw -html > lshw.html

Con questo secondo metodo creiamo nella nostra home un file html che descrive l'hardware in uso.

Un terzo metodo consiste nell'installare hardinfo un free software dotato di interfaccia grafica (gui) digitando:


sudo apt-get install hardinfo

Hardinfo è dotato di una gui (interfaccia grafica).

Controllare il driver grafico in uso

grep -B2 'Module class: X.Org Video Driver' /var/log/Xorg.0.log

un altro comando utile e chiaro è:

lshw -c display | grep driver

Force quit (ossia forzare uscita) o xkill

Con questi comandi è possibile terminare una applicazione ribelle ossia chiudere forzatamente un programma che è andato in crash. xkill è un vero e proprio comando linux a cui si può associare una icona che su debian 6 è quella di force quit. Force quit (force-quit.png o force_quit.png ) è l'icona che debian 6 associa al comando xkill .Force quit è particolarmente interessante in quanto si può usare direttamente da ambiente grafico. Purtroppo gnome shell o gnome 3 e unity non hanno di default il pulsante ossia l'icona force quit ma è possibile usare il comando xkill da teminale oppure installare script o applicazioni che abilitano l'icona force quit.

Formattare in modo sicuro

Con questi comandi è possibile formattare un hard disk o una periferica di archiviazione generica con un grado di sicurezza molto elevato. Il primo di questi è il metodo raccomandato se non ci si aspetta degli attacchi attivi contro il proprio livello di criptografia:

dd if=/dev/zero of=/dev/[dispositivo] bs=4k

Il seguente comando è più sicuro. Esso si basa su uno pseudo-random creato da una probabilità di dati ottenuto da queste opzioni; in molti casi è il metodo migliore.

dd if=/dev/urandom of=/dev/[dispositivo] bs=4k

Il seguente comando è ancora più efficace ma impiega molto tempo. Durante il processo è necessario utilizzare il computer (muovere il mouse in modo anomalo, lanciare applicazioni, utilizzare un alto livello di I/O, ecc.) per rendere il processo "random" ancora più efficace creando molti dati casuali.

dd if=/dev/random of=/dev/[dispositivo] bs=4k

Si può utilizzare anche questo comando che scrivera' 5 pattern di dati sul dispositivo, sovrascrivendo e verificando i dati. Questo comando è utilizzato per controllare i badblocks, ma può anche essere usato per eliminare eventuali dati esistenti.

badblocks -vfw /dev/[dispositivo] [dimensione blocchi del device]

La dimensione dei blocchi (size block) è determinata dal tipo di file system. Nel caso di una partizione ext3 con limite massimo di grandezza file di 2 Tb e dimensione massima di file system di 8 Tb il block size sarà di 4 Kb. (vedere le specifiche relative al proprio file system).

fsck

fsck controlla e ripara il filesystem da eventuali errori. Se si "spegne male" e si rompe il filesystem può essere utile.


rsync ; rsnapshot ; FreeFileSync

Rsync serve per trasferimento rapido e incrementale e backup dei propri files, è già incluso tra i comandi delle principali distribuzioni linux.

Rsnapshot basato su rsync serve per fare "foto" a scadenze regolari preimpostate da noi dei nostri file.

FreeFileSync è un software open source che fa backup dei file confrontandone le modifiche e funziona anche su win e mac.

Spegnere il bluetooth

In alcuni computer il bluetooth viene attivato ad ogni riavvio, per evitare questo basta lanciare, nella propria sessione utente, il comando:

rfkill block bluetooth

Il pacchetto rfkill è nei repository Debian e potrebbe essere comodo inserirlo in sudoers così da non dover inserire la password per lanciarlo, cosa molto utile se si vuole automatizzare l'operazione:

utente ALL=NOPASSWD: /usr/sbin/rfkill

Spegnere velocemente il computer da terminale

Per spegnere rapidamente il pc da terminale con permessi di root digito il comando

init 0 

poi premo enter o invio. Non so perchè ma spesso questo spegnimento è più veloce rispetto al comando halt.

Cestino (Trash)

Percorso della cartella cestino (Trash) in debian.

 ~/.local/share/Trash 

In generale su una qualunque distro per sapere dove si trova il cestino occorre digitare:

 locate Trash

poi premo invio e scelgo tra l'output il percorso che mi serve.

Cancellare cartelle o directory in modo ricorsivo o singoli file

AVVERTENZA: usando il comando rm non sposto le directory o i file nel cestino ma li cancello direttamente.

Per le directory: se necessario coi privilegi di root digito

rm -r nomedellacartelladacancellare

oppure

rm -R nomedellacartelladacancellare

oppure

rm -f nomedellacartelladacancellare
rm -rf nomedellacartelladacancellare

poi premo invio.

ATTENZIONE: gli ultimi due metodi possono essere PERICOLOSI in quanto l'opzione f elimina le eventuali richieste di conferma. In caso di cancellazione errata non resta che tentare di ricorrere al software libero photorec.

Se voglio cancellare un singolo file basta usare in comando rm senza opzioni seguito dal nome del file.

rm nomedelfilecancellare

Cancellare gli stessi file in modo ricorsivo

In questo esempio si spostano in modo ricorsivo tutti i file .htaccess dalla cartella tmp alla cartella cestino (sovrascrivendoli):

find /tmp -name ".htaccess" -exec mv -f {} /cestino \;

Attenzione: con questo comando i file vengono sovrascritti nella cartella cestino ma se il nostro scopo è cancellarli a poco importa. Una volta fatto cancelleremo dalla cartella cestino l'unico file .htaccess rimasto. Sì è preferito usare il comando mv al posto di rm per un fattore di sicurezza. E' comunque un comando da usare con cautela. Ancora più semplice è usare l'opzione -delete: sempre da usare con cautela e dà qualche problema con l'eliminazione delle cartelle.

find . -name ".htaccess" -delete

Cancellare file nascosti

per cancellare i file nascosti con rm bisogna digitare:

rm -f .??*

Attenzione, Usare con cautela!!

Script che cancella i file nascosti con almeno due caratteri. Utile nei server di file sharing come samba dove più sistemi operativi interagiscono. (Ad esempio mac osx lavorando sul file "prova.gif" lascerà sul disco un file ".prova.gif")

#!/bin/bash

rm -fr /root/cestino_file_nascosti && mkdir /root/cestino_file_nascosti && find /percorso/condivisione -name ".??*" 
-exec mv -f {} /root/cestino_file_nascosti \;

il sistema cancella la cartella "cestino_file_nascosti" e la ricrea subito dopo perchè è pensato per essere inserito in cron. In questo modo i file nascosti vengono spostati nella cartella "cestino_file_nascosti" e fino alla successiva esecuzione si ha la possibilità di ritrovarli (ATTENZIONE: file con lo stesso nome vengono sovrascritti).

Cancellare ricorsivamente file con determinate estensioni

find . -regex ".*\(doc\|docx\|ppt\|pptx\|xls\|exe\)$" -exec rm {} \;

Cancellare i file più vecchi di n. giorni

Questo comando trova e cancella i file con estensione .log più vecchi di 7 giorni nel percorso in cui si lancia. L'opzione "-delete" non ha bisogno dell'opzione "-depth" per cancellare i file ricorsivamente perchè la contiene. Se invece volessimo solo trovare i file le due opzioni andrebbero scambiate.

find . -ctime +7 -name "*.log" -delete

Cancellare i file e le cartelle più vecchi di n. giorni

In questo esempio il comando cancella file e cartelle più vecchie di 7 giorni dentro a /tmp.

find /tmp/* -ctime +7 -delete ;

oppure si può anche usare questa forma:

find /tmp/ -ctime +7 -exec rm {} \;

nb: sostituire "rm" con "echo" per fare delle prove e visualizzare cosa verrà cancellato. Al posto di "ctime" si può utlizzare "mtime" che coincide con la data di modifica.

Cancellare file in modo sicuro

Con questo comando è possibile cancellare file e cartelle con un grado di sicurezza elevato.

wipe -rcf -Q 34 [percorso file o cartella da eliminare]

-r è ricorsivo, -c per impostare i permessi di scrittura se necessari e -f forza la cancellazione senza chiedere conferma (utile se si vogliono cancellare più file). -Q n indica il numero di passaggi che utilizzerà wipe per riscrivere il file (consigliato 34, tenendo presente che per file grandi questo richiederà molto tempo).

Port forwarding con SSH

E' abbastanza semplice utilizzare una connessione ssh per redirigere un determinato traffico di un server remoto sulla nostra macchina locale. L'esempio sotto propone il reindirizzamento della porta di Transmission (9091) attraverso SSH mandandola in locale sulla porta 8080:

ssh user_remoto@server_remoto -L 8080:127.0.0.1:9091

In questo modo aprendo il nostro browser alla pagina http://127.0.0.1:8080 visualizzeremo il nostro Transmission remoto; questo diventa molto comodo quando abbiamo connessioni filtrate in base alla porta.

Cercare

Trovare i file modificati da n. giorni

Col comando seguente troviamo tutti i file modificati da 1 giorno a partire dal punto in cui lanciamo il comando:

find . -mtime -1

Trovare i file più grandi in modo ricorsivo

Con questo comando troviamo ricorsivamente i file con dimensione superiore a 100 Mb:

find . -type f -size +100000000c -exec ls -lh \{} \;

Ovviamente possiamo cambiare le opzioni a nostro piacimento come la dimensione e l'opzione -exec: in questo caso i file vengono listati con ls. Altra cosa interessante è l'opzione -type che ci permette di trovare alcuni tipi di file. Alcuni esempi:

  • f: regular file
  • d: directory
  • l: symbolic link

Un modo più comodo è usare du insieme a sort:

du -sh * | sort -h

Trovare un file o un comando

Per trovare un file o un comando esistono varie possibilità. Posso digitare:

locate nomedelfile

Col comando "locate" scopriamo dove è locato un file all'interno del filesystem sulla base del proprio nome. Ad esempio, se voglio sapere dove è situato il file eseguibile di nautilus digito:

locate nautilus
find nomedelfile

Find permette di effettuare una ricerca gerarchica all'interno di una directory e le sue sottodirectory utilizzando diversi attributi del file. (Vedi ad esempio Trovare i file più grandi in modo ricorsivo)

whereis nomedelfile

Il comando whereis permette di individuare nel filesystem i file binary eseguibili, i sorgenti e i manuali dei comandi

Esistono anche i comandi find e whereis e locatedb . Per maggiori info: http://wiki.debian.org/it/WhereIsIt o anche http://wiki.debian.org/WhereIsIt

Trovare tutti gli indirizzi mail di una pagina web

wget -q -O - 'http://www.sito.dominio' | grep -oE '[^@:>< ]+@([^\.:@ ]+\.)+[a-zA-Z]{2,4}'

A seconda degli utilizzi l'espressione regolare va modificata. Gli indirizzi doppi non vengono scartati. Altro modo per indicare le mail potrebbe essere: ([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})

Trovare o escludere stringhe che contengono determinati caratteri

con questo comando riusciamo ad estrapolare in un file solo le righe che contengo un determinato carattere: in questo caso /:

grep -E '[/]' testo.txt

Viceversa con questo comando escludiamo tutte le righe che contengono /:

grep -E '^[^/]+$' testo.txt

Cercare stringhe alfanumeriche di almeno n. caratteri

Con questo comando troviamo tutte le stringhe alfanumeriche di almeno 16 caratteri:

grep -rE '[0-9a-zA-Z]+{16}' /percorso

E' possibile anche escludere tipi di estensione:

grep --exclude=*.{flv,jpg,JPG} -rE '[0-9a-zA-Z]+{16}' /percorso

Alcune opzioni comode:

  • -i: ignora le differenze tra lettere maiuscole e minuscole.
  • -h: mostra solo le stringhe trovate (nasconde il nome del file)
  • -o: mostra solo il nome dei file dove viene trovata la stringa (nasconde la stringa ma ripete il nome del file anche più volte se all'interno dello stesso vengono trovate più stringhe corrispondenti)
  • -l: mostra solo il nome del file dove viene trovata la stringa (nasconde la stringa e NON ripete il nome del file se all'interno dello stesso vengono trovate più stringhe corrispondenti)
  • -E: considera le espressioni regolari

Se vogliamo cercare la stringa alla fine del file dobbiamo aggiungere $ al comando:

grep --exclude=*.{flv,jpg,JPG} -rE '[0-9a-zA-Z]+{16}$' /percorso

Contare righe ripetute in un file

Con questo script, modificato a seconda delle proprie esigenze, riusciamo a contare quante ricorrenze ci sono all'interno di un file in determinate colonne:

cat file.csv | sort | awk -F "\t" '{print $3, $4, $5}' | uniq -ci

un esempio di output potrebbe essere questo:

     23 Zz_Top Francine The_Best_Of
     17 Zz_Top Heard_It_On_The_X The_Best_Of
     13 Zz_Top Jesus_Just_Left_Chicago The_Best_Of
     12 Zz_Top Just_Got_Paid The_Best_Of
      4 Zz_Top La_Grange The_Best_Of
      1 zz_top la_grange 
      7 Zz_Top La_Grange The_Best_Of
     17 Zz_Top Tush The_Best_Of
     16 Zz_Top Waitin'_For_The_Bus The_Best_Of
 

di file.csv abbiamo considerato solo le colonne 3,4 e 5 separate da TAB (opzione -F "\t"). Davanti ad ogni riga è riportato il numero delle ricorrenze grazie a uniq -c, ordinate alfabeticamente con sort e filtrate solo le colonne che ci interessano con awk. L'opzione -i di uniq permette di ignorare le differenze fra maiuscolo e minuscolo.

Modificare

Cancellare una riga contenente una determinata stringa da più file

Questo comando cancella in tutti i file txt la riga contenete la stringa "pluto" nel percorso in cui viene lanciato.

sed -i "/.*pluto.*/d" *.txt

Questo script fa la stessa cosa ma ricorsivamente partendo da /tmp che è definito dalla variabile "inputdir".

#!/bin/bash

inputdir=/tmp

 echo   "sto cercando i file"
        for file in $(find $inputdir -iname "*.txt") ; do
        echo    "sto cancellando le stringhe con la parola pluto"
        sed -i "/.*pluto*/d" $file
 done

Sostituire i caratteri accentati di tutti i file del tuo sito

Se volete sostituire i caratteri accentati con il corrispondente nome html (es. è con &egrave;) potete usare lo script seguente che deve essere lanciato seguito dalla directory nella quale cercare le corrispondenza. Lo script cercherà in tutte le sottocartelle.

!/bin/bash

inputdir=$1

echo Sto cercando i file

for file in $(find $inputdir -iname "*.php") ; do
        echo Correggo il file $file
        sed -i 's/è/\&egrave;/g' $file
        sed -i 's/à/\&agrave;/g' $file
        sed -i 's/ò/\&ograve;/g' $file
        sed -i 's/ù/\&ugrave;/g' $file
        sed -i 's/ì/\&igrave;/g' $file
        sed -i 's/é/\&eacute;/g' $file
done

Sostituire una stringa in più file con un solo comando

Supponiamo di voler sostituire la stringa copyright con la stringa copyleft da tutti i file .txt (o .TXT). Con questo comando è possibile:

find /percorso_file -iname "*.txt" -exec sed -i 's/copyright/copyleft/g' {} \;

Aggiungere una nuova riga ad un file

Con questo comando aggiungiamo la parola prefisso in una nuova riga all'inizio del file prova.txt:

sed -i '1,1s/^/prefisso \n/g' prova.txt

Provare prima senza l'opzione -i per avere solo un output visivo a schermo. Il carattere \n aggiunge un "a capo" e in questo modo creiamo una nuova linea che precede la prima (1,1).

Aggiungere caratteri ad ogni riga di un file

Modificando il comando precedente abbiamo la possibilità di inserire la parola "prefisso" all'inizio di ogni riga del nostro file:

sed -i 's/^/prefisso/g' prova.txt

Aggiungere una nuova riga alla fine di un file

Con questo comando aggiungiamo la parola Linux alla fine del file prova.txt:

sed -i '$a Linux' prova.txt

Al posto di '$' possiamo aggiungere un valore numerico e in quel caso la parola verrà aggiunta nella riga corrispondente.

ATTENZIONE: il comando non funziona se il file è vuoto. Un altro metodo per aggiungere righe in fondo ad un file, anche se questo è vuoto è usare echo con >>:

echo "Linux" >> prova.txt

Cancellare l'ultima riga di un file

Questo è un metodo semplice per eliminare l'ultima ruga di un file di testo:

sed -i '$d' prova.txt

Convertire file

Conversione file audio da wma a mp3

Con questo script è possibile convertire tutti file con estensione .wma dentro ad una determinata cartella in formato .mp3 a 160 kbps. E' necessario avere installato mplayer e posizionarsi nella cartella contenente i file da convertire.

#!/bin/bash

for i in *.wma
do
 if [ -f "$i" ]; then
 rm -f "$i.wav"
 mkfifo "$i.wav"
 mplayer -quiet -vo null -vc dummy -af volume=0,resample=44100:0:1 -ao pcm:waveheader:file="$i.wav" "$i" &
 dest=`echo "$i"|sed -e 's/wma$/mp3/'`
 lame -V0 -h -b 160 --vbr-new "$i.wav" "$dest"
 rm -f "$i.wav"
fi
done

Conversione file video da flv a avi (xvid)

Con questo script è possibile convertire file flash video (senza spazi nel nome) con estensione .flv in formato .avi con codec xvid. E' necessario avere installato ffmpeg, le varie librerie (nel nostro caso "libxvidcore4" e "libmp3lame0") e spostare i file da convertire nella cartella specificata dalla variabile "inputdir". Questo script è utile per convertire video in formato flash scaricati da internet mantenendo la qualità originale, che è abbastanza bassa, con l'opzione "sameq". Per convertire altri tipi di file vedere il manuale di ffmpeg, anche per i problemi legati alle varie distribuzioni GNU/Linux che possono avere librerie di conversione diverse: in questo caso è utile il comando "ffmpeg -formats".

#!/bin/bash

inputdir=/conversione/flv
destdir=/conversione/avi

for file in $(find $inputdir -iname "*.flv") ; do name=$(basename $file .flv) ;
ffmpeg -i $file -sameq -vcodec libxvid -acodec libmp3lame $destdir/$name.avi ; done

Database

Creazione di utenti, privilegi, backup e ripristino

Puoi trovare le informazioni su come creare database, utenti, gestire i privilegi, effettuare backup e ripristino di MySQL negli Appunti LAMP

Script per fare un backup di tutti i database PostgreSQL in file separati

#!/bin/bash

OF=$(date "+%Y%m%d%H%M%S")
DIR=/mnt/bck_database/

[ ! $DIR ] && mkdir -p $DIR || :
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|List|:|\(|Name|template[01]')
for d in $LIST
do
  pg_dump $d | gzip -c >  $DIR/$OF-$d.out.gz
done

Questo script è stato modificato utilizzando le variabili dello script per Mysql qui sopra, ma utilizza psql, awk e grep per creare la lista dei nomi dei database: in linea generale salva i database in più file con estensione .gz. per scompattare l'archivio creato:

gunzip database.out.gz

Al posto dello script sopra, si può usare il comando:

pg_dump -U pippo nome_db -f nome_db.out

Per ripristinare utilizzare un utente con permessi PostgreSQL e digitare questo comando per creare un nuovo database:

createdb nome_db_vuoto

Se è necessario specificare l'utente con permessi sul db basta utilizzare l'opzione -U come in questo esempio:

createdb -U pippo nome_db_vuoto

e infine il comando per importare il database:

psql -d nome_db_vuoto -f database.out

oppure se vogliamo utilizzare un utente specifico (in questo caso pippo):

psql -U pippo -d nome_db_vuoto -f database.out

Assegnare i privilegi su un database

Utilizzando la consolle di mysql con questo comando assegniamo tutti i privilegi all'utente pippo sul db chiamato database:

GRANT ALL ON database.* TO pippo@localhost IDENTIFIED BY 'db_password';

Modificare il charset di un database

Utilizzando la consolle di mysql con questo comando modifichiamo il charset del nostro database:

ALTER DATABASE database DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

Cancellare utenti e database da una lista di valori

Questo script legge dal file elenco.txt una lista di valori e procede con alcune operazioni: cancella l'utente, il database e l'utente mysql corrispondente ai valori letti nell'elenco.

#!/bin/bash

elenco="elenco.txt"

while read line
do
        deluser --remove-home $line ;
        mysqladmin -f -u root -ppassword drop $line ;
        mysql -u root -ppassword -e "DROP USER '$line'@'localhost';"
done < $elenco

Manipolare file pdf

Unire più pdf

Per unire diversi file pdf basta installare "pdftk" e da riga lanciare:

pdftk file1.pdf file2.pdf cat output file_uniti.pdf

Eliminare la prima metà delle pagine di un pdf

#!/bin/bash
# USAGE: halfpdf pdfname
# Taglia un pdf a metà prendendo la parte conclusiva
PDF=$1

TOT=`pdftk $PDF dump_data output | grep Num | sed -e 's/NumberOfPages: //'`

HALF=`echo $(($TOT/2+1))`
pdftk $PDF cat $HALF-end output $PDF.half.pdf

Dividere a metà un pdf con numero di pagine pari

#!/bin/bash
# USAGE: halfpdf pdfname
# dividere a metà un pdf con numero di pagine pari
PDF=$1

TOT=`pdftk $PDF dump_data output | grep NumberOf | sed -e 's/NumberOfPages: //'`

FIRSTEND=`echo $(($TOT/2))`
pdftk $PDF cat 1-$FIRSTEND output start-$PDF

SECONDBEGIN=`echo $(($FIRSTEND+1))`
pdftk $PDF cat $SECONDBEGIN-end output end-$PDF

Estrarre ogni singola pagina di un file pdf

Con questo comando è possibile dividere un pdf in sigole pagine:

pdftk documento.pdf burst output pagina_%02d.pdf

Con la forma "%02d" il comando nomina i singoli file con numero sequenziale di due cifre (pagina_01, pagina_02, pagina_03, ...pagina_99)

Oppure è possibile usare questo script:

#!/bin/bash
PDF=$1

TOT=`pdftk $PDF dump_data output | grep NumberOf | sed -e 's/NumberOfPages: //'`

for((i=1;i<=$TOT;i++))
do
	pdftk $PDF cat $i output $PDF.$i.pdf
done

Ridurre la dimensione di un PDF

Per ridurre la dimensione di un PDF è possibile utilizzare il comando convert contenuto nel pacchetto imagemagick. Il comando è il seguente:

convert -compress jpeg -quality 90 file.pdf file-small.pdf

dove con l'opzione -compress si specifica il tipo di compressione e con -quality la qualità da 0 a 100.

Un comando alternativo per ridurre la dimensione del PDF può essere il seguente:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

Ruotare un PDF

Con pdftk è possibile anche ruotare un intero file .pdf:

pdftk originale.pdf cat 1-endwest output ruotato.pdf

E' molto semplice da usare perché utilizza i punti cardinali per ruotare le pagine:

  • E = East, ruota il foglio di 90° in senso orario. Si può usare anche R (Right).
  • S = South, ruota il foglio di 180°
  • W = West, ruota il foglio di 270° in senso orario. Si può usare anche L (left).
  • N = North ruota il foglio di 360° cioè non cambia nulla.

E' anche possibile ruotare solo alcune pagine; ecco un esempio dove viene ruotata solo la prima pagina e dalla seconda in poi rimane tutto invariato:

 pdftk originale.pdf cat 1E 2-end output ruotato.pdf

In questo modo è possibile creare tutte le combinazioni possibili, ad esempio:

pdftk originale.pdf cat 1-2 3E 4W 5-end output ruotato.pdf

Significa: le prime due pagine lasciale invariate, la terza ruotala a destra, la quarta a sinistra e dalla quinta tutto invariato.

Guida tratta da http://batos.wordpress.com/2007/12/10/ruotare-un-pdf-con-pdftk/

Vario

Generare password MD5

echo -n password | md5sum

dove al posto di password inseriremo la parola d'ordine che vogliamo trasformare in MD5.

Generare password casuali di 6 caratteri alfanumerici

echo `< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6`

Generare password con 4 parole casuali [1]

shuf -n 4 /usr/share/dict/words | tr -d '\n'

Scaricare file con nome crescente da un sito

Se si vogliono scaricare vari file da un sito, e questi sono in ordine crescente ma non è permesso il directory listing, cioè non si riesce a visualizzare la cartella intera con la lista dei file presenti, uno script del genere può essere molto comodo:

#!/bin/bash

min=1
max=999

while [ $min -le $max ]

do

min=$((min+1))

wget http://www.sitodiprova.it/testi/$min.txt

done

Con questo script diamo a wget le istruzione per provare a scaricare dal sito "www.sitodiprova.it" nella cartella "testi" tutti i file .txt con nome che va da 1.txt a 999.txt. Sostituire il nome del sito con il suo IP corrispondente velocizza lo script.

Confrontare se due IP sono uguali

Per confrontare due valori, in questo caso il nostro IP pubblico salvato sul file ip.txt e l'indirizzo che abbiamo al momento dell'esecuzione dello script, si può utilizzare questo script:

#!/bin/bash

ip1=$(curl icanhazip.com)
ip2=$(cat ip.txt)

if [ $ip1 == $ip2 ]; then
        echo "sono uguali"
        exit 0
else
        echo "sono diversi"
        curl icanhazip.com >ip.txt
        exit 1
fi

ATTENZIONE: controllare il servizio web (in questo caso icanhazip.com) perché a volte cambiano oppure l'output generato presenta differenze.

Ciclo while: controllare se la dimensione di una cartella cambia

Questo script confronta la dimensione di una cartelle prima e dopo un certo periodo di tempo ed esce solo quando la dimensione è identica. Serve per verificare se la dimensione della cartella è "stabile", ad esempio se ci upload in corso.

#!/bin/bash

dim1=$(du -s /cartella | awk '{print $1}');
sleep 4 ;
dim2=$(du -s /cartella | awk '{print $1}');

while [ $dim1 != $dim2 ]
do

dim1=$(du -s /cartella | awk '{print $1}');
sleep 4 ;
dim2=$(du -s /cartella | awk '{print $1}');
echo "attendere, upload in corso..." ;

done

"Sleep 4" sta a significare che aspetta 4 secondi prima di passare al comando successivo: comodo con il comando "du" che a volte dà problemi e non non aggiorna la dimensione in maniera istantanea.

Ciclo while: attivare il wifi

Questo script attiva la device wifi se il pulsante hardware è stato premuto.

#!/bin/bash

wifi=$(/sbin/iwconfig eth1 | grep Tx-Power |  awk '{print $4}')

while [ $wifi == Tx-Power=off ]
do

echo "wifi spento"
sleep 2 ;

wifi=$(/sbin/iwconfig eth1 | grep Tx-Power |  awk '{print $4}')
done

echo "è acceso" ;
/usr/sbin/rfkill unblock wifi ;

exit 0

Ciclo if con operatori logici

Questo script fa alcune operazioni a seconda del giorno e dell'ora: controlla il giorno e se l'orario corrisponde alla fascia 00:00/07:59 compie le azioni scritte.

#!/bin/bash

GIORNO=$(date +%a)
ORA=$(date +%k)

if [ $GIORNO == "lun" -o $GIORNO == "mer" -o $GIORNO == "ven" ]
then
                if [ $ORA -le "7" ]
                then
                        echo "Eseguo il comando 1"
                else
                        exit 0
                fi
elif [ $GIORNO == "mar" -o $GIORNO == "gio" -o $GIORNO == "sab" ]
then
                if [ $ORA -le "7" ]
                then
                        echo "Eseguo il comando 2"
                else
                        exit 0
                fi
            
else
  exit 1
fi

Disabilitare un modulo del kernel all'avvio dell'installazione debian

Crystal kedit.png
Questa pagina ha bisogno di aiuto.

Questa sezione è soltanto un abbozzo e necessita di essere sviluppata. Se vuoi contribuire allo sviluppo di questa sezione clicca sul pulsante modifica e inserisci i tuoi contenuti.

E' possibile disabilitare un modulo del kernel all'avvio dell'installazione di Debian utilizzando il comando seguente:

modprobe.blacklist=nome_modulo

Stessa opzione dovrà essere passata a Grub al primo avvio per disabilitare temporaneamente il modulo. Per accedere a Grub in modalità editinge premere e

Scrivere in un file con echo

Con questo comando si aggiunge la riga "testo" alla fine del file "prova":

echo testo >> prova

Con questo comando si sostituisce il contenuto del file "prova" con la parola "testo":

echo testo > prova

nb: se non esiste il file "prova" verrà creato; per aggiungere stringhe con spazi utilizzare questa forma: echo "testo con spazi" >> prova

Unire più file

Per unire due file dello stesso tipo basta usare il comando cat: è utilissimo per accodare ad esempio file video dello stesso tipo che non hanno bisogno di essere riprocessati:

cat video_01.dv video_02.dv > video_unito.dv

Prendere solo parte di un output

Consideriamo questa variabile:

VARIABILE=lugscandiano

richiamandola:

echo $VARIABILE

avremo come output a monitor:

lugscandiano

se vogliamo avere solo determinati caratteri di questo output possiamo usare, ad esempio, questa forma:

echo ${VARIABILE:0:3}

come output avremo:

lug

cioè dal carattere 0 spostandosi 3 caratteri dopo, oppure:

echo ${VARIABILE:3:9}

avremo:

scandiano

ma avremmo anche potuto scrivere:

echo ${VARIABILE:3}

Altro metodo per filtrare un output; in questo caso della lista di file jpg prendiamo solo la prima riga, togliamo l'estensione e gli ultimi 4 caratteri:

ls -1 *.jpg | sed -n 1p | sed 's/.jpg//g' | sed -e 's/....$//g'

Con questo invece della lista di file jpg prendiamo solo la prima riga, togliamo l'estensione e i primi 4 caratteri:

ls -1 *.jpg | sed -n 1p | sed 's/.jpg//g' | sed -e 's/^....//g'

Ascoltare radio Krock di Scandiano (www.krock.it) in streming audio con debian o ubuntu

E' necessario aver prima installato sul proprio computer VLC o Rhythmbox oppure Banshee. Ad esempio in VLC seleziono il menù "media>apri flusso di rete" e nell'apposito spazio "inserisci un URL di rete" scrivo:

rtsp://74.218.218.210/krock01.sdp

Calcolatrice via terminale

Veloci calcoli utilizzando la riga di comando sono possibile con echo:

echo $((1200 + 6000 + 2 + 8))

Possibile anche l'utilizzo delle parentesi:

echo $(((1200 + 6000 + 2 - 8) / 2))

Lanciare gufw in Debian 6 Squeeze e in Debian 7 Wheezy

gufw non è installato di default in molte distro. Se non è già installato per installarlo digitare coi privilegi di root

apt-get install gufw

poi premere invio.

In debian 6 da terminale root digitare:

gksu gufw

poi premere enter o invio. A questo punto dovrebbe apparirire gufw sul monitor. gufw (Graphic UFW ) è la GUI (Graphic User Interface cioè interfaccia grafica) di ufw (Uncomplicated FireWall). Se si tenta di lanciare gufw direttamente da ambiente grafico Debian 6 dà un errore, pertanto il procedimento su descritto è necessario.

In debian 7 da terminale digito:

gufw

poi premere enter o invio. Il comando gufw in debian 7 si trova in:

/usr/bin/gufw

ATTENZIONE: di default GUFW non è visibile nel menù XFCE di debian 7 con ambiente grafico XFCE. Per renderlo visibile occorre nell'ordine: 1)installare GUFW (e anche UFW ovviamente poichè GUFW è l'interfaccia grafica di UFW ). 2)installare "menù principale" ossia "alacarte" che NON è installato di default in xfce debian 7. 3)lanciare il "menù principale" ossia alacarte (in xfce) impostazioni>menù principale . 4)andare in sistema>nuova voce poi scrivo tipo:applicazione nome:GUFW comando:/usr/bin/gufw commento:lancia il firewall grafico poi clicco su ok. GUFW è finalmente comparso nel menù principale nella voce Sistema.

Elimina cronologia Bash

Da terminale digito:

history -c

poi premo enter o invio.

Non sempre il predetto metodo funziona. Per essere più sicuri è meglio usare

cat /dev/null > ~/.bash_history && history -c && exit

poi premo enter o invio.

Determinare il tipo di file

Per determinare il tipo di file, nei sistemi di tipo unix (quindi anche Linux e MacOS) si usa il comando:

file nomedelfile

che legge e interpreta il "magic number" ; ovviamente se non sono nella stessa directory del file occorre specificare il percorso completo del file anzichè il semplice nome del file.

NB: in linux le estensioni (cioè la parte del mome del file dopo il . ), "se ci sono" sono "sempre" visibili. Ma hanno una funzione solo mnemonica, a parte quelle dei formati proprietari, perchè non vengono usate dal sistema per riconoscere il tipo di file. I files hanno al loro interno un codice (il "magic number") che ne identifica il tipo, e quello viene utilizzato dal sistema, non l'estensione. Comunque il comando file serve a controllare anche che qualcuno non faccia il "furbo" dando una estensione sbagliata a un file di diverso tipo (es: dare a un virus per win una estensione .txt a un virus file .exe per trarre in errore l'utente e fargli lanciare o propagare un virus in ambiente win). Quindi in linux le estensioni di file , eccetto i file con formato proprietario, non sono necessarie al sistema ma sono solo utili all'utente per fargli capire , salvo "furbate" di cui sopra, di che tipo di file si tratta. Per conoscere meglio il comando file da terminale digito:

man file

Ovviamente il comando file smaschera eventuali "furbate" di cui sopra.

Rimuovere i file di configurazione delle applicazioni disinstallate

Un procedimento è:

sudo -s

poi premo Invio , poi digito:

dpkg --get-selections|grep deinstall|cut -f 1|xargs sudo dpkg -P

poi premo Invio.

Un altro procedimento è:

sudo aptitude purge ~c

poi premo Invio .

Un altro procedimento consiste nell'installare Ubuntu Tweak che fa la stessa cosa per via grafica [2].


Rimuovere i pacchetti con i file di configurazione delle applicazioni disinstallate

apt-get --purge remove nome_pacchetto

poi premo Invio .

Il metodo sopra rimuove un pacchetto, compresi tutti i file di configurazione.

Invece se digito

apt-get autoremove nome_pacchetto

rimuovo un pacchetto e tutte le dipendenze inutilizzate.

Vedi anche i links: http://www.istitutomajorana.it/scarica/Ubuntu_comandi_da_terminale.pdf

http://wiki.ubuntu-it.org/AmministrazioneSistema/PulireUbuntu

Script pulizia Ubuntu Tools

Vedi i links:

http://www.lffl.org/2012/07/ubuntu-script-per-mantenere-pulita-la.html

http://forum.ubuntu-it.org/viewtopic.php?t=201409

Note

  1. Tratto da CommandlineFu [1]
  2. Ulteriori informazioni sono disponibili sul sito www.lffl.org