Script Linux

Posté le 20. August 2006 dans SysAdmin

Ce billet est consacré au script Linux. J'ai écrit divers script pour "automatiser" certaines commandes, même si je dois exécuter ces scripts manuellement. Je pourrais, quand bien même, appeler ces scripts dans un cron si je le souhaitais.

Vous trouverez, donc, dans la suite, différents scripts, différentes idées, à améliorer, à récupérer.

Liste des paquets

Ce script permet de lister les paquets installés sur un système GNU\Debian. Cela me permet de récupérer une liste de paquet dans un fichier, liste que je peux réutiliser dans un logiciel comme synaptic pour installer les mêmes paquets sur une autre distribution.Couplé à une sauvegarde du dossier home et du dossier etc, le script permet de pouvoir réinstaller un système à l'identique (à condition que l'on ne se trouve pas sur unstable et moyennant le dossier /var.

liste=`dpkg -l | tail +6 | cut -d\  -f3`
for i in $liste ; do
    echo "$i        install"
done

La commande dpkg --get-selections peut très bien remplacer le script ci-dessus. Merci à mx pour sa remarque.

Purge des paquets

Permet de purger les paquets supprimés d'une distribution GNU\Debian. Cela permet de supprimer les quelques fichiers inutiles lors de la suppression de paquet GNU\Debian. Néanmoins, parfois on ne veut pas faire les purges.

for i in `dpkg -l | grep -e '^rc.*' | cut -f3 -d\ ` ; do dpkg -P $i ; done

Sécurisation des données

Permet de monter une partition démontée et démonter une partition montée. Ce script est basé sur KDialog pour demander les informations, il nécessite donc KDE (mais je pense qu'il est possible de le réécrire pour Gnome).On lui passe en paramètre le nom d'un périphérique. Il suppose que la partition démontée est un volume logique (sous LVM) dont le groupe est GNU\Debian et dont le nom est $DISK-close. Il crée à la suite le device-mapper (en supposant qu'il a été créé à l'aide de LUKS) du nom de $DISK-open.S'il trouve ce "device-mapper", il le démonte et le supprime.

#!/bin/sh

DISK=$1
DISKOPEN="$DISK-open"
DISKCLOSE="$DISK-close"

if [ -e /dev/mapper/$DISKOPEN ] ; then
        umount /dev/mapper/$DISKOPEN 2> /dev/null
        if [ $? != 0 ] ; then
                kdialog --title KSecure --error "Impossible de démonter le péripherique $DISK"
        fi
                if [ -e /dev/mapper/$DISKOPEN ] ; then
                /sbin/cryptsetup luksClose $DISKOPEN
                                kdialog --title KSecure --msgbox "Suppression du péripherique $DISK accomplie"
                fi
else
        password=`kdialog --title KSecure --password "Cle de déchiffrement de $DISK"`
        if [ -z $password ] ; then
                password="nopassword"
        fi
        echo "$password" | \
                /sbin/cryptsetup luksOpen /dev/debian/$DISKCLOSE $DISKOPEN 2> /dev/null
        mount /dev/mapper/$DISKOPEN 2> /dev/null
                if [ $? -ne  0 ] ; then
                                kdialog --title KSecure --error "Clé incorrecte"
                fi
fi

Apprentissage du spam

Permet d'appeler bogofliter et spamassassin sur une liste de message Indésirable au format mbox. Il permet aussi de faire l'apprentissage des messages désirables.

#!/bin/bash

sa-learn -L --no-sync --spam --mbox /home/phoenix/Mail/Indésirable\ \(Spam\)
sa-learn -L --no-sync --ham --mbox /home/phoenix/Mail/Désirable\ \(Non\ spam\)

bogofilter -N -s < /home/phoenix/Mail/Indésirable\ \(Spam\)
bogofilter -S -n < /home/phoenix/Mail/Désirable\ \(Non\ spam\)

Création de lien

Permet à partir d'une liste de fichier identique générée par fdupes de créer des liens physiques entre les fichiers pour économiser de la place. Attention : si un des fichiers physiques est modifié, l'autre le sera aussi.

#!/bin/sh

echo -n "|"
read -r line
while [ $? -eq 0 ] ; do
        line=`echo $line | sed -e "s/\\\\\\ /@/g"`
        index=0
        principal=""
        for chemin in $line ; do
                if [ $index -eq 0 ] ; then
                        principal=$chemin
                else
                        a=`echo $principal | sed -e "s/@/\\ /g"`
                        b=`echo $chemin | sed -e "s/@/\\ /g"`
                        ln -f "$a" "$b"
                fi

                index=`expr $index + 1`
        done

        echo -n "="

        read -r line
done
echo -n "|"

Renumérotation

Permet de renuméroté une liste d'image d'un dossier, du style 1 10 11 12 13 2 3 4... en une suite précédé d'un 0 : 01 02 03 04 05 06 ...

#!/bin/sh

for DIR in `ls` ; do

    echo -n "Change directory $DIR "

    cd $DIR

    CMD=`ls | sed -e 's/\(.*\)_\([1-9]\)\.jpg/mv \1_\2.jpg \1_0\2.jpg ;/g' | grep "mv "`
    eval $CMD

    cd ..

    echo "Ok"

done

Génération de playlist

Permet de générer une playlist sur un dossier pour utilisation avec le logiciel kpf (par exemple) de KDE. Il parcourt l'ensemble des dossiers et crée un fichier m3u à chaque fois qu'il trouve un fichier multimédia. Il remplace le début du dossier par un lien http.Je rajoute qu'il existe un très bon site contenant de la musique libre : Jamendo.

#!/bin/sh

OLD=`pwd`

cd "$1"
if [ $? -ne 0 ] ; then
    exit
fi

THIS=`pwd`
BASE=`basename "$THIS"`

echo "Ouverture de $BASE"

for path in * ; do
    if [ -d "$THIS/$path" ] ; then
        $0 "$THIS/$path"
    fi
done

echo "Traitement de $BASE"
rm $BASE.m3u 2> /dev/null

for path in *.mp3 *.ogg *.wma *.avi ; do
    echo $path | grep \* > /dev/null
    if [ $? -eq 1 ] ; then
        echo $THIS/$path | sed -e "s/\/media\/music/http\:\/\/192\.168\.101\.7\:8001/g" >> $BASE.m3u
    fi
done

echo "Sortie de $BASE"

Script pour gérer les documents latex

Ce script date de quelques temps quand je devais générer des documents différents à partir d'un même document LaTeX.Il utilise différentes commandes pour cela, et permet aussi de nettoyer le dossier. Une sorte de Makefile à la mode bash.

#!/bin/sh

if [ $# != 2 ] ; then
    echo "Il faut le nom du fichier et de la sortie"
    exit 1;
fi

NAME=$1
DEST=$2

case $DEST in
    cleanPDF)
        rm -f $NAME.pdf ;;
    cleanTXT)
        rm -f $NAME.txt ;;
    cleanPS)
        rm -f $NAME.ps  ;;
    cleanDVI)
        rm -f $NAME.dvi ;;
    cleanHTML)
        rm -f $NAME.html ;;
    cleanTEX)
        rm -f *.log *.toc *.htoc *.aux *.haux *~ ;;
    clean)
        glatex.sh $NAME cleanTEX
        glatex.sh $NAME cleanDVI
        glatex.sh $NAME cleanPS
        glatex.sh $NAME cleanTXT
        glatex.sh $NAME cleanPDF
        glatex.sh $NAME cleanHTML ;;
    mrproper)
        glatex.sh $NAME clean ;;
    _dvi)
        pslatex $NAME.tex
        pslatex $NAME.tex ;;
    xdvi)
        glatex.sh $NAME _dvi
        xdvi $NAME.dvi ;;
    dvi)
        glatex.sh $NAME _dvi
        glatex.sh $NAME cleanTEX ;;
    _html)
        hevea -francais -fix -noiso $NAME.tex ;;
    html)
        glatex.sh $NAME _html
        glatex.sh $NAME cleanTEX ;;
    _txt)
        hevea -francais -fix -text $NAME.tex ;;
    txt)
        glatex.sh $NAME _txt
        glatex.sh $NAME cleanTEX ;;
    _ps)
        glatex.sh $NAME _dvi
        dvips -Ppdf $NAME.dvi ;;
    ps)
        glatex.sh $NAME _ps
        glatex.sh $NAME cleanDVI
        glatex.sh $NAME cleanTEX ;;
    _pdf)
        pdflatex $NAME.tex
        pdflatex $NAME.tex ;;
    pdf)
        glatex.sh $NAME _pdf
        glatex.sh $NAME cleanTEX ;;
esac