Bash (Bourne-again Shell)

Guillaume Chanel, Dimitri Racordon

Automne

Qu'est-ce qu'un Shell ?

Interface texte

Pourquoi utiliser une interface texte en 2017 ?

Le Shell

  • Interface textuelle, ligne de commande
  • presque toutes les fonctionnalités d'Unix sont accessibles
  • Petits outils simple que l'on peut composer
  • Possibilité d'écrire des scripts

Terminal & Pseudo-Terminal

image
terminal
image
VT220
image
Pseudo-terminal

Autre interfaces en ligne de commande

Windows

image
CMD
image
PowerShell

Linux / Mac / UNIX

image
sh, bash, csh, zsh, fish, etc.

Préparation de l'environement de travail

Nous allons utiliser une machine virtuelle

  • Rendez vous avec un navigateur à l'adresse:
  • http://vdi.unige.ch
  • Identifiez vous
  • Choisissez la machine CUI-LINUX
  • Ignorez les possibles avertissements (mauvaise pratiques)

  • Ouvrez un pseudo-terminal (si il n'est pas déjà ouvert) Gnome terminal icon
  • Qu'observez-vous ?

Tapez la commande suivante:

$ git clone https://gitlab.unige.ch/outils-info/bash.git

Manuel

Accèder au manuel (man)

  • Un manuel très complet est présent sur les systèmes Unix
  • Commande: man [section] <sujet>
  • Pour sortir du manuel, appuyer sur la touche q
  • Pour chercher le texte "montexte", taper /montexte (valider par entrer)
Exemples
$ man pwd
$ man 3 getcwd
$ man man

Sections du manuel sur GNU/Linux

1 Commandes générales
2 Appels systèmes
3 Librairie C
4 Fichiers spéciaux
5 Formats de fichiers et conventions
6 Jeux
7 Divers
8 Commandes d'administration et démons

RTFM !

Se localiser et se déplacer

pwd, ls et cd

  • Regarder dans quel dossier vous êtes
  • Aller dans le dossier /tmp
  • Vérifiez que vous êtes bien dans le dossier /tmp
  • Lister le contenu du dossier
  • Revenez dans votre dossier initial (i.e. dossier home)
  • Allez dans le dossier bash (celui créer par la commande git)
  • Lister le contenu du dossier /tmp depuis le dossier bash

Chemin d'accès

Les conventions suivantes (POSIX) s'appliquent:

  • La racine est représentée par /
  • Les répertoires sont séparés par /
  • Tout chemin qui ne commence par / est relatif au répertoire courant.
  • Le répertoire courant est symbolisé par .
  • Le réperoire parent est symbolisé par ..
  • Le répertoire home est symbolisé par ~

Chemin d'accès - exercices

  • Quel est le résultat des commandes ci-dessous ?
  • $ cd ~/././././bash
    $ ls ~/./bash/../bash/../.
  • Comment lister le contenu de votre dossier home depuis n'importe quel dossier (a tester)?

Nommer un ensemble de fichiers

Les noms de fichiers suivent les règles suivantes:

  • Maximum 255 caractères
  • Tous les caractères sont autorisés, mais sont déconseillés:
    • espaces
    • . * ? / !
  • Si le nom du fichier commence par un point, il est caché.

On peu référencer plusieurs fichiers en utilisant les symboles suivants:

*remplace zéro, un ou plusieurs caractères
? un seul caractère

Fichiers cachés et selection - Exercices

  • Avec le manuel trouvez l'option de ls qui permet de lister les fichiers cachés
  • Utiliser la pour lister les fichiers cachés de votre dossier home

  • Rendez vous dans le dossier bash
  • Listez dans le dossier images toutes les images au format JPEG
  • Lister toutes les images d'oiseaux
  • Lister toutes les images d'oiseaux au format PNG
  • Lister les images de chat portant un numéro entre 90 et 99 (inclus)

Les utilisateurs, les groupes et les droits

Informations sur les fichiers/dossiers

  • Trouvez dans le manuel ce que fait la command ls -lh
  • Observons ensemble le résultat...

Utilisateurs

  • Chaque utilisateur se loge sur une machine Unix avec une identité (user)
  • Un utilisateur est décrit par:
    • Nom d'utilisateur
    • Mot de passe
    • Identifiant numérique (userid)
    • Groupe par défaut
    • Répertoire home
    • Description
    • Shell par défaut

Super-utilisateur (root)

  • Il existe un super-utilisateur: root
  • Son userid est le 0
  • Il a le droit de tout faire.

Accès au mot de passe root: faille de sécurité majeure.

Groupes

Les utilisateurs peuvent faire partie d'un ou plusieurs groupes:

  • Groupe par défaut
  • Autres groupes

Ceci permet par exemple de:

  • restreindre l'accès à un répertoire à un seul groupe
  • donner accès à un périphérique à un seul groupe

Utilisateurs et groupes - exercices

  • A l'aide de la commande whoami obtenez votre login
  • A l'aide de la commande groups obtenez vos groupes
  • Retrouvez ces information avec la commande id

La commande cat permet d'afficher un ou plusieurs fichiers à l'écran (concatenation, voir manuel):

  • utilisez cat sur le fichier /etc/passwd et retourvez vos informations utilisateur
  • utilisez cat sur le fichier /etc/group et retrouvez les informations de vos groupes

Permissions

file permissions

Permissions - effets

Fichier:

ReadLire le contenu du fichier
WriteModifer le contenu d'un fichier
Warning en cas de suppression
eXecuteExécuter le fichier (exécutable binaire ou script)

Répertoire:

ReadLister les noms des fichiers inclus (mais pas les métadonnées)
WriteCréer, renommer ou détruire les fichiers inclus
eXecute"Ouvrir" le répertoire, voir les métadonnées, accèder au contenu des fichiers (mais pas aux noms), exécuter les fichiers exécutables.

Permissions - octal et chmod (3)

La commande chmod permet de changer les droits des fichiers:

$ chmod 754 monficher.c

Permissions - exercices

  • regarder le contenu du fichier bird00.jpg
  • retirer les droits de lecture utilisateur du ficher images/bird00.jpg
  • essayer de regarder le contenu du fichier bird00.jpg
  • retirer les droits d'écriture utilisateur du ficher images/bird00.jpg
  • Vérifier les changements de droit effectués
  • Retirer les droit d'execution du dossier images
  • Lister le contenu du dossier images avec ls -l
  • Redonner les droits d'exécution au dossier

Créer et supprimer les fichiers/dossiers

Création et déplacement

touch fileCrée un fichier vide si le fichier n'existe pas, sinon met à jour sa date de modification
mkdir folderCrée le dossier spécifié
mv source [sources] destDéplace les sources vers la destination si la destination est un dossier, sinon renomme le fichier source en dest (possible changement de dossier)
cp source [sources] destCopie les sources vers la destination (la destination peut être un fichier ou un dossier)

Création et déplacements - exercices

  • créez un dossier backup
  • copiez l'image images/bird01.jpg vers backup/mybird.jpg
  • essaye de copier l'image images/bird00.jpg
  • copie toutes les images de chien vers backup
  • créez un fichier image vide dans backup/monimage.png
  • renommer ce fichier backup/myimage.jpg
  • déplacez en une commande les dix premières et les dix dernières images chat vers le dossier backup
  • Pour ceux tavaillant sur les machines virtuelles: déplacer le dossier bash dans le dossier unige (le dossier unige est dans votre dossier home)

Suppression

rm fichierSupprime le fichier indiqué
rmdir dossierSupprime le dossier indiqué

Suppression - exercices

  • tentez de supprimer le dossier backup, pourquoi n'est-ce pas possible?
  • supprimez le fichier backup/bird01.jpg
  • supprimez tout le contenu du dossier backup en une commande
  • supprimez le dossier backup

  • supprimer le fichier images/bird00.jpg
  • que ce passe-t-il, pourquoi ? Ne PAS supprimer le fichier
  • ce fichier est donc supprimable, comment faire pour qu'il ne le soit plus ? Testez la solution, puis remmettez les droits à ceux d'origine

  • copiez le dossier images vers images-backup, que ce passe-t-il ? Que veux dire l'option proposée ?
  • effectuez la copie en utilisant l'option adéquate
  • en regardant le manuel de la commande rm, supprimez le dossier images_backup et son contenu en une commande

Le Cauchemar

$ rm -rf ~/*.txt
$ rm -rf ~/* .txt
image

Editer un fichier sur une interface texte

Plusieurs éditeur shell sont disponibles, on peut mentionner:

nanoEditeur léger, le plus facile a appréhender, les raccoucis clavier sont indiqués en bas
viEditeur historique, forte courbe d'apprentissage
vimNouvelle version de vi avec de nombreux plugins disponibles
emacsEditeur historique, forte courbe d'apprentissage, plus qu'un éditeur, il fait même le café

Editer un fichier

  • Créer un nouveaux fichier contenant la liste de vos courses en utilisant un éditeur
  • Vérifier le contenu du fichier en utilisant une commande déjà vue (autre que l'éditeur)

Redirection de flux et pipes

Flux de sortie

Le flux de sortie d'un programme est dirigée par défaut sur le terminal

La commande echo affiche les paramètres sur la sortie standard


$ echo ce cours est vraiment génial
ce cours est vraiment génial

$ echo "ce cours est vraiment génial"
ce cours est vraiment génial
                    

Ce flux peut être redirigé vers un fichier avec '>' :

$ echo ce cours est vraiment génial > /tmp/qualite_du_cours.txt

Flux de sortie - exercices

  • stockez la liste des fichiers du dossier images, ainsi que leurs attributs, dans un fichier nommé result
  • copiez un fichier vers le fichier result sans utiliser la commande cp
  • regarder le contenu de result

  • stockez la liste des fichiers du dossier images, ainsi que leurs attributs, dans un fichier nommé result
  • En utilisant '>>' au lieu de '>' copiez un fichier vers le fichier result sans utiliser la commande cp
  • regarder le contenu de result, que concluez vous ?

Flux d'entrée

Le flux d'entrée d'un programme est par défaut associé au clavier du terminal

La plus part des commandes nécéssitant une entrée en paramètre (par exemple un nom de fichier) utilisent l'entrée standard si le parmètre n'est pas donné


$ cat               # va attendre et répeter les entrées utilisateur
$ cat > livre.txt   # va concatener tous ce qui est tapé dans livre.txt -> UN NOUVEL EDITEUR :-) !
                    

Un fichier peut-être redirigé vers ce flux d'entrée en utilisant '<' :


$ cat < livre.txt   # l'entrée standard est le fichier livre
$ cat livre.txt     # le programme lit depuis le fichier livre, pas depuis l'entrée standard
$ # LE RESULTAT EST LE MEME
                        

Ctrl+D permet d'intérrompre le flux d'entrée

Flux d'erreur

Les message d'erreur des programme ne sont pas redirigées vers le flux de sortie mais vers un flux d'erreur

Par défaut le flux d'erreur est redirigé vers le terminal

Ce flux peut être redirigé vers un fichier avec '2>' :


$ ls non_existant_folder > /tmp/error.txt   # produit une erreur sur le terminal et un fichier vide
$ ls non_existant_folder 2> /tmp/error.txt  # produit un fichier contenant l'erreure
                    

Flux d'erreur - exercices

  • Utilisez la commande ls -R /tmp pour lister récursivement le contenu de /tmp
  • Utilisez la même commande mais redirigez la sortie standard et l'erreur standard vers deux fichiers différents
  • Observez ces fichiers

Flux Standard dans les langages de programmation

CC++JavaPythonRuby
Entréestdinstd::cinSystem.insys.stdin$stdin
Sortiestdputstd::coutSystem.outsys.stdout$stdout
Erreurstderrstd::cerrSystem.errsys.stderr$stderr

Exemple:

System.out.println( "Hello world!" );
$ java HelloWorld > hello.txt

Pipes ou tubes

Les pipes permettent de rediriger la sortie standard d'un programme vers l'entrée standard d'un autre

On utilise le symbole '|' entre deux commandes pour les utiliser:


$ less file            # affiche le contenu du fichier file avec scrolling
$ ls -R /tmp | less    # affiche la sortie de ls AVEC scrolling
                    

Combinés à la phylosophie UNIX, les pipes sont au coeur de la puissante des interfaces en ligne de commande

grep

grep fichier patterncherche et affiche les lignes du fichier qui contienne un pattern (e.g. un mot)
grep patterncherche le pattern dans l'entrée standard et affiche les lignes le contenant

Pipes et tubes - exercices

Quelques commandes utiles pour ces exercices (voir le manuel):

sort, uniq, grep, head, du


Utilisez la commande ls -l pour lister les fichiers de chats du dossier images mais sans ajouter d'arguments à ls


Le dossier mails contients des listes d'adresses. A partir de ces fichiers obtenez une seule liste des membres de l'université, triée par ordre alphabétique, sans doublons


Lister les 2 plus gros fichiers contenus dans le dossier mails

Processus

Qu'est-ce qu'un processus ?

  • Instance d'un programme en cours d'execution
  • Possède:
    • Son code en langage machine
    • Des Segments de mémoire (e.g. code, données, pile, etc.)
    • Des descripteurs de fichiers (e.g. les sortie et entrées standard)
    • Un propriétaire et un ensemble de permissions
    • Un état à un moment donné (e.g. le pointeur d'instruction)
  • Un coeur de processeur ne peut exécuter qu'un processus à la fois
  • Le système d'exploitation peut alterner l'execution de plusieurs processus (multi-tasking)

Processus UNIX

La commande ps permet de lister les processus


Sous unix, tous les processus ont:

  • un identifiant numérique (PID)
  • un processus parent (sauf le processus 0)

PS - exercices

  • Tapez la commande ps. Qu'est ce que les processus affichés ont en commun ?
  • Taper la commande ps -ef (voir man). Trouvez un processus qui est l'enfant d'un autre.
  • Vérifiez avec la commande pstree que c'est bien le cas. Quel est le PID du processus initial (le plus ancien parent de tous les processus)?
  • Trouvez un moyen de lister tous les processus vous appartenant.

Pour aller plus loin

  • les signaux
  • les jobs

Configurer BASH

Fichiers de configurations

Bash utilise plusieurs fichiers cachés à la racine du home pour obtenir une configuration des shells interactifs:

.bash_profile
.profile
uniquement pour les shells de login.
.bashrcuniquement pour les shells qui ne sont PAS de login
.bash_logoutexécuté lorsqu'on quitte un shell de login

Shell de login (.bash_profile)

  • Les shells de logins sont ceux pour lequels on doit s'authentifier:
    • Connexion à distance
    • Console virtuelle (tty)
  • Un terminal lancé depuis l'interface graphique n'est pas un shell de login
  • La pratique actuelle est d'appeler .bashrc depuis .bash_profile (automatique sous Mac).
.bash_profile
...
if [ -f ~/.bashrc]; then
    source ~/.bashrc
fi
...

Configuration du shell (.bashrc)

Habituellement, on utilise .bashrc pour définir les éléments suivants:

  • Variables d'environement
  • Alias
  • Permisissions par défaut
  • Comportement de Bash

Variables d'environement (export)

  • Variables accessibles aux processus
  • Tous les langages de programmation (sérieux) permettent d'y accéder.
  • Les processus enfants héritent des variables d'environement du parent.
  • On accède à leur valeur avec un $ (comme une variable normale).
  • On les définit avec export:
$ export VAR1="hello world"
$ echo $VAR1

Variables d'environement standard

$PATHchemin d'accès
$HOMErépertoire Home
$LANGLanguage par défaut
$DISPLAYServeur graphique
$PS1Prompt
$HOSTNAMENom de la machine

Le chemin par défaut

  • Le chemin d'accès indique où chercher les exécutables.
  • La variable d'environement $PATH définit le chemin par défaut.
  • Si l'éxécutable n'est pas dans le chemin par défaut, il faut préciser le chemin complet.
Exemple de chemin par défaut
/home/falcone/bin:/usr/lib/lightdm/lightdm:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games
Dans quel fichier ? .bashrc ou .bash_profile ? Tester et lancez plusieurs shells les uns dans les autres.
export PATH=~/bin:$PATH

Les alias

  • On peut définir des alias pour raccourcir l'invocation de commandes et de leurs arguments
  • On peut accéder à la commande originale en utilisant un backslash.
  • La commande alias seule permet d'afficher tous les alias.
Dans .bashrc
alias rm='rm -i'
alias ls='ls --color=auto'
alias ll='ls -lh'
alias la='ll -a'

Commandes utiles

awk '{print $n}'selectioner la n ème colonne.
basename <FILE>récupère le nom du fichier (sans le chemin)
dirname <FILE>récupère le chemin d'un fichier
sed s/JPEG/jpg/remplace 'JPEG' par 'jpeg'
uname -nretourne le nom de la machine
cut -c m-nextrait les caractères de m à n de chaque ligne
sed '1d'ommet la première ligne

Connexions a distance: SSH (Secure SHell)

Utilité

  • travail à distance comme si l'on étais sur un terminal de la machine
  • accéder à une machine qui ne possède pas de terminal
  • transférer des fichiers de manière sécurisée
  • connexion sécurisée pour des clients X distants (pour sur-simplifier: interface graphique distante)

Comment ca marche ?

  1. se connecter avec la commande suivante:
  2. $ ssh login@mon.server.com
  3. vérifier que le fingerprint du serveur correspond bien à celui attendu
  4. entrer son mot de passe
  5. on peut terminer la connexion en mettant fin au shell associé (exit ou Ctrl+D)

SSH - Exercices

  • connectez-vous au serveur cuilxa.unige.ch, dont le fingerprint est:
  • SHA256:FuonkDNdyZ6e5Xl5cYijKOIKEjjcvklc6nGzuAPetSc
  • une fois connecté, lister le contenu de votre dossier home sur ce serveur
  • editez un nouveau fichier dans un dossier nommé exo_ssh en utilisant un editeur de texte
  • terminer la connexion SSH

SCP

La commande SCP permet de copier des fichier d'un serveur vers la machine locale et vice-versa

$ scp login@mon.server.com:/path/to/my/file /path/to/destination
$ scp /path/to/my/file login@mon.server.com:/path/to/destination

Les formats de chemin habituels sont disponibles (*, ?, ~, etc.)

SCP - Exercices

  • copier le fichier du dossier exo_ssh localement
  • modifier ce fichier localement
  • copier le nouveau fichier dans le dossier distant exo_ssh

Authentification par clef publique

Principe

Vous avez a disposition une clef publique et une clef privée:

  • la clef privée VOUS identifie sur UNE MACHINE (une clef par utilisateur et par machine)
  • la clef publique est associée à la clef privée, et elle sera disbribuée à toute entité avec laquelle vous voulez communiquer
  • la clef publique est utilisée pour crypter un message qui vous est envoyée, seul la clef privée peu le décrypter

Il n'est donc pas grave de distribuer sa clef publique, en revanche la clef privée est personelle et ne doit jamais quitter la machine

Authentification par clef publique

Protocole

  • client: bonjour je me présente, voici ma clef publique
  • server: ok elle fait bien partie de la liste des clefs que je connais (il faudra donc fournir sa clef au serveur avant authentification)
  • server: voici un message encrypté par votre clef publique, serez-vous capable de le décrypter ?
  • client: oui je peu, j'ai la clef privée et voici le message décrypté
  • server: ok je confime que vous avez la bonne clef privée car le message est bien decrypté, vous êtes authentifié

Authentification par clef publique

Avantages

  • facilité de connexion et automatisation (on peu eventuellement se passer d'un mot de passe)
  • plus sécurisé qu'un mot de passe car aucune information secrète n'est transférée
  • utilisée de plus en plus fréquement par des services en ligne (e.g. github, gitlab, etc.)

Inconvenients

  • il est parfois difficile de gérer un grands nombre de clefs publiques/privées
  • demande quelques connaissances techniques

Authentification par clef publique

En pratique

Créer une paire de clef publique / privée (de préférence avec passphrase)

$ ssh-keygen

Copier la clef publique sur le serveur

$ ssh-copy-id login@cuilxa.unige.ch

Se connecter au serveur

$ ssh login@cuilxa.unige.ch
l