Ugo POCHY
Je suis Informaticien étant agacé de ne plus pouvoir me déplacer avec ma doc perso sur ma clés USB chez les clients Je vais en mettre une partie sur WIKIBOOKS.
J'ai travaillé sur
- des ordonnanceur non open source : $U, VTom, OPS/XOS, CtrlM, AutoSys.
- un outil de transfert de fichier : CFT
- des OS : Windows, Linux, Aix, Solaris...
- des bases de données : Oracle, Mysql, MsSQL, PostgresSQL
- apache, jboss, tomcat, weblogic, WebSphereApplication
Je vais me concentré sur la partie Open Source Linux/bash pour commencer.
Exploitation informatique
modifierTerminologie /couleur sur fond noir
modifier- [D] DEV : Developpement (bleu ou aucune norme de couleur)
- [I,R,U] INT : Intégration , REC recette , UAT : user aceptance testing (vert)
- [Q,S] QUA : Qualification , STA : staging (Jaune)
- [PP?] PPROD : Prés production (Orange) L'utilisation de ce terme entraîne facilement une confusion avec PROD, de plus comment différencier en une lettre PROD et PPROD. Le mieux est de ne pas utilisé le terme "Prés production" et de le remplacé par l'un de ceux proposé ci-dessus.
- [P] PROD : Production (rouge)
Normes
modifier- scripting : https://www.bvassociates.fr/wp-content/uploads/2013/10/Normes-et-standard-BV.pdf
- temps : https://fr.wikipedia.org/wiki/ISO_8601
Prompt
modifierPrompt invite de commande compatible ksh et bash
modifierExemple d'affichage | Code prompt | |
---|---|---|
NEUTRE sans retour à la ligne | user@server:/home/user $ | PS1="$(printf '$LOGNAME@'$(hostname)':$PWD $ ')" |
NEUTRE | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@'$(hostname)':$PWD\n$ ')" |
NOIRE | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[30m'$(hostname)'\033[0m:$PWD\n$ ')" |
ROUGE | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[31m'$(hostname)'\033[0m:$PWD\n$ ')" |
VERT | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[32m'$(hostname)'\033[0m:$PWD\n$ ')" |
JAUNE | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[33m'$(hostname)'\033[0m:$PWD\n$ ')" |
BLEU | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[34m'$(hostname)'\033[0m:$PWD\n$ ')" |
MAGENTA | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[35m'$(hostname)'\033[0m:$PWD\n$ ')" |
CYAN | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[36m'$(hostname)'\033[0m:$PWD\n$ ')" |
BLANC | user@server:/home/user
$ |
PS1="$(printf '$LOGNAME@\033[37m'$(hostname)'\033[0m:$PWD\n$ ')" |
2 ROUGE | user@server:/home/user
$ |
PS1="$(printf '\033[37;41m$LOGNAME\033[0m@\033[31m'$(hostname)'\033[0m:$PWD\n$ ')" |
2 VERT | user@server:/home/user
$ |
PS1="$(printf '\033[37;42m$LOGNAME\033[0m@\033[32m'$(hostname)'\033[0m:$PWD\n$ ')" |
2 BLEU | user@server:/home/user
$ |
PS1="$(printf '\033[37;44m$LOGNAME\033[0m@\033[34m'$(hostname)'\033[0m:$PWD\n$ ')" |
2 JAUNE | user@server:/home/user
$ |
PS1="$(printf '\033[37;43m$LOGNAME\033[0m@\033[33m'$(hostname)'\033[0m:$PWD\n$ ')" |
vim
modifier- Scripter les commande vim :
vim toto +"4m 1" +":wq!"
- Macro vi
Start recording by pressing q, followed by a lower case character to name the macro Perform any typical editing, actions inside Vim editor, which will be recorded Stop recording by pressing q Play the recorded macro by pressing @ followed by the macro name To repeat macros multiple times, press : NN @ macro name. NN is a number @@ applique la dernière macro
qd start recording to register d ... your complex series of commands q stop recording @d execute your macro @@ execute your macro again
https://www.thegeekstuff.com/2009/01/vi-and-vim-macro-tutorial-how-to-record-and-play
http://vim.wikia.com/wiki/Macros
Prompte pour bash
modifierDétail des options
modifier- \t donne l’heure
- \d donne la date
- \h donne le nom de la machine
- \r donne Retour à la ligne
- \u donne le nom de l’utilisateur
- \w donne le chemin complet par rapport à la racine et le nom du répertoire courant
- \W donne uniquement le répertoire courant
Exemple de prompte bash
modifier- Promte avec date heure
$ PS1='[\u@\h \W] \D{%Y-%m-%d_%H:%M:%S}\n $ '
[serveur@user ~] 2017-11-22_23:53:09
- Promte avec date heure ISO (sauf le fuseau horaire)
$ PS1='[\u@\h \W] \D{%Y%m%dT%H%M%S}\n $ '
[serveur@user ~] 2017-11-22_23:53:09
- Promte avec heure
$PS1="[\u@\h:\w] \\A\n\$ "
[serveur@user:~/sh/scrt_prd] 23:23
$ export PS1="$(printf '$LOGNAME@\033[36m'$(hostname)'\033[0m:$PWD\n$')"
- Promte avec heure ISO (sauf le fuseau horaire)
$PS1="[\u@\h:\w] \\A\n\$ "
[serveur@user:~/sh/scrt_prd] T2323
$ export PS1="$(printf '$LOGNAME@\033[36m'$(hostname)'\033[0m:$PWD\n$')"
Bash/ksh
modifier- http://www.catonmat.net/blog/perl-one-liners-explained-part-three/
- http://www.catonmat.net/download/bash-redirections-cheat-sheet.pdf
Port tcp/udp
modifierEn local
modifiernetstat
- -l or --listening les socket actuelement en écoute.
- -a or --all toutes les sockets actuellement utilisé.
- -t or --tcp uniquement les sockets tcp.
- -u or --udp uniquement les sockets udp.
- -n or --numeric affiche les adresses en format numérique au lieu d'essayer de déterminer le nom symbolique d'hôte, de port ou d'utilisateur.
si vous être root
- -p ou --programs affiche les adresses en format numérique au lieu d'essayer de déterminer le nom symbolique d'hôte, de port ou d'utilisateur.
exemple : netstat -nput
autre exemple avec recherche d'information sur certain port :
$ egrep "(111|36470)/" --color /etc/services sunrpc 111/tcp portmapper # RPC 4.0 portmapper sunrpc 111/udp portmapper kx 2111/tcp # X over Kerberos
$ netstat -ltpn | egrep ":(111|36470)" --color tcp 0 0 127.0.0.1:55784 127.0.0.1:22 ESTABLISHED 6729/ssh tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:22 127.0.0.1:55784 ESTABLISHED -
$ ps -ef | egrep "6729" --color ugo 6729 2266 0 00:03 pts/0 00:00:00 ssh ugo@127.0.0.1 ugo 7184 6134 0 00:23 pts/1 00:00:00 grep -E 6729 --color
test host/port distant
modifiertelnet IP port
- time out ou nom de host inconnu : aucun IP n'est atteinte
- connexion refused : IP atteinte, mais le port n'est pas en écoute
- échec de connexion : IP/port atteint, mais la connexion à échoé.
- connexion réussi : IP/port atteint et la connexion est réussi.
Si la commande telnet n'est pas accessible vous pouvez utiliser : curl -v telnet://IP:port
lancer un script en nohup
modifiernohup chemin/script.sh >> chemin/fichier.log 2>&1 &
erase
modifierstty erase [touche backspace]
tar
modifier- tar -czvf dir.tar.gz dir
Toujours vérifier le contenu avant de détarer
- tar -tzvf dir.tar.gz
- tar -xzvf dir.tar.gz
recherche
modifierfichiers
modifierfind
option courente :
-name Recherche par nom de fichier : nom exacte ou avec des jokers. (-imane comme -name même sans tenir compte de la cas).
-type Recherche par type de fichier.: f pour fichier, d pour répertoire, p tube nomé (FIFO), l lien symbolique, s socket.
-user Recherche par propriétaire. (-nouser fichier qui à une uid sans user sur ce serveur)
-group Recherche par appartenance à un groupe. (-nogroup fichier qui à une gid sans group sur ce serveur)
-size Recherche par taille de fichier. avec c pour octet, k pour kilo-octet 1024 octets, M pour meg-octets, G our giga-octets.
-atime Recherche par date de dernier accès. -mtime Recherche par date de dernière modification. -ctime Recherche par date de création. Donc 3 lettre possible devant time a, m ou c.
-amin -mmin et -cmin comme avec time mais le temps est exprimé en minutes.
-daystart mesure de temps depuis le début de la journée affecte : -amin, -atime, -cmin, -ctime, -mmin, et -mtime
-perm Recherche par autorisations d'accès.
-links Recherche par nombre de liens au fichier.
-a -o ! : "-a" pour et "-o" pour ou et "!" pour non. Par défaut les expression utilisées dans find sont reliées par un et (-a).
Exemples :
- executé plusieurs commande avec un find.
$ find . -type f -exec file '{}' \; -exec ls -l '{}' \; ./vegetaux: ASCII text -rw-r--r-- 1 ugo ugo 485 mars 19 22:02 ./vegetaux
- opérateur logique
find . \( -name 'vegetaux' -o -name 'fruit' \) -print ./vegetaux ./fruit
- Trouvers les gros fichiers
find / -size +100M -exec ls -l {} \; 2> /dev/null | sort -n -k 5
- Touvers les gros fichiers créer de puis moins de 1à jours et modifier depuis moins de 24heures.
find / -ctime -10 -mtime -1 -size +100M -exec ls -l {} \; 2> /dev/null | sort -n -k 5
caractère
modifiergrep
modifierUtiliser les notions binaire avec grep : ou et not
- ou
egrep
egrep "or|ma" fruit orange mangue
Sous linux : grep -E correspond à egrep
grep -E "or|ma" fruit orange mangue
Autre possibilité sous linux : grep avec \
grep "or\|ma" fruit orange mangue
avec un motif plus recherché
egrep "^(or|ma)[[alpha:]]{3}" fruit --color orange mangue
avec de la couleur pour trouver plus vite la chaîne qui correspond
grep "or\|ma" fruit --color orange mangue
- et
grep "po" fruit pomme poire
On utilise le pipe pour "|"
grep "po" fruit | grep "me" pomme
grep "po" fruit | grep "me"
- non
On utilise grep -v
grep "po" fruit | grep -v "re" pomme
copier un fichier sur un serveur distant
modifiersplit -b 1000k un_gros_fichier
cat xaa xab xac > un_gros_fichier
créer un menu
modifiergestion des erreurs
modifierDétecter les erreurs de syntaxe sans exécution du script
modifier bash -n nom_script.sh
La même méthode pour :
perl :
perl -c script_perl.pl
python :
python -m py_compile script.py
XML :
xmllint --noout file.py
Débugage
modifierset -u # Indique les variable utilisé mais non défini.
set -x # Affiche la ligne de commande du scripte avant de l’exécute.
set -v # Affiche la ligne de commande tel quelle est interprétée.
trap
modifier- le script test.sh :
#! /bin/bash
err_report() {
echo "Error on line $1"
}
trap 'err_report $LINENO' ERR
echo Bonjour | grep foo # c'est la ligne 9
- Exécution :
$ ./test.sh
Error on line 9
- source :
https://unix.stackexchange.com/questions/39623/trap-err-and-echoing-the-error-line
Récupérer le code d'erreur : $?
modifierla variable $? récupère le code erreur de la dernière commande
echo hello | grep foo ; echo $?
1
echo hello | grep hello ; echo $?
hello
0
|| et &&
modifier||
modifierSi la commande précédente termine en erreur la commande qui suite || est exécute.
echo hello | grep foo || echo "il n'y a pas de hello"
- Remarque si on utilise : la fonction err_report sera appelé avant la commande qui suite ||.
trap 'err_report $LINENO' ERR
&&
modifierSi la commande précédente termine correctement la commande qui suite && est exécute.
echo hello | grep hello && echo "il y a hello"
PIPESTATUS[@] et $?
modifiercmd1 | cmd2 | cmd3 | cmd4
echo ${PIPESTATUS[@]}
Trouve le code de sortie de toutes les commandes.
$ echo "hello toto" | grep hello | n_existe_pas 2>&1 | grep n_existe_pas ; echo ${PIPESTATUS[@]}
bash: n_existe_pas : commande introuvable
0 141 127 0
$ echo "hello toto" | grep hello | n_existe_pas 2>&1 | grep n_existe_pas ; echo $?
bash: n_existe_pas : commande introuvable
0
herescript
modifiertee newfile <<EOF
line 1
line 2
line 3EOF
package auto extractible par heresdocument
modifiertar -xvf package.tar.gz -O script.sh | bash
log
modifierATTENTION : si le script est utilisé par un ordonnanceur c'est cette ordonnanceur qui doit rediriger les et pas le script. Exemple d'ordonnanceur Automator, AutoSys, ControlM, Vtom, $U
Exemple de commande à mettre en début de script pour mettre la log dans un le répertoire REP_LOG
LOG=/REP_LOG/$(basename ${0}).log
exec >> $LOG
exec 2>> $LOG
Souvent on préfèrent avoir une log pour chaque exécution avec la date et l'heure et le numéro de PID
HORODATEGE_PID="$(date +%Y%m%dT%H%M%S)T_P$$"
LOG=/REP_LOG/$(basename ${0}).log.$HORODATEGE_PID
exec >> $LOG
exec 2>> $LOG
le saviez vous?
modifierPS2, PS3 et PS4
modifierIl n'existe pas que PS1, mais aussi PS2, PS3 et PS4 qui ont un peu moins d'intérêt à être personnalisés.
- PS2 sert lorsque votre ligne n'est pas terminée, par exemple lorsqu'elle contient une chaine de caractère non terminée
- PS3 sert de prompt pour la commande select d'usage assez rare
- PS4 sert de base pour l'affichage des traces de debug de script (commande set -x)
ISO 8601
modifierISO 8601 : spécifie la représentation numérique de la date et de l'heure
- %F Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99)
- %T The time in 24-hour notation (%H:%M:%S). (SU)
Option d'affichage
modifierscript
modifier#!/bin/bash
####################################
#OBJET install et remplace un fichier V3
#Usage -u <USER> -f <FICHIER> -l <REP_LIVRAISON> -d <REP_DESTINATION> -h <REP_HISTORISATION>"
#
#VERSION 1.2
#AUTEUR UPO
#DATE DE CREATION 01/02/2020
#MODIFICATION 1.1 UPO ajoute du contrôle d'erreur
# 1.2 UPO getops
####################################
#
#DESCRIPTION DE TAILLE DU SCRIPTS
####################################
# mise à jour de fichier en copiant et historisant les anciennes version avec horodatage.
# Utilisation de l'utilisateur approprier.
#
#
####################################
####################################
#Initialisation des variable
####################################
DATE=$(date +%Y%m%d)
ESTAMPILLE="$(date +%Y%m%d_%H%M%S)_$$"
####################################
# Récupération des paramètre
####################################
while getopts "d:f:h:l:u:" option
do
echo "getopts a trouvé l'option $option"
case $option in
d)
DEST=$OPTARG
;;
f)
FILE=$OPTARG
;;
h)
HISTO=$OPTARG
;;
l)
LIVRAISON=$OPTARG
;;
u)
U=$OPTARG
;;
*)
echo "Usage :"
echo "$0 -u <USER> -f <FICHIER> -l <REP_LIVRAISON> -d <REP_DESTINATION> -h <REP_HISTORISATION>"
;;
esac
done
if [[ $U == "" ]] || [[ $FILE == "" ]] || [[ $LIVRAISON == "" ]] || [[ $DEST == "" ]] || [[ $HISTO == "" ]] ; then
echo "Usage :"
echo "$0 -u <USER> -f <FICHIER> -l <REP_LIVRAISON> -d <REP_DESTINATION> -h <REP_HISTORISATION>"
fi
echo "$0 -u $U -f $FILE -l $LIVRAISON -d $DEST -h $HISTO"
###########################################
# Vérification des paramètre
###########################################
if [[ $USER != "${U}" ]]; then
echo "Il faut etre sous le user ${U}"
echo "Fin du script $0 ERREUR 1" >&2
exit 1
fi
echo "Date : ${DATE}"
if [ ! -d ${LIVRAISON} ]; then
echo "Le repertoire ${LIVRAISON} n'existe pas."
echo "Fin du script $0 ERREUR 2" >&2
exit 2
fi
if [ ! -f ${LIVRAISON}/${FILE} ]; then
echo "Le fichier ${LIVRAISON}/${FILE} n'existe pas."
echo "Fin du script $0 ERREUR 3" >&2
echo "ls -l ${LIVRAISON}"
ls -l ${LIVRAISON}
exit 3
fi
#########################
# Partie Principal
#########################
if [ ! -f ${DEST}/${FILE} ]; then
echo "Le fichier ${DEST}/${FILE} n'existe pas."
else
if [ ! -f ${HISTO}/${FILE}.${DATE} ]; then
echo "mv ${DEST}/${FILE} ${HISTO}/${FILE}.${DATE}"
read $a
mv ${DEST}/${FILE} ${HISTO}/${FILE}.${DATE} || (echo "ERREUR 5 lors de la commande : mv ${HISTO}/${FILE} ${DEST}/${FILE}.${DATE}" >&2 ; exit 5)
else
echo "mv ${DEST}/${FILE} ${HISTO}/${FILE}.${ESTAMPILLE}"
read $a
mv ${DEST}/${FILE} ${HISTO}/${FILE}.${ESTAMPILLE} || (echo "ERREUR 6 lors de la commande : mv ${HISTO}/${FILE} ${DEST}/${FILE}.${ESTAMPILLE}" >&2 ; exit 6)
fi
echo "${DEST}/${FILE}*"
ls -l ${DEST}/${FILE}*
echo "cp ${LIVRAISON}/${FILE} ${DEST}/${FILE}"
read $a
cp ${LIVRAISON}/${FILE} ${DEST}/${FILE} || (echo "ERREUR 8 cp ${LIVRAISON}/${FILE} ${DEST}/${FILE}" >&2 ; exit 8)
echo "${DEST}/${FILE}*"
ls -l ${DEST}/${FILE}*
exit 0
Apache
modifierhttps://httpd.apache.org/docs/current/fr/mod/core.html Apache
uptime windows net statistics workstation