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

modifier

Terminologie /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)

Prompt invite de commande compatible ksh et bash

modifier
Prompt invite de commande compatible ksh et bash
Exemple 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$ ')"
  • 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

modifier
Dé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

Port tcp/udp

modifier
En local
modifier

netstat

  • -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
modifier

telnet 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

modifier
nohup chemin/script.sh >> chemin/fichier.log 2>&1 &

stty erase [touche backspace]

  • 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

modifier
fichiers
modifier

find

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
modifier

Utiliser 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

modifier
split -b 1000k un_gros_fichier

cat xaa xab xac > un_gros_fichier

créer un menu

modifier

gestion des erreurs

modifier
Dé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
modifier
set -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.
  • 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 : $?
modifier

la 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

Si 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 :
    trap 'err_report $LINENO' ERR
    
    la fonction err_report sera appelé avant la commande qui suite ||.

Si 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 $?
modifier

cmd1 | 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

modifier
tee newfile <<EOF
line 1
line 2
line 3EOF

package auto extractible par heresdocument

modifier
tar -xvf package.tar.gz -O script.sh | bash

ATTENTION : 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?

modifier

PS2, PS3 et PS4

modifier

Il 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

modifier

ISO 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

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

https://httpd.apache.org/docs/current/fr/mod/core.html Apache

uptime windows net statistics workstation