Utilisateur:Ugo POCHY

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

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 | modifier le wikicode]

Terminologie /couleur sur fond noir[modifier | modifier le wikicode]

  • [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[modifier | modifier le wikicode]

Prompt invite de commande compatible ksh et bash[modifier | modifier le wikicode]

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$ ')"

vim[modifier | modifier le wikicode]

  • 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 | modifier le wikicode]

Détail des options[modifier | modifier le wikicode]
  • \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 | modifier le wikicode]
  • 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 | modifier le wikicode]

Port tcp/udp[modifier | modifier le wikicode]

En local[modifier | modifier le wikicode]

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 | modifier le wikicode]

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.

lancer un script en nohup[modifier | modifier le wikicode]

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

erase[modifier | modifier le wikicode]

stty erase [touche backspace]

tar[modifier | modifier le wikicode]

  • 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 | modifier le wikicode]

fichiers[modifier | modifier le wikicode]

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 | modifier le wikicode]
grep[modifier | modifier le wikicode]

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 | modifier le wikicode]

split -b 1000k un_gros_fichier

cat xaa xab xac > un_gros_fichier

créer un menu[modifier | modifier le wikicode]

gestion des erreurs[modifier | modifier le wikicode]

Détecter les erreurs de syntaxe sans exécution du script[modifier | modifier le wikicode]
 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 | modifier le wikicode]
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.
trap[modifier | modifier le wikicode]
  • 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 | modifier le wikicode]

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 | modifier le wikicode]
||[modifier | modifier le wikicode]

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 ||.
&&[modifier | modifier le wikicode]

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 | modifier le wikicode]

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 | modifier le wikicode]

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

package auto extractible par heresdocument[modifier | modifier le wikicode]

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

log[modifier | modifier le wikicode]

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 | modifier le wikicode]

PS2, PS3 et PS4[modifier | modifier le wikicode]

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 | modifier le wikicode]

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 | modifier le wikicode]

script[modifier | modifier le wikicode]

#!/bin/bash
####################################
# install et remplace un fichier V3
####################################
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"



DATE=$(date +%Y%m%d)
ESTAMPILLE="$(date +%Y%m%d_%H%M%S)_$$"
#FILE=DDC03.sql
#U=ugo
#DEST=/home/ugo/SERVER_TEST/QUALDATA/applis/DUPONT/sql/
#LIVRAISON_RACINE=/home/ugo/SERVER_TEST/QUALDATA/applis/delivery/DUPONT/
#LIVRAISON=${LIVRAISON_RACINE}/${DATE}/DATA/


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

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[modifier | modifier le wikicode]

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