Le Shell

Objectifs de certification

Linux Essentials

RHCSA EX200

  • 1.Comprendre et utiliser les outils essentiels
    • 1.1. Accéder à une invite shell et écrire des commandes avec la syntaxe appropriée
    • 1.7. Créer et éditer des fichiers texte
    • 1.11. Localiser, lire et utiliser la documentation système, notamment les manuels, informations et fichiers dans /usr/share/doc

LPIC 1

1. La ligne de commande

  • La ligne de commande est un moyen simple d'interagir avec un ordinateur.
  • Le shell interprète les commandes tapées au clavier.
  • Le prompt, ou l'invite de commande, qui se termine par un $pour un utilisateur standard ou un # pour l'administrateur du système (désigné root), indique que le shell attend les commandes de l'utilisateur.
  • Le shell est également un langage de programmation que l'on peut utiliser pour lancer des tâches automatiquement.
  • Les programmes shell sont appelés par des scripts.

1.1. Définitions

  • Le terminal = l'environnement d'entrée/sortie
  • La console = terminal physique

Shell =

  • "Interpréteur" de commande : lancer des commandes,
  • Environnement : confort de l'utilisateur, sécurité
  • Langage de programmation : fonctionnalités
  • Traitement du texte
  • Interface avec le noyau
  • ...

1.2. Types de shells

On obtient la liste des shells présents sur le système en affichant le fichier /etc/shells :

$ cat /etc/shells
  • sh : historique, standard, "portable"
  • csh/tcsh : C Shell
  • ksh : Korn Shell
  • bash : Bourn Again Shell Linux, le plus utilisé

1.3. Normes

1.4. Bourne Again SHell

  • Le projet GNU offre des outils pour l'administration de système de type UNIX qui sont libres et qui respectent les standards UNIX.

  • Bash est un Shell compatible avec sh qui incorpore des spécificités utiles du Korn Shell (ksh) et du C Shell (csh). Il est censé se conformer à la norme IEEE POSIX P1003.2/ISO 9945.2 Standards des Shell et Outils. Il offre des améliorations fonctionnelles par rapport à sh pour la programmation et l'utilisation interactive.

1.5. Le shell interactif

Quand on obtient un terminal avec une ligne de commande, on si situe dans un environnement encadré par un programme "shell" qui a créé un processus sur le système. Il permet notamment d'exécuter des commandes.

1.6. Commande echo

ECHO(1)                  Manuel de l'utilisateur Linux                 ECHO(1)

NOM
       echo - Afficher une ligne de texte

SYNOPSIS
       echo [-neE] [message ...]
       echo {--help,--version}

DESCRIPTION
       Cette page de manuel documente la version GNU de echo.

       La  plupart  des  shells ont une commande intégrée ayant le même nom et
       les mêmes fonctionnalités.

       echo écrit chaque message sur la sortie standard, avec une espace entre
       chacun d'eux, et un saut de ligne après le dernier.

La commande echo permet d’afficher du texte à l’écran :

[francois@c7li ~]$ echo "affiche ce texte"
affiche ce texte
[francois@c7li ~]$

On remarque le prompt composé de :

  • francois l’utilisateur connecté
  • @ séparateur
  • c7li nom de l’ordinateur
  • ~ "titld" qui indique le dossier utilisateur comme dossier courant
  • $ qui indique le type de connexion

Cette configuration de l'environnement est chargée sous forme de script au moment de la connexion de l'utilisateur.

1.7. Commande ls

LS(1)                    Manuel de l'utilisateur Linux                   LS(1)

NOM
       ls, dir, vdir - Afficher le contenu d'un répertoire

SYNOPSIS
       ls [options] [fichier...]
       dir [fichier...]
       vdir [fichier...]

       Options POSIX : [-CFRacdilqrtu1] [--]

       Options  GNU  (forme  courte) : [-1abcdfgiklmnopqrstuvwxABCDFGHLNQRSUX]
       [-w cols] [-T cols]  [-I  motif]  [--full-time]  [--show-control-chars]
       [--block-size=taille]      [--format={long,verbose,commas,across,verti‐
       cal,single-column}]                 [--sort={none,time,size,extension}]
       [--time={atime,access,use,ctime,status}] [--color[={none,auto,always}]]
       [--help] [--version] [--]

DESCRIPTION
       La commande  ls  affiche  tout  d'abord  l'ensemble  de  ses  arguments
       fichiers  autres  que  des  répertoires. Puis ls affiche l'ensemble des
       fichiers contenus dans chaque répertoire  indiqué.  Si  aucun  argument
       autre  qu'une  option  n'est  fourni,  l'argument  « . » (répertoire en
       cours) est pris par défaut.

2. Entrer des commandes dans l’invite

Pour entrer des commandes dans le shell, il faut :

  • une commande valide (dans le PATH ou précisée par un chemin)

  • suivie éventuellement d’une ou plusieurs options notées

    • par un “dash”, le tiret, “-” en notation abrégée
    • ou un double “dash”, double tiret, “--” en notation extensive,
  • des arguments,

  • et un retour chariot qui accepte la ligne entrée.

2.1. Syntaxe des commandes

Chaque commande dispose de sa propre syntaxe :

  • sans options :
$ ls
  • avec une option :
$ ls -l
  • avec plusieurs options :
$ ls -l -a -h -t
$ ls -laht

2.2. Options et arguments

  • Options double dash :
$ ls --all
$ ls --help
  • Donner un argument :
$ ls -l /home
  • Donner plusieurs arguments :
$ ls -l /home /var

2.3. Commandes hors du PATH

A titre d’exemple la commande “ls” s’exécute car elle est située dans un des chemins indiqués dans la variable d'environnment PATH. On peut afficher ces chemins par défaut pour les fichiers exécutables via cette commande :

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

On peut exécuter le logiciel directement à partir de l'emplacement absolu :

$ /bin/ls

On peut exécuter le logiciel directement à partir de l'emplacement relatif :

$ cd /bin
$ ./ls -l ls

2.4. Entrer des commandes

  • On peut entrer des commandes sur plusieurs lignes :
$ ls /var
$ ls /home
$ ls /usr
  • Ou sur une seule ligne on peut séparer les commandes par un “semicolon”, point-virgule, “;” :
$ ls /var; ls /home; ls /usr

2.5. Séquences de commandes

  • Si les arguments diffèrent pour une même commande, on peut créer une boucle et profiter de variables :
$ for arg in /home /var /usr
> do
> echo "visualisation : " $arg
> ls -a $arg
> done
  • ou encore en une seule ligne
$ for arg in /home /usr /var; do ls -la $arg; done

2.6. Exécutions conditionnelles

&& et || sont des séparateurs de commandes conditionnels.

Opérateur &&

$ commande1 && commande2

exécute commande2 si commande1 est exécuté sans erreur. Par exemple sous Debian/Ubuntu :

# apt-get update && apt-get -y upgrade

Par exemple sous Centos :

# yum -y install epel-release && yum update

Opérateur ||

 $ commande1 || commande2

exécute commande2 si commande1 est exécuté avec erreur.

Par exemple :

# apt-get update || yum -y update

2.7. Historique des commandes

Pour voir la liste des commandes que vous avez validées, vous pouvez utiliser la commande interne de bash history :

$ history
  • La commande history liste les commandes en cache ainsi que celles sauvées dans ~/.bash_history. Lorsque que l'utilisateur quitte le shell, les commandes en cache sont inscrites dans ce fichier.
  • Vous pouvez récupérer les commandes tapées en utilisant les flèches directionnelles (haut et bas) de votre clavier.
  • history -c efface l'historique de la session courante.

Historique : raccourcis emacs

  • Vous pouvez également utiliser des raccourcis emacs qui vous permettent d'exécuter et même de modifier ces lignes. Par exemple Ctrl-p/Ctrl-n pour ligne précédente/ligne suivante ou Ctrl-a / Ctrl-e pour début/fin de ligne. Pour en savoir plus sur Emacs : http://www.tuteurs.ens.fr/unix/editeurs/emacs.html

Historique : raccourcis bang

Par exemple :

$ ls -a
$ ^ls^ps
ps -a
$ !!
$ history
$ !2

2.8. Tabulation

  • Selon la distribution la touche de tabulation offre des possibilités d’auto-complétion.

2.9. Substitution de commandes

  • La commande uname permet de connaître la version du noyau courant. Comment la substituer ?
$ uname -a
Linux c7li 3.10.0-327.4.5.el7.x86_64 #1 SMP Mon Jan 25 22:07:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ system=$(uname -a)
$ echo $system
Linux c7li 3.10.0-327.4.5.el7.x86_64 #1 SMP Mon Jan 25 22:07:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

2.10. Alias

  • Un alias est une autre manière de substituer des commandes.
  • Liste des alias :
$ alias
...
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
  • Créer un alias :
$ alias zozo='ls -a'
$ alias
$ zozo

3. Filtres sur les fichiers (globbing)

3.1. Méta-caractères

  • Les méta-caractères ont un sens spécial pour le shell. Ils sont la plupart du temps utilisés comme jokers, pour correspondre à plusieurs noms de fichiers ou de dossiers en utilisant un minimum de lettres.
  • Les caractères d'entrée (<), de sortie (>) et le tube (|) sont également des caractères spéciaux ainsi que le dollar ($) utilisé pour les variables. Notez que ces caractères sont rarement utilisés pour nommer des fichiers standards.

3.2. Caractères génériques ou jokers

Masque générique *

Le caractère * remplace n'importe quel nombre de caractères :

$ ls  /usr/bin/b*

Liste tous les programmes commençant par "b".

Masque de caractère ?

Le caractère ? remplace n'importe quel caractère unique :

$ ls  /usr/bin/?b*

Liste tous les programmes ayant un "b" pour seconde lettre.

Plage de valeurs [ ]

[ ] est utilisé pour définir une plage de valeurs :

$ ls /usr/bin/linux[0-9][0-9]

liste tous les fichiers commençant par "linux" suivis de deux chiffres.

$ ls /usr/bin/[!Aa-Yy]*

liste tous les fichiers qui ne commencent pas par un "a" ni par un "A" jusqu’à "y"/"Y".

Filtre {chaîne1,chaîne2}

{chaîne1,chaîne2} même si ce n'est pas simplement un joker de nom de fichiers, on peut l'utiliser pour filtrer des noms de fichiers :

ls  index.{htm,html}

4. Premier script shell

4.1. Pourquoi écrire un script shell ?

  • Simplifier une procédure complexe
  • Manipuler des scripts Init
  • Déploiement logiciel : installateur de binaire, avec compilation, avec dépôts de paquetages
  • Supervision de parc, Exploitation de journaux, Tâches de maintenances périodiques
  • Configuration, gestion, maintenance, surveillance d'environnements virtualisés
  • Gestion spécifique à la production :
    • Bases de données
    • Services Web
    • Services d'infra
    • Services de traitement (batch)
    • ...

4.2. Editeur de texte

Un bon éditeur de texte est indispensable.

On pourra changer l'éditeur par défaut sous Debian/Ubuntu avec la commande :

sudo update-alternatives --config editor
  • vi/vim : $ vimtutor
    • Trois modes : commandes, édition, dernière ligne
    • Numérotation des lignes : :set nu
    • Début du fichier : gg
    • Fin du fichier : G
    • Ligne 25 : 25G ou :25
    • Quitter sans sauver : :q!
    • Sauver : :w
    • Quitter et Sauver: :x ou Shift ZZ

4.3. Exécution d'un script

Invocation de l’interpréteur

  • Créez un premier script nommé monscript.sh avec nano ou vi :
echo "ceci est un mon premier script"
  • Invoquez ce script monscript.sh avec sh :
$ sh monscript.sh
  • Renommez monscript.sh en monscript :
$ mv monscript.sh monscript
  • Ajoutez une commande à monscript :
$ echo "echo `ceci est ma seconde ligne`" >> monscript
  • Invoquez ce script monscript avec sh, l'extension qui dénomme le script n'a aucune portée pour le shell :
$ sh monscript

Appels directs

Objectif : le script devrait rester accessible directement dans la ligne de commande :

  • Par exemple, en plaçant le script dans un chemin du PATH :
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
  • et dans
~/bin
  • En modifiant la variable PATH en ajoutant l'endroit du fichier soit l'emplacement local courant. Avec cette méthode, tous scripts à exécuter à partir l'endroit courant peut être appelé.
$PATH:.
  • Appel depuis son emplacement original :
./monscript.sh
  • Il aussi nécessaire que le fichier soit exécutable :
chmod u+x monscript.sh

NOTE

Le Shebang indique au système l'interpréteur à utiliser pour lancer les commandes : #!/bin/sh ou #!/bin/bash. Si l'interpréteur DE COMMANDES n'est pas déclaré, le shell courant prend en charge les commandes du script.

4.4. Exercices

1. – Prise en main du système

  • Lister les shells du système
  • Choisir un éditeur de texte et manipuler un éditeur de texte

2. – Utilité de la variable PATH

Effacer le contenu de la variable PATH :

$ $PATH=

Quel est l'effet produit ? Comment y remédier ?

3. – Répertoire courant dans le PATH

Quelle est l'utilité d'ajouter le répertoire . (point) à la fin de votre variable PATH de cette manière :

$ PATH=$PATH:.

4. – Obtenir la liste des variables d'environnment

$ env

5. - Afficher la date dans d'autres langues

$ echo $LANG
fr_BE.UTF-8
$ date
dim fév 21 06:05:03 CET 2016
$ LANG=en_US.UTF-8
$ date
Sun Feb 21 06:05:28 CET 2016
$ LANG=fr_BE.UTF-8
$ date
dim fév 21 06:05:51 CET 2016

5. Langue (locales) et clavier

Sous Centos 7

5.1. Définition de la langue

  • Statut :
# localectl status
   System Locale: LANG=fr_BE.UTF-8
       VC Keymap: be-oss
      X11 Layout: be
     X11 Variant: oss
  • Valeur possibles :
# localectl list-locales | grep fr_
fr_BE
fr_BE.iso88591
fr_BE.iso885915@euro
fr_BE.utf8
fr_BE@euro
fr_CA
fr_CA.iso88591
fr_CA.utf8
fr_CH
fr_CH.iso88591
fr_CH.utf8
fr_FR
fr_FR.iso88591
fr_FR.iso885915@euro
fr_FR.utf8
fr_FR@euro
fr_LU
fr_LU.iso88591
fr_LU.iso885915@euro
fr_LU.utf8
fr_LU@euro
  • Modification :
# localectl set-locale LANG=fr_FR.utf8
# localectl status
   System Locale: LANG=fr_FR.utf8
       VC Keymap: be-oss
      X11 Layout: be
     X11 Variant: oss

Il faudra certainement sortir de la session pour subir les effets de cette configuration.

5.2. Définition du clavier

Sous Centos 7 :

  • Liste :
localectl list-keymaps | grep -E 'fr|be'
  • Définition du clavier :
# localectl set-keymap fr
# localectl set-x11-keymap fr
# localectl status
   System Locale: LANG=fr_FR.utf8
       VC Keymap: fr
      X11 Layout: fr

Sous Debian/Ubuntu :

  • En console texte :
sudo loadkeys fr
Loading fr
sudo loadkeys be
Loading be
  • En console graphique :
setxkbmap fr
setxkbmap fr
  • De manière permanente :
sudo dpkg-reconfigure keyboard-configuration

6. Aide

6.1. Commandes less et more

  • less est une commande Unix permettant de visualiser un fichier texte page par page (sans le modifier). Sa fonction est similaire à la commande more, mais permet en plus de revenir en arrière ou de rechercher une chaîne. Contrairement à vi (qui permet aussi de visualiser des fichiers), less n'a pas besoin de charger entièrement le fichier en mémoire et s'ouvre donc très rapidement même pour consulter de gros fichiers.
  • Raccourcis dans less :
    • h ou help pour l’aide
    • / suivi d’une occurence pour effectuer une recherche
    • Barre d’espace : pour avancer d’une page
  • Exemples :
$ more /var/log/dmesg

6.2. Commande man

  • man est une commande Unix. Elle permet de visionner le manuel d'une commande du shell. Elle utilise la commande less. Les raccourcis de navigation sont donc identiques.
  • Chaque page de manuel fait partie d’une section :
    1. Commandes utilisateur
    2. Appels système
    3. Fonctions de bibliothèque
    4. Fichiers spéciaux
    5. Formats de fichier
    6. Jeux
    7. Divers
    8. Administration système
    9. Interface du noyau Linux
  • Chaque section possède une page d'introduction qui présente la section, disponible en tapant man <section> intro.
  • Pour installer les pages de manuel en français : yum install man-pages-fr.

6.3. Appel d'une page manuel

  • Pour appeler une page de manuel, tout simplement :

      $ man [-s<section>] <nom_de_commande>
    
  • Par exemple :

      $ man man
      $ man ls
      $ man 5 passwd
    

6.4. Recherche d’une page manuel

  • Une page de manuel peut avoir le même nom et faire partie d’une section différente (la portée de la page est différente). Par exemple :

      $ man -f passwd
      passwd (1)          - Modifier le mot de passe d’un utilisateur
      passwd (5)           - fichier des mots de passe
      passwd (1ssl)        - compute password hashes
    
  • L’option man -f passwd permet d’effectuer une recherche sur le nom des pages man. La commande whatis -r passwd aurait eu le même effet.

6.5. Contenu d’une page manuel man -fou whatis

  • En en-tête de la page man on trouve le nom de la commande suivie d’un numéro entre parenthèses. Il s’agit du numéro de section.
  • Une page est composée de plusieurs sections (au sens interne de la page) :
    • NOM, SYNOPSIS, CONFIGURATION, DESCRIPTION, OPTIONS, CODE DE RETOUR, VALEUR RENVOYÉE, ERREURS, ENVIRONNEMENT, FICHIERS, VERSIONS, CONFORMITÉ, NOTES, BOGUES, EXEMPLE, AUTEURS et VOIR AUSSI.

6.6. Contenu d’une page manuel

  • Le SYNOPSIS indique brièvement l'interface de la commande ou de la fonction. Pour les commandes, ce paragraphe montre sa syntaxe et ses arguments. Les caractères gras marquent le texte invariable et l'italique indique les arguments remplaçables. Les crochets encadrent les arguments optionnels, les barres verticales (caractère pipe) séparent les alternatives, et les ellipses ... signalent les répétitions.
  • La DESCRIPTION fournit une explication sur ce que la commande, la fonction ou le format représente. Décrit les interactions avec les fichiers et l'entrée standard, ou ce qui est produit sur la sortie standard ou d'erreur. Ne contient pas les détails d'implémentation internes, sauf s'ils sont critique pour comprendre l'interface. Décrit le cas principal, pour les détails sur les options, on utilise le paragraphe OPTIONS.

6.7. Se déplacer dans une page manuel

  • G pour arriver à la fin du document
  • gg pour revenir au début du document
  • ...

6.8. Commandes man -k ou apropos

$ man -k password
  • Recherche la description courte et le nom des pages de manuel comportant le mot-clé, utilisé comme une expression rationnelle, puis affiche tout ce qui a été trouvé.

  • La commande apropos donne l’équivalent :

$ apropos password

Man utilise une base donnée pour consulter les descriptions des pages. En cas de pages ou de logiciels ajoutés, il est indiqué de mettre à jour la base de données mandb:

# mandb

6.9. Commande info

  • info a d'abord été fourni avec le paquet Texinfo de GNU en alternative plus exhaustive et documentée que les pages de manuel UNIX et a été porté par la suite sur d'autres systèmes de type Unix.
$ info info

6.10. Autres ressources

  • option : -h ou --help d'une commande
$ man --help
  • Les fichiers README des sources,
  • dans le dossier /usr/share/doc.

6.11. Manuels et wikis des distributions

6.12. Cours en ligne

6.13. Sites divers

7. Prendre connaissance de la version de la distribution

Communément le fichier /etc/os-releasedonnera cette information concernant la version de la distribution.

root@debian8:~# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

En RHEL7/Centos7, on trouve d'autres fichiers.

[root@centos7 ~]# ls /etc/*-rel*
/etc/centos-release          /etc/os-release       /etc/system-release
/etc/centos-release-upstream  /etc/redhat-release  /etc/system-release-cpe
[root@rhel7 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)

En Debian / Ubuntu.

On trouve le fichiers /etc/debian_version

root@debian8:~# cat /etc/debian_version
8.7

La commande lsb_release -a permet d'obtenir cette information .

root@debian7:~# lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 7.11 (wheezy)
Release:    7.11
Codename:    wheezy
root@debian8:~# lsb_release -a
No LSB modules are available.
Distributor ID:    Debian
Description:    Debian GNU/Linux 8.7 (jessie)
Release:    8.7
Codename:    jessie
root@kali:~# lsb_release -a
No LSB modules are available.
Distributor ID:    Kali
Description:    Kali GNU/Linux 1.1.0
Release:    1.1.0
Codename:    moto
user@ubuntu1604:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:    16.04
Codename:    xenial
msfadmin@metasploitable:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 8.04
Release:    8.04
Codename:    hardy

results matching ""

    No results matching ""