Ceci est une ancienne révision du document !


Oracle Solaris 10 : Shell programmation sous Ksh

Présentation

Type d'Action (Article L. 6313-1) : Action d'acquisition, d'entretien ou de perfectionnement des connaissances.
Objectif : Maîtriser les bases du scripting ksh sous Oracle Solaris 10.
Public : Utilisateurs et Administrateurs Windows™, Mac, Linux.
Pré requis : Avoir suivi la formation Oracle Solaris - Les Fondamentaux ou posséder les compétences équivalentes.
Méthode d'apprentissage : Alternance entre un scénario pédagogique clair et précis et des travaux pratiques basés sur des cas et exemples concrets.
Type d'apprentissage : Apprentissage Accéléré.
Validation des acquis : Évaluations à l'aide de tests auto-correctifs.
Modalités : 21 heures.
Moyens pédagogiques en salle : Support de cours en ligne téléchargeable au format PDF.
Ressources : Machine virtuelle Oracle Solaris 10.

Programme

  • La Ligne de Commande et les Outils de Manipulation des Fichiers Textes.
    • Le Shell,
      • Les Commandes Internes et Externes au shell,
      • Les alias,
      • Le Prompt,
      • Rappeler des Commandes,
      • Générer les fins de noms de fichiers,
      • Le shell interactif,
      • Affichage des variables du shell,
        • Les variables principales,
        • Régionalisation et Internationalisation,
      • Options du shell ksh,
    • Les Scripts Shell,
      • Exécution,
      • Les variables spéciales,
      • La commande read,
      • Code de retour,
      • La variable IFS,
      • La commande test,
      • La commande [[ expression ]],
      • Opérateurs du shell,
      • L'arithmétique,
        • La commande expr,
        • La commande let,
      • Structures de contrôle,
      • Boucles,
      • Scripts de Démarrage,
    • Expressions Régulières,
      • Expressions régulières basiques,
      • Expressions régulières étendues,
    • Outils de Manipulation de Fichiers Texte,
      • La commande grep,
      • La commande egrep,
      • La commande fgrep,
      • La commande sed,
      • La commande awk,
      • La commande tr,
      • La commande paste,
      • La commande cut,
      • La commande uniq,
      • La commande split,
      • La commande diff,
      • La commande cmp,
      • La commande patch,
      • La commande strings,
      • La commande comm,
      • La commande head,
      • La commande tail,
    • Validation des acquis,
    • Commandes : type, alias, unalias, chsh, history, wc, tee, set, vi, script, read, test, expr, let, if, case, for, while, grep, egrep, fgrep, sed, awk, tr, paste, cut, split, diff, cmp, uniq, patch, strings, comm, od, head, tail.
  • LAB #1.
    • Automatiser la Gestion des Utilisateurs et Groupes,
      • Fonction cree_user,
      • Fonction modif_user,
      • Fonction affiche_user,
      • Fonction cree_liste_user,
      • Fonction cree_group,
      • Fonction modif_group,
      • Fonction delete_group,
      • Fonction affiche_group,
      • Menu des choix.
  • LAB #2.
    • Automatiser la Gestion des Sauvegardes,
      • Fonction archive_rep,
      • Fonction restaure_rep,
      • Fonction affiche_archive,
      • Fonction compress_archive,
      • Fonction decompress_archive,
      • Gestion des erreurs.

Extrait de Cours

Solaris 10 - La Ligne de Commande

Le Shell

Un shell est un interpréteur de commandes ou en anglais un Command Line Interpreter (C.L.I). Il est utilisé comme interface pour donner des instructions ou commandes au système d'exploitation.

Le mot shell est générique. Il existe de nombreux shells dans le monde Unix, par exemple :

Shell Nom Date de Sortie Inventeur Commande Commentaires
tsh Thompson Shell 1971 Ken Thompson sh Le premier shell
sh Bourne Shell 1977 Stephen Bourne sh Le shell commun à tous les Unix. Sous Solaris : /usr/bin/sh
csh C-Shell 1978 Bill Joy csh Le shell BSD. Sous Solaris : /usr/bin/csh
tcsh Tenex C-Shell 1979 Ken Greer tcsh Un dérivé du shell csh. Sous Solaris : /usr/bin/tcsh
ksh Korn Shell 1980 David Korn ksh Uniquement libre depuis 2005. Sous Solaris : /usr/bin/ksh
bash Bourne Again Shell 1987 Brian Fox bash Le shell par défaut de Linux et de MacOS X. Sous Solaris : /usr/bin/bash
zsh Z Shell 1990 Paul Falstad zsh Zsh est plutôt orienté pour l'interactivité avec l'utilisateur.

Cette unité concerne l'utilisation du shell ksh sous Unix. Cependant, il peut aussi être utile aux utilisateurs de bash sous UNIX car les commandes sont pratiquement identiques.

Le shell /bin/ksh permet de:

  • Rappeler des commandes
  • Générer la fin de noms de fichiers
  • Utiliser des alias
  • Utiliser les variables tableaux
  • Utiliser les variables numériques et l'arithmétique du langage C
  • Gérer des chaines de caractères
  • Utiliser les fonctions

Une commande commence toujours par un mot clef. Ce mot clef est interpréter par le shell selon le type de commande et dans l'ordre qui suit :

  1. Les alias
  2. Les fonctions
  3. Les commandes internes au shell
  4. Les commandes externes au shell

Le shell par défaut de root sous Solaris est /bin/sh.

Le shell des utilisateurs est défini par root dans le fichier /etc/passwd :

# cat /etc/passwd
root:x:0:0:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
smmsp:x:25:25:SendMail Message Submission Program:/:
listen:x:37:4:Network Admin:/usr/net/nls:
gdm:x:50:50:GDM Reserved UID:/:
webservd:x:80:80:WebServer Reserved UID:/:
postgres:x:90:90:PostgreSQL Reserved UID:/:/usr/bin/pfksh
svctag:x:95:12:Service Tag UID:/:
nobody:x:60001:60001:NFS Anonymous Access User:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x NFS Anonymous Access User:/:
test:x:100:1:Test:/export/home/test:/bin/ksh

Ne modifiez jamais le shell de root dans le fichier /etc/passwd.

Devenez maintenant l'utilisateur test grâce à la commande su - :

# su - test
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
$

Vérifiez que le shell de l'utilisateur test soit bien ksh grâce à la consultation de la valeur de la variable système SHELL :

$ echo $SHELL
/bin/ksh

Il convient maintenant de modifier le shell de test en bash :

$ which bash
/usr/bin/bash

passez en tant que root grâce à la commande exit puis éditez le fichier /etc/passwd :

test:x:101:1:Test:/export/home/test:/usr/bin/bash

Ensuite connectez-vous de nouveau en tant que l'utilisateur test et utilisez la commande echo pour visualiser le contenu de la variable système SHELL :

# su - test
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
-bash-3.00$ echo $SHELL
/usr/bin/bash

Définissez de nouveau le CLI de l'utilisateur test en /bin/ksh avant de poursuivre.

Une commande tapée dans un CLI commence toujours par un mot clef. Ce mot clef est interprétée par le shell selon le type de commande et dans l'ordre qui suit :

  1. Les alias
  2. Les fonctions
  3. Les commandes internes au shell
  4. Les commandes externes au shell

La suite de ce cours concerne l'utilisation du shell ksh sous Solaris. Le shell ksh permet de:

  • Rappeler des commandes
  • Générer la fin de noms de fichiers
  • Utiliser des alias
  • Utiliser les variables tableaux
  • Utiliser les variables numériques et l'arithmétique du langage C
  • Gérer des chaînes de caractères
  • Utiliser les fonctions

Defenissez le shell courant de root en tant que /bin/ksh :

# /bin/ksh
#
Les Commandes Internes et Externes au shell

Les commandes internes au shell sont des commandes telles cd. Pour vérifier le type de commande, il faut utiliser la commande type en tant que root :

# type cd
cd est une commande prédéfinie du shell

Les commandes externes au shell sont des binaires exécutables ou des scripts, généralement situés dans /usr/sbin, /usr/bin, /usr/openwin/bin ou /usr/ucb :

# type ifconfig
ifconfig est /usr/sbin/ifconfig
Les Aliases

Les alias sont des noms permettant de désigner une commande ou une suite de commandes et ne sont spécifiques qu'au shell qui les a créés ainsi qu'à l'environnement de l'utilisateur :

# type stop
stop est un alias exporté pour kill -STOP

ou

# su - test
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
$ type ls
ls est un alias suivi pour /usr/bin/ls

Notez que dans ce cas l'alias ls est en effet un alias qui utilise la commande ls elle-même.

La liste des alias définis peut être visualisée en utilisant la commande alias :

$ alias
autoload='typeset -fu'
command='command '
functions='typeset -f'
history='fc -l'
integer='typeset -i'
local=typeset
ls=/usr/bin/ls
nohup='nohup '
r='fc -e -'
stop='kill -STOP'
suspend='kill -STOP $$'

Un alias se définit en utilisant de nouveau la commande alias :

$ alias dir='ls -l'
$ alias
autoload='typeset -fu'
command='command '
dir='ls -l'
functions='typeset -f'
history='fc -l'
integer='typeset -i'
local=typeset
ls=/usr/bin/ls
nohup='nohup '
r='fc -e -'
stop='kill -STOP'
suspend='kill -STOP $$'
$ dir
total 6
-rw-r--r--   1 test     other        136 août 15 10:19 local.cshrc
-rw-r--r--   1 test     other        157 août 15 10:19 local.login
-rw-r--r--   1 test     other        174 août 15 10:19 local.profile

Notez que la liste des alias contient, sans distinction, les alias définis dans les fichiers de démarrage du système ainsi que l'alias dir créé par test qui n'est que disponible à test dans le terminal courant.

Pour supprimer un alias, il convient d'utiliser la commande unalias :

$ unalias dir
$ alias
autoload='typeset -fu'
cat=/usr/bin/cat
command='command '
functions='typeset -f'
history='fc -l'
integer='typeset -i'
local=typeset
ls=/usr/bin/ls
nohup='nohup '
r='fc -e -'
stop='kill -STOP'
suspend='kill -STOP $$'

Pour forcer l'exécution d'une commande et non l'alias il faut faire précéder la commande par le caractère \ :

$ alias ls='ls -l'
$ ls
total 6
-rw-r--r--   1 test     other        136 août 15 10:19 local.cshrc
-rw-r--r--   1 test     other        157 août 15 10:19 local.login
-rw-r--r--   1 test     other        174 août 15 10:19 local.profile
$ \ls
local.cshrc    local.login    local.profile

Dans l'exemple ci-dessus, la première commande étant un alias, la sortie est celle de la commande ls -l tandis que la deuxième est celle de la commande ls simple.

Le Prompt

Le prompt d'un utilisateur dépend de son statut :

  • $ pour un utilisateur normal
  • # pour root
Rappeler des Commandes

Le shell ksh permet le rappel des dernières commandes saisies. Afin de connaître la liste des commandes mémorisées, utilisez la commande history en tant que l'utilisateur test :

$ history
5       exit
6       type ls
7       alias
8       alias dir='ls -l'
9       alias
10      cat /etc/shells
11      dir
12      \dir
13      unalias dir
14      alias
15      alias ls='ls -l'
16      ls
17      \ls
18      which chsh
19      ls -a
20      history

Rappelez-vous que la commande history est un alias :

$ alias
...
history='fc -l'
...

En réalité donc c'est la commande fc qui est appelée.

L'historique des commandes est en mode emacs par défaut. Afin de pouvoir rappeler les dernières commandes saisies, il convient de passer en mode emacs :

$ set -o emacs

Le rappel de la dernière commande se fait en utilisant les touches [CTRL]-[P] et le rappel de la commande suivante se fait en utilisant les touches [CTRL]-[N] :

Caractère de Contrôle Définition
[CTRL]-[P] Rappelle la commande précédente
[CTRL]-[N] Rappelle la commande suivante

Le paramétrage de la fonction du rappel des commandes est fait en définissant des variables système.

Afin de faciliter la définition de ces variables, créez le fichier /etc/kshrc en tant que root :

#
# This file is the common Environment setup for Korn Shell
#
HISTSIZE=256
HISTFILE=$HOME/.sh_history
export HISTFILE HISTSIZE
set -o emacs

Vous noterez que dans ce fichier, la valeur de HISTSIZE est de 256. Ceci implique que les dernières 256 commandes sont mémorisées.

Devenez maintenant l'utilisateur standard test :

# su - test
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
$

Les commandes mémorisées sont stockées dans le fichier $HOME/.sh_history ou $HOME indique le répertoire personnel de l'utilisateur concerné :

$ cat $HOME/.sh_history
echo $SHELL
whereis bash
which bash
exit
exit
type ls
alias
alias dir='ls -l'
alias
cat /etc/shells
dir
\dir
unalias dir
alias
alias ls='ls -l'
ls
\ls
ls -a
history
alias
set -o emacs
exit
cat $HOME/.sh_history

La comparaison du contenu de ce fichier avec la sortie de la commande history démontre que les deux sont identiques, à part bien évidemment, la dernière commande saisie, soit history.

Vous pouvez rappeler une commande spécifique de l'historique en utilisant la commande fc -e - suivi du numéro de la commande à rappeler :

$ history
...
52      ls
53      pwd
54      vmstat
55      df
56      history
$ fc -e - 52
ls
local.cshrc    local.login    local.profile

Afin de faire appel à au fichier /etc/kshrc, éditez maintenant le fichier /etc/profile :

$ exit
# vi /etc/profile

en y ajoutant les lignes suivantes :

ENV=/etc/kshrc
export ENV

Vous obtiendrez une fenêtre similaire à celle-ci :

#ident  "@(#)profile    1.19    01/03/13 SMI"   /* SVr4.0 1.3   */

# The profile that all logins get before using their own .profile.

trap ""  2 3
export LOGNAME PATH

ENV=/etc/kshrc
export ENV

if [ "$TERM" = "" ]
then
        if /bin/i386
        then
                TERM=sun-color
        else
                TERM=sun
        fi
        export TERM
fi

#       Login and -su shells get /etc/profile services.
#       -rsh is given its environment in its .profile.

Connectez-vous de nouveau en tant que test :

# su - test
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005

Vérifiez que vous pouvez rappeler les dernières commandes dans votre console.


<html> <center> Copyright © 2004-2017 Hugh Norris.<br><br> <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”><img alt=“Licence Creative Commons” style=“border-width:0” src=“http://i.creativecommons.org/l/by-nc-nd/3.0/fr/88x31.png” /></a><br />Ce(tte) oeuvre est mise à disposition selon les termes de la <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”>Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France</a>. </center> </html>

Menu