D-elements-utiles.md 4.6 KB

Codes utiles pour les scripts

Emplacement des scripts

Il est possible de récupérer le nom du script en cours d'exécution:

$ cat > monscript << EOF
#!/bin/bash
echo "Nom du script:\$0"
EOF

$ cat monscript
#!/bin/bash
echo $0
$ chmod +x monscript
$ ./monscript
Nom du script:./monscript

Il est même possible récupérer son chemin absolu. Pour cela, ajoutez les lignes suivantes au début de votre script (juste après le shebang):

_resolve_file_location(){
	SOURCE="$1"
	while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
	  THE_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
	  SOURCE="$(readlink "$SOURCE")"
	  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
	done
	THE_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
	echo $THE_DIR
}

SCRIPT_DIR_PATH=$(_resolve_file_location "$0")
SCRIPT_ABS_PATH=$SCRIPT_DIR_PATH/$(basename $0)

echo "Mon chemin absolu : $SCRIPT_ABS_PATH"

Passages de paramètres

Dans ce guide, nous allons voir comment passer des paramètres à un script, soit sous la forme d'une liste d'items séparés par des espaces, soit sous forme de paramètres tels que -h ou --help.

Liste de paramètres

Il est possible de lister les paramètres grâce à leur index: $1, $2, $3, etc.

Il est également possible de boucler sur ces paramètres de la manière suivante:

#!/bin/bash

while [ $# -gt 0 ] ; do
    case "$1" in
        *)      echo '$1='"$1"
                shift # Décale les arguments
                echo 'après shift $1='"$1"
                ;;
    esac
done

Cette méthode est destructive: elle ne permet pas de récupérer les valeurs des paramètres.

Par contre elle marche avec tous les shell (y compris les shells POSIX).

Application

Ecrivez un script qui prend une liste de fichiers en paramètres et qui affiche leur contenu dans la console.

Liste d'arguments

Il est possible de passer des arguments en paramètres.

C'est-à-dire que l'on peut indiquer au shell à quoi correspond chaque paramètre.

Par exemple, indiquer quel est le répertoire source et quel est le répertoire cible parmi les paramètres. Et indépendamment de l'ordre.

Voici un script de démonstration:

#!/bin/bash
printHelp(){
        echo "Un texte pour expliquer comment se servir de la commande"
}

OPTS=$(getopt -l help,destination:,source:,verbose hd:s:v $*)
#Vérifie que les paramères donnés étaient corrects:
if [ $? != 0 ]
then
        echo "Erreur lors de l'interprétation des paramètres:getopt"
        printHelp
    exit 1
fi
eval set -- "$OPTS"

echo 'Les paramètres interprétés par getopt:'$*
echo '$OPTS='$OPTS

VERBOSE="0"

while true ; do
    case "$1" in
        -d|--destination)       DESTINATION="$2"
                                shift ; shift ## Deux items: deux shift
                ;;
        -s|--source)    SOURCE="$2"
                        shift ; shift
                ;;
        -v) VERBOSE="1"; shift
                ;;
        -h|--help)
                printHelp
                exit 0
                ;;
        --) shift; break
                ;;
    esac
done

#Maintenant on peut tester les paramètres qui restent
while [ $# -gt 0 ] ; do
    case "$1" in
        *)      echo '$1='"$1" ; shift
                ;;
    esac
done

echo '$SOURCE='$SOURCE
echo '$DESTINATION='$DESTINATION

Lancez ce script en utilisant les manières suivantes:

./listeargs.sh Bonjour au revoir
./listeargs.sh --help Bonjour au revoir
./listeargs.sh --source Bonjour au revoir
./listeargs.sh --source Bonjour --destination au revoir

Que constatez-vous ?

Lisez le manuel de la commande getopt. Que fait cette commande ?

Applications

Scan avec filtrage d'OS

Reprendre le script permettant de faire un scan approfondi.

Ajoutez un paramètre --os (ou -o) qui permet de ne prendre en compte que les OS dont la chaîne de caractère correspond à la valeur de l'option.

Par exemple:

scan-deep -o windows

N'affichera que les machines dont l'OS est de type windows.

Copie avec modification

La copie des fichiers *.conf contenus dans les dossiers commençant par .data doit maintenant se faire en remplaçant des valeurs. Ainsi, toutes les chaines de caractères commençant par user= seront remplacées par user=<monlogin> (remplacez <monlogin> par votre nom d'utilisateur).

Ecrivez un script pour réaliser cela. Vous devrez utiliser des commandes comme cat, sed. La page de manuel re_format peut aussi vous aider.

Les autres fichiers doivent être copiés sans modification.