Selaa lähdekoodia

Elements utiles

Laurent HUBERT 7 vuotta sitten
vanhempi
commit
7aa0c603b5
1 muutettua tiedostoa jossa 168 lisäystä ja 0 poistoa
  1. 168 0
      D-elements-utiles.md

+ 168 - 0
D-elements-utiles.md

@@ -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.