Introduction au système Unix
Compétences visées
- commandes de base d’Unix
- compréhension du système de fichiers, propriétaires, groupes, droits
- maitrise de base de vim
- compréhension des flux et des redirections
- gestion des processus
- utilisation du système de paquetages, installation de logiciels
- sauvegardes
- scripting en Python
UNIX timeline
L’interpréteur de commandes bash
sudo <commande>
: exécute la commande en tant qu’utilisateurroot
- pour exécuter une séquence de commandes sans vérification, les séparer par
';'
- pour exécuter une séquence de commandes avec vérification à chaque commande, les séparer par
'&&'
- flèche haut / bas : commande précédente / suivante
Ctrl-u
: efface du début de la ligne jusqu’au curseurCtrl-a
: amène le curseur en début de ligneCtrl-e
: amène le curseur en fin de ligneCtrl-r
: recherche d’une commande antérieure par son nomCtrl-c
: tue un programme en cours d’exécutionCtrl-d
: asphyxie le flux d’entrée (ferme la plupart des interpréteurs)Tab
: propose des choix en fonction du contexte- caractères spéciaux : les précéder par
\
, ou les mettre dans une chaine. Exemple :$ mkdir c\'est\ l\'été
ou$ mkdir "C'est l'été"
Le manuel
man <cmd>
: affiche le manuel de la commande<cmd>
man -k <keyword>
: affiche toutes les pages de manuel associées au mot-clé<keyword>
- recherche d’un texte dans une page de man :
/<text>
puisentrée
Installation de packages et d’applications
Utilisation du package manager apt
- installer un package et toutes ses dépendances :
sudo apt install <package_name>
- supprimer un package :
sudo apt remove <package>
- mettre à jour les packages disponibles dans les dépots :
sudo apt update
- liste des dépots :
/etc/apt/sources.list
Installation des fichiers Debian .deb
- installer un fichier Debian :
sudo apt install ./<file>.deb
- installer les dépendance :
sudo apt-get install -f
Arborescence des fichiers Linux
- une seule racine
/
(contrairement à Windows) - les noms de fichiers et de répertoires peuvent contenir n’importe quels caractères
/ ------| /etc -------------| /etc/passwd
| root drwxr-xr-x | root -rw-r--r--
| |
| | /etc/apt
| | ...
|
| /home ------------| /home/chris -------| /home/chris/.bashrc
| root drwxr-xr-x | chris drwxr-xr-x | /home/chris/.nvm
| | /home/chris/work -----| /home/chris/work/file1
| | /home/chris/save | /home/chris/work/file2
|
| /usr -------------| /usr/local --------| /usr/local/bin -------| /usr/local/bin/node
| root drwxr-xr-x | /usr/local/bin/pm2 --> ../lib/node_modules/pm2/bin/pm2
| | ...
|
| /var -------------| /var/log ----------| /var/log/dmesg
| root drwxr-xr-x | /var/log/messages ----| /var/log/messages/nginx
| | /var/log/messages/gunicorn
| | /var/log/messages/gunicorn
| /var/www
| root drwxr-xr-x
|
| /tmp
| root drwxrwxrwt
Répertoire courant
Chemin d’accès relatifs et absolus aux fichiers et répertoires
Un chemin absolu commence par /
, un chemin relatif au répertoire courant commence par .
ou ..
Copie, déplacement et suppression de fichiers et répertoires
Attention
cp -r ../d1/d2/ .
copie tout le contenu ded2
dans le répertoire courant (sans créer de répertoired2
)cp -r ../d1/d2 .
créé dans le répertoire courant un répertoired2
, copie du répertoire ../d1/d2
bash globbing characters
*
remplace 0 ou n caractères quelconques?
remplace un caractère quelconque[abc]
remplace un caractère parmi “abc”[a-p]
remplace n’importe quel caractère de la suite ‘a’,…,‘p’,[!a-p]
remplace n’importe quel caractère qui n’est pas de la suite ‘a’,…‘p’\
demande au shell de ne pas interpréter le caractère spécial qui le suit
Guillements simple et double
Guillemets simples (‘…’)
À utiliser lorsque vous souhaitez préserver la valeur littérale de chaque caractère. Tout ce qui se trouve entre des guillemets simples est traité comme une chaîne littérale, et les caractères spéciaux comme $, \, et ! ne sont pas interprétés.
Guillemets doubles (“…”)
À utiliser lorsque vous souhaitez autoriser l’expansion des variables et la substitution de commandes, mais tout en échappant certains caractères spéciaux. À l’intérieur des guillemets doubles, le shell interprétera $ (pour les variables), (pour les séquences d’échappement) et ` (pour la substitution de commandes), mais traitera la plupart des autres caractères spéciaux littéralement.
Droits d’accès aux fichiers et répertoires
- file1 appartient à l’utilisateur chris et au groupe chris
- le premier
-
indique qu’il s’agit d’un fichier - le premier bloc de trois lettres
rw-
décrit les droits duuser
(chris) : read: oui, write: oui, execute: non - le deuxième bloc
r--
décrit les droits dugroup
(staff) : read: oui, write: non, execute: non - le troisième bloc
r--
décrit les droits desothers
(tous les autres) : read: oui, write: non, execute: non - pour un répertoire, le droit
'x'
est un droit de traversée
L’éditeur de texte vim
- Ouverture:
vim nom_fichier
. Si le fichier n’existe pas, le texte édité sera sauvegardé dans ce fichier lors de l’enregistrement - Il y a 3 modes différents : ‘normal’, ‘insertion’, ‘commande’
- Au lancement on est en mode ‘normal’. On ne peut pas taper directement du texte, mais seulement des commandes mono ou bi- caractère, telles que ‘x’, ‘GG’, etc.
- On passe au mode insertion en tapant :
i
: insertion à la position du curseura
: à droite du curseuro
: sur une nouvelle ligne en dessousO
: sur une nouvelle ligne au dessus
- On revient en mode ‘normal’ avec la touche Escape
- En mode ‘normal’, commandes de déplacement :
- le curseur se déplace avec les touches fléchées
gg
pour se placer sur la première ligneG
pour se placer sur la dernière ligne:n
pour aller à la ligne nCtrl-f
descend d’une pageCtrl-b
remonte d’une pagew
pour se déplacer d’un mot vers l’avant ;10w
pour se déplacer de 10 motsb
pour se déplacer de mot en mot vers l’arrière
- En mode ‘normal’, commandes de modification :
x
pour supprimer le caractère qui est sous le curseur10x
pour supprimer 10 caractèresdd
pour supprimer la ligne courante,10dd
pour supprimer 10 lignes à partir de la courante.yy
pour copier la ligne courante,10yy
pour copier 10 lignes à partir de la courante.p
pour coller les dernières lignes supprimées ou copiées en dessous de la ligne courante (P au dessus de la ligne courante).dw
pour supprimer un mot ;10w
pour supprimer 10 motsJ
met bout à bout la ligne courant et la ligne suivante
On passe en mode ‘commande’ en tapant ‘:’ suivi du texte de la commande
- Recherche et substitution
/mot
pour chercher un mot,n
pour passer à l’occurrence suivante,N
à l’occurence précédente.:s/mot1/mot2/
pour remplacermot1
parmot2
sur la ligne courante.:n1,n2s/mot1/mot2/
pour remplacermot1
parmot2
sur les lignes numérotées den1
àn2
.
désigne la ligne courante,$
désigne la dernière ligne du fichier,%
désigne la totalité du fichier et peut remplacer1,$
- la substitution n’est réalisée que sur la première occurrence trouvée sur une ligne. Pour qu’elle se fasse sur toutes les occurrences de la même ligne, il faut ajouter
g
à la fin de la commande - si on souhaite qu’une confirmation soit demandée pour chaque substitution, il faut ajouter
c
à la fin de la commande. :%s/\(.*\);\(.*\);\(.*\)/\1;\2;\1;\3/
- Enregistrement, sortie
- Enregistrement en tapant :w
- Enregistrer et sortir en tapant :wq
- Sortir sans enregistrer en tapant :q!
- Configuration
:set number
pour numéroter les lignes.
- Configuration des tabulations
:set expandtab
pour remplacer le caractère de tabulation par des espaces:set tabstop=4
pour fixer à 4 le nombre d’espaces qui remplacent une tabulation
sed
, sed -E
(Streamlined Editor)
sed
permet d’exécuter des commandes de type vim
sur les lignes d’un fichier.
sed -E
utilise des expressions régulières standard.
Pour enregistrer directement les changements dans les fichiers :
Remplacement :
Supprimer les lignes qui contiennent un mot :
Supprimer les lignes vides d’un fichier :
Éditeur de texte par défaut
Flux d’une commande et redirections
entrée standard ------> commande --------> sortie standard
|
|-------> sortie d'erreur
'>'
redirige la sortie standard dans un fichier'>>'
ajoute le flux à la fin du fichier (sans l’effacer)
'<'
redirige l’entrée standard d’un commande ;'2>'
et'2>>'
redirigent la sortie d’erreur'|'
connecte la sortie standard d’une commande à l’entrée standard d’une autre.
Encodage des fichiers texte
Unicode
Chaque caractère ou idéogramme possède un codepoint
unique. Par exemple la lettre cyrilique Я a le codepoint U+042F.
Les codepoints sont organisés en blocs qui reprennent, translatés, les anciens codages de caractères tels que l’ASCII, ISO-8859, EBCDIC, etc. Les caractères ASCII (lettres majuscules non accentuées, chiffres, symboles courants) occupent le premier bloc.
Un texte, c’est à dire une suite de codepoints, est encodé en une suite d’octets en utilisant une méthode d’encodage telle qu’UTF8. UTF8 conserve l’encodage des codes ASCII du premier bloc sous forme d’un octet. Les autres caractères peuvent donner lieu à 2, 3 voire 4 octets.
Les fichiers sont des suites d’octets
La commande file
permet de deviner le type et l’encodage d’un fichier.
La commande iconv
permet de convertir un fichier texte d’un encodage vers un autre. VSCode permet également facilement de changer l’encodage d’un fichier.
Les liens
ln dir1/file1 dir2/file2
: lien ‘dur’.dir1/file1
doit exister, mais pasdir2/file2
. Après le lien, les nomsdir1/file1
etdir2/file2
renvoient au même fichier sur le disque dur. Ils deviennent totalement équivalents. La modification des droits, propriétaire, groupe etc. de l’un est visible sur l’autre. Un lien ‘dur’ ne peut pas pointer vers un répertoire. Un lien ‘dur’ ne peut pas traverser les systèmes de fichiers (ne peut pas être sur des ‘volumes’ différents)ln -s dir1/file1 dir2/file2
: lien ‘symbolique’. Les contenus dedir1/file1
etdir2/file2
semblent être également identiques. En fait, l’information stockée avecdir2/file2
contient le nom du fichier vers lequel le lien pointe (dir1/file1
). Un lien symbolique est plus lent qu’un lien dur. Un lien symbolique est orienté, dans l’exemple dedir2/file2
versdir1/file1
. Un lien symbolique peut être fait entre répertoires, et au travers des systèmes de fichiers. Un lien symbolique peut être corrompu. Les deux extrémités d’un lien symbolique peuvent avoir des droits, proriétaires, groupes différents.
head, tail
head [-n <count>] <file>
: affiche les 10 (ou<count>
) premières lignes d’un fichiertail [-n <count>] <file>
: affiche les 10 (ou<count>
) dernières lignes d’un fichiertail -f <file>
: cette commande ne termine pas, et affiche en continu les 10 dernières lignes d’un fichier. Très utile pour des fichiers de log qui grossissent en continu (ex:tail -f /var/log/nginx/error.log
)
Gestion de comptes utilisateurs
sudo adduser <username>
: créé un nouvel utilisateur<username>
, qui appartient à un nouveau groupe de nom<username>
. Un répertoire/home/<username>
est créé qui devient le ‘repertoire home’ de cet utilisateur.sudo deluser <username>
: supprime l’utilisateur, sans supprimer son répertoire home ni aucun de ses fichiers. L’option--remove-all-files
supprime tous les fichiers possédés par l’utilisateur. L’option--remove-home
supprime tous les fichiers du répertoire ‘home’passwd
: change le mot de passesudo passwd <username>
: change le mot de passe de<username>
sudo su - <username>
: prend l’identité du user de nom<username>
Gestion des groupes
sudo addgroup <groupname>
: créé un nouveau groupesudo adduser <username> <groupname>
: ajoute un utilisateur existant<username>
à un groupe existant<groupname>
. Par exemple,sudo adduser chris sudo
ajoutechris
au groupesudo
.sudo groups <username>
: affiche la liste des groupes auquels appartient
Clés SSH
Création de clés SSH
Créé une paire de clés publique/privée de 2048 bits. Les clés sont accessibles dans ~/.ssh/id_rsa
et ~/.ssh/id_rsa.pub
Copie de la clé publique vers une autre machine
La clé publique est copiée dans le fichier .ssh/authorized_keys
de la machine cible
Permettre l’utilisation de git clone
Résoud le problème GitHub/Gitlab “Fix Permission denied (publickey)” : copier les fichiers ~/.ssh/id_rsa
et ~/.ssh/id_rsa.pub
avec les même propriétaires et permissions : 600 (id_rsa) et 664 (id_rsa.pub)
sudo sans mot de passe
ssh, scp
rsync
Forme générale:
Synchronise, copie ou actualise les données d’une source (locale ou distante) vers une destination (locale ou distante) en ne transférant que les fichiers qui ont été modifiés.
[options]
:
r
: copie récursivementv
: verbosea
: archive (analogue àr
avec conservation des droits et propriétaires)--exclude-from <file>
: exclut de la synchronisation les fichiers et répertoires mentionnés dans<file>
(un motif par ligne, jokers possibles)
Attention au /
à la fin de source
: s’il n’est pas présent, un répertoire source
est créé dans le répertoire destination
.
Variables shell
Variables d’environnement
Comme des variables shell, mais leur valeur est passée à tous les sous-processus
Exécuter une commande avec des variables d’environnement temporaires
wget
Wget est une commande non interactive de téléchargement de fichiers depuis le Web.
--recursive
: download the entire Web site--domains
: don’t follow links outside listed domains--no-parent
: don’t follow links outside the specified directory--page-requisites
: get all the elements that compose the page (images, CSS and so on)--convert-links
: convert links so that they work locally, off-line
aliases
alias
: affiche la liste des aliasalias rm='rm -i
: définit un alias pourrm
alias ls='ls --color=auto
: définit un alias pourls
~/.bashrc
, ~/.zshrc
etc.
~/.bashrc
contient des commandes exécutées à chaque démarrage de shell On y définit typiquement des alias, ou son invite de commande.
export PATH="<dir>:$PATH"
: ajoute le répertoire<dir>
à la variable d’environnement$PATH
export PS1="\u@\h \w> "
: modifie le prompt bash\u
: username\h
: hostname\w
: working directory
Pour zsh, c’est la variable PROMPT qui est utilisée
rc files (“run command”)
grep / grep -E
grep
explore les fichiers désignés ligne par ligne, à la recherche d’un motif (pattern).
grep -E
est une extension de la commande grep
avec des expressions régulières étendues ; elle est à préférer à grep
Syntaxe :
egrep [options] <pattern> <path>
Options :
-n
: affiche le nom du fichier et le numéro de la ligne-c
: affiche le nombre d’occurences-i
: case-insensitive-w
: recherche le mot complet, pas ses variantes-v
: inverse l’effet du pattern-f file
: recherche les mots mentionnés dansfile
(un mot par ligne)-r
: récursif- ‘-o’ : n’affiche que la partie de la ligne reconnue, au lieu de la ligne entière
Pattern :
.
: un caractère quelconque?
: l’item précédent est optionnel et match au plus une fois*
: l’item précédent match zéro ou plusieurs fois+
: l’item précédent match une ou plusieurs fois[<liste>]
: un choix parmi les éléments de<liste>
(ex: [aA], [0-9], [a-z], [A-Z])[^<caractère>]
: tout sauf<caractère>
(<item1>|<item2>)
: match<item1>
ou<item2>
{n}
: l’item précédent match exactementn
fois consécutivement{n,}
: l’item précédent match exactementn
ou plusieurs fois consécutivement{,m}
: l’item précédent match au plusm
fois consécutivement{n,m}
: l’item précédent match entren
etm
fois (inclus) consécutivement^
: début de ligne$
: fin de ligne (attention : lines se terminant par LF (Unix), pas CRLF (Windows))
find
La commande find
permet de traverser récursivement toute une hiérarchie de fichiers et de répertoires. Les options précisent les filtres pour limiter le parcours, et les actions à effectuer sur chaque fichier ou répertoire parcouru.
Options de filtrage :
-type <type>
: spécifie le type (f = file, d = répertoire)-name <pattern>
: le nom du fichier ou répertoire match<pattern>
-user <user>
: le propriétaire du fichier ou répertoire est<user>
-group <group>
: le groupe du fichier ou répertoire est<group>
-perm <xyz>
: les permissions du fichier ou répertoire sont<xyz>
en octal-atime +/-<n>
: fichier accédé il y a plus/moins de<n>
jours-mtime +/-<n>
: fichier modifié il y a plus/moins de<n>
jours-size +/-<n><U>
: le fichier a une taille supérieure/inférieure à<n><U>
(U: K=kilo, M=méga, G=giga, T=téra)
Plusieurs options de filtre réalisent implicitement un et
. Si on souhaite un ou
, il faut utiliser la forme : <filtre> -o <filtre>
Par exemple, tous les fichiers modifiés il y a plus de 7 jours ou accédés il y a plus de 30 jours : -mtime +7 -o -atime +30
Options d’actions à effectuer :
-exec <command>
: exécute<command>
sur le fichier ou le répertoire-ok <command>
: comme-exec
mais demande confirmation au terminal
<command>
doit se terminer par \;
et peut contenir des termes {}
qui seront remplacés par le fichier ou répertoire courant.
Par exemple, pour faire un listing détaillé de tous les fichiers filtrés : -exec ls -l {} \;
Gestion de processus
Un processus est une instance de programme en cours d’exécution. Un processus est interactif s’il est lancé depuis le terminal et il accepte des entrées depuis le clavier. Les autres processus, non-interactifs, s’exécutent en arrière-plan et n’attendent pas d’entrées du clavier.
Chaque processus est associé à un utilisateur (l’utilisateur du shell qui a lancé son exécution s’il s’agit d’un processus interactif). Chaque processus possède un numéro PID
unique qui l’identifie.
Liste des processus
La commande ps aux
permet d’obtenir la liste et des informations détaillées sur tous les processus en cours :
La commande pidof <command>
permet d’obtenir la liste des PID des processus associés à une commande :
Lister tous les processes qui écoutent sur un port :
Tuer un processus
La commande kill -9 <pid>
permet d’envoyer le signal 9 (kill) au processus <pid>
.
Lancer un programme en arrière-plan
<commande> & # le processus continue en arrière-plan, mais il est tué à la déconnexion
nohup <commande> & # le processus continue même après déconnexion
Shebang
Ligne à mettre au début d’un fichier texte contenant un programme écrit dans un langage de script (bash, python, node) et qui précise quel interpréteur utiliser
On peut préciser le chemin absolu vers l’interpréteur, par exemple pour bash sous Linux :
En général il est préférable de chercher l’exécutable dans le PATH
du user avec l’écriture /usr/bin/env
. Par exemple :
Pour installer un script exécutable en tant que commande ‘system-wide’, on peut créer un lien symbolique du type :
Tar
La commande tar
(goudron) permet d’agglomérer une ou plusieurs hiérarchies de fichiers en une seule archive, sans compression.
- création d’une archive :
tar cvf <archive> <file/dir> <file/dir> ...
- extraction d’une archive :
tar xvf <archive>
- liste des fichiers d’une archive :
tar tvf <archive>
- l’option
z
en création ou en extraction ajoute une compression/décompression des données -T -
: permet de prendre la liste des fichiers et répertoires sur l’entrée standard
Scripts shell
Services système
Un service est une tache de longue durée, souvent infinie, qui s’exécute en arrière-plan (démon). En cas de crash elle est relancée automatiquement. La commande systemd
permet de lister, inspecter, démarrer, arrêter, redémarrer les services existants.
Les services sont définis dans le réperetoire /etc/systemd/system
.
Exemple de définition de service :
Cron
Cron
est un service système :
Cron
exécute périodement les tâches listées dans le fichier /etc/crontab
. Sur Ubuntu 20, son contenu par défaut est :
Il exécute donc, en tant qu’utilisateur root
, à partir du répertoire /
:
- les scripts situés dans le répertoire
/etc/cron.hourly
, à chaque heure (minutes: 17) - les scripts situés dans le répertoire
/etc/cron.daily
, chaque jour à 06:25 - les scripts situés dans le répertoire
/etc/cron.weekly
, chaque semaine, le dimanche à 06:47 - les scripts situés dans le répertoire
/etc/cron.monthly
, chaque mois, le premier du mois à 06:52
Les premiers champs de chaque ligne sont m h dom mon dow
:
m
: minute, 0-59h
: hour, 0-23dom
: day of month, 1-31mon
: month, 1-12dow
: day of week), 0/7=dimanche, 1=lundi, 2=mardi, 3=mercredi, 4=jeudi, 5=vendredi, 6=samedi
Exemple : /tmp/crontest
sera créé et sa date de dernière modification mise à jour à chaque minute.
Status
Une erreur de syntaxe peut mettre le service cron en erreur :
Oct 23 04:43:01 ubuntu cron[605]: Error: bad username; while reading /etc/crontab
Oct 23 04:43:01 ubuntu cron[605]: (*system*) ERROR (Syntax error, this crontab file will be ignored)
Restart
Mémo
ls
: liste les fichiers et les répertoires, sauf ceux qui commencent par.
ls -a
: liste tous les fichiers et les répertoiresls -l
: liste les fichiers et les répertoires avec des détailsmkdir
: créé un répertoirecd directory
: déplace le répertoire courant versdirectory
cd
: déplace le répertoire courant vers le ‘home’ de l’utilisateurcd ..
: déplace le répertoire courant vers le répertoire pèrepwd
: affiche le chemin d’accès absolu du répertoire courantcp file1 file2
: copiefile1
et nomme la copiefile2
cp file1 file2 dir1
: copiefile1
etfile2
dans le répertoiredir1
mv file1 file2
: déplace ou renommefile1
enfile2
. Sifile2
existe, il est écrasémv file1 file2 dir1
: déplacefile1
etfile2
dans le répertoiredir1
rm file1 file2...
: supprime les fichiersfile1
,file2
,…rm -r file_or_dir1 file_or_dir2 ...
: supprime récursivement les fichiers et les répertoiresfile_or_dir1
,file_or_dir2
…rmdir directory
: supprime un répertoire videchmod [options] file
: change les droits d’accès defile
chown newowner file
: change le propriétaire defile
chgrp newgrp file
: change le groupe defile
chown newowner:newgrp file
: change le propriétaire et le groupe defile
which
: localise une commande dans lePATH
de l’utilisateur
cat file1 file2...
: affiche à la console le contenu defile1
, puis defile2
etc.more file
: affiche le contenu d’un fichier une page à la foishead file
: affiche les premières lignes d’un fichiertail file
: affiche les dernières lignes d’un fichiertail -f file
: affiche les dernières lignes d’un fichier en continufile file
: devine le type d’un fichiergrep 'keyword' file
: cherche des mots dans un fichierwc file
: compte le nombre de lignes/mots/caractères dans un fichierhexdump file
: affiche le contenu defile
octet par octet en hexadécimalcut -d delim -f n,m,p file
: découpe les lignes defile
en champs séparés pardelim
et garde seulement les champs de numéros n, m et ptr -s ' ' file
: remplace dans les fichiers toutes les occurences multiples d’espaces par un seul espace
command > file
: redirige la sortie standard decommand
vers le fichierfile
command >> file
: redirige la sorte standard decommand
à la fin du fichierfile
command < file
: redirige le contenu defile
vers l’entrée standard decommand
command1 | command2
: redirige la sortie decommand1
vers l’entrée decommand2
cat file1 file2 > file3
: cancatènefile1
etfile2
versfile3
sort file
: trie les lignes defile
sudo <command>
: exécute<command>
en tant qu’utilisateur rootsudo -u <username> <command>
: exécute<command>
en tant qu’utilisateursudo -i
: ouvre un nouveau shell avec l’utilisateur rootsu - <username>
: ouvre un nouveau shell en tant que<username>
command &
: exécute une commande en arrière plan^C
: tue la commande qui s’exécute en avant-plan^Z
: suspend la commande qui s’exécute au premier planbg
: exécute en arrière plan le job suspendujobs
: affiche la liste des jobsfg %1
: met au premier plan le job numéro 1kill %1
: tue le job numéro 1ps
: liste mes processesps aux
: liste tous les processesps -u fred
: liste tous les processes defred
kill -9 26152
: tue le process de pid 26152