|
@@ -0,0 +1,168 @@
|
|
|
|
|
+# Codes utiles pour les scripts
|
|
|
|
|
+
|
|
|
|
|
+## Emplacement des scripts
|
|
|
|
|
+
|
|
|
|
|
+Il est possible de récupérer le nom du script en cours d'exécution:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+$ 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*):
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+_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:
|
|
|
|
|
+
|
|
|
|
|
+```sh
|
|
|
|
|
+#!/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:
|
|
|
|
|
+
|
|
|
|
|
+```sh
|
|
|
|
|
+#!/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:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+./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:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+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.
|