Bash (Bourne-again Shell)

Guillaume Chanel, Damien Morard

Automne

Qu'est-ce qu'un Shell ?

Interface texte

Pourquoi utiliser une interface texte en ?

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'environnement de travail

Nous allons utiliser une machine virtuelle

  • Démarrez et loguer vous sur la machine virtuelle (student) installée en utilisant VirtualBox
  • Ou connectez vous sur https://vid.unige.ch

  • 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

  • Regardez dans quel dossier vous êtes
  • Allez dans le dossier /tmp
  • Vérifiez que vous êtes bien dans le dossier /tmp
  • Listez le contenu du dossier
  • Revenez dans votre dossier initial (i.e. dossier home)
  • Allez dans le dossier bash/ressources (celui créer par la commande git)
  • Listez 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 pas par / est relatif au répertoire courant.
  • Le répertoire courant est symbolisé par .
  • Le répertoire 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 (à 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 peut 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 sélection - Exercices

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

  • Rendez vous dans le dossier bash/ressources
  • Listez dans le dossier images toutes les images au format JPEG
  • Listez toutes les images d'oiseaux
  • Listez toutes les images d'oiseaux au format PNG
  • Listez 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 logue 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

  • regardez le contenu du fichier bird00.jpg
  • retirez les droits de lecture utilisateur du ficher images/bird00.jpg
  • essayez de regarder le contenu du fichier bird00.jpg
  • retirez les droits d'écriture utilisateur du ficher images/bird00.jpg
  • Vérifiez les changements de droit effectués
  • Retirez les droit d'execution du dossier images
  • Listez le contenu du dossier images avec ls -l
  • Redonnez 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
  • essayez de copier l'image images/bird00.jpg
  • copiez toutes les images de chien vers backup
  • créez un fichier image vide dans backup/monimage.png
  • renommez ce fichier backup/myimage.jpg
  • déplacez en une commande les images de chats portant les numéro [00-09] et [90-99] vers le dossier backup
  • Pour ceux travaillant sur les machines vdi: déplacez 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/mybird.jpg
  • supprimez tout le contenu du dossier backup en une commande
  • supprimez le dossier backup

  • supprimez le fichier images/bird00.jpg
  • que se 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 remettez les droits à ceux d'origine

  • copiez le dossier images vers images-backup, que se passe-t-il ? Que veut 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 à appréhender, les raccourcis 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éez un nouveau fichier contenant la liste de vos courses en utilisant un éditeur
  • Vérifiez 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
  • regardez 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
  • regardez 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 plupart des commandes nécéssitant une entrée en paramètre (par exemple un nom de fichier) utilisent l'entrée standard si le paramètre n'est pas donné


$ cat               # va attendre et répéter les entrées utilisateur
$ cat > livre.txt   # va concaténer tout 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'interrompre le flux d'entrée

Flux d'erreur

Les messages d'erreur des programmes ne sont pas redirigés 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'erreur
                    

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 puissance des interfaces en ligne de commande

grep

grep fichier patterncherche et affiche les lignes du fichier qui contiennent 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 contient 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


Listez 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'exécution 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 ?
  • Tapez 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'environnement
  • Alias
  • Permisissions par défaut
  • Comportement de Bash

Variables d'environnement (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'environnement du parent.
  • On accède à leurs valeurs 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'exé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 ? Testez 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}'sélectioner 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'omet la première ligne

Connexion à distance: SSH (Secure SHell)

Utilité

  • travail à distance comme si l'on était 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 connectez avec la commande suivante:
  2. $ ssh login@mon.server.com
  3. vérifiez que le fingerprint du serveur correspond bien à celui attendu
  4. entrez 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é, listez le contenu de votre dossier home sur ce serveur
  • editez un nouveau fichier dans un dossier nommé exo_ssh en utilisant un éditeur de texte
  • terminez 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

  • copiez le fichier du dossier exo_ssh localement
  • modifiez ce fichier localement
  • copiez le nouveau fichier dans le dossier distant exo_ssh

Authentification par clef publique

Principe

Vous avez à 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 chiffrer un message qui vous est envoyée, seul la clef privée peut le déchiffrer

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 chiffré par votre clef publique, serez-vous capable de le déchiffrer ?
  • client: oui je peux, j'ai la clef privée et voici le message déchiffré
  • server: ok je confime que vous avez la bonne clef privée car le message est bien dechiffré, vous êtes authentifié

Authentification par clef publique

Avantages

  • facilité de connexion et automatisation (on peut éventuellement 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éez une paire de clef publique / privée (de préférence avec passphrase)

$ ssh-keygen

Copiez la clef publique sur le serveur

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

Connectez vous au serveur

$ ssh login@cuilxa.unige.ch