Amis SH

Accueil à l'Xml

Assimiler la notion de shell sur GNU/Linux

Les interpréteurs de commandes shell

Un interpréteur de commandes shell se choisi en fonction des besoins de l'administrateur.
Les instructions des scripts shell sont écrites en fonction de l'interpréteur de commande shell utilisé sur votre système d'exploitation GNU/Linux.

Les shells suivants sont disponibles par défaut sur GNU/Linux Mint 20 Ulyana : bash dash rbash

Définition de /bin/sh/

Le shell système par défaut /bin/sh était un shell appelé bourne shell en 1977.
Le shell système est le shell par défaut que les scripts du système doivent utiliser.
Le lien "/bin/sh" n'est pas un shell mais un lien symbolique vers l'exécutable du shell système configuré.
Sur GNU/Linux il est devenu convention de toujours lier avec un lien symbolique /bin/sh vers le shell bash.
Le lien symbolique /bin/sh renvoie vers le shell bash ou dash en fonction de la distribution de GNU/Linux.
Le shell de connexion utilisateur par défaut reste bash.

Définition de /bin/bash/

Bash est un shell compatible /bin/sh et peut être utilisé comme shell système conforme POSIX.
Bash est plus expressif que dash mais dash fonctionne plus rapidement et est plus sécurisé.

Définition de /bin/dash/

Debian et Ubuntu ont décidé de faire passer le shell système de bash à dash, rompant avec une longue tradition sous GNU/Linux d'utilisation de bash pour /bin/sh.
Dash est considéré comme un shell plus léger et beaucoup plus rapide, ce qui peut être bénéfique pour la vitesse de démarrage et les scripts d'installation de packages.
Dash est assez bien compatible avec bash, étant basé sur le même standard POSIX cependant il n'implémente pas la plupart des extensions non standard fournies par bash.
Un script exécuté depuis le bureau ou le gestionnaire de fichiers, via la boîte de dialogue « exécuter dans le terminal », s'exécutera en tant que POSIX dash.
Dash implémente uniquement les fonctionnalités du shell POSIX et renvoie une erreur s'il rencontre des bashismes tels que des variables de tableau ou une substitution de processus.
Utiliser dash aussi souvent que possible pour les scripts, en particulier pour les scripts côté serveur.
Sur les systèmes basés sur Debian, /bin/shest un lien symbolique vers /bin/dash.

Autres interpréteurs de commande shell

Pour des raisons pratiques et de sécurité on préfère éviter l'utilisation d'un shell non connu, non maintenu ou encore mal documenté : ash csh tcsh fish wish zsh ksh pdksh rc tclsh pwsh

Les shells dash, ksh, tcsh sont minimes et ne fournissent pas de fonctionnalités supplémentaires.
Ils ne constituent donc pas le meilleur choix pour une utilisation interactive.

Installer l'interpréteur de commande zsh

Installer le shell zsh :

Installer Oh My Zsh :




POSIX

×✔ Définition de POSIX, compatibilité POSIX et interpréteurs POSIX.

POSIX

Définition de POSIX

POSIX est une famille de normes techniques définie depuis 1988 par l'Institute of Electrical and Electronics Engineers (IEEE), et formellement désignée par IEEE 1003. Définition de POSIX sur wikipédia.
Ces normes ont émergées d'un projet de standardisation des interfaces de programmation des logiciels destinés à fonctionner sur les variantes du système d'exploitation UNIX.
Utiliser la norme POSIX permet de coder un script pour qu'il puisse fonctionner directement sur n'importe quel shell, ou, après recompilation en C, sur la plupart des machines Linux ainsi que sur des plates-formes conformes au standard POSIX comme Cygwin ou Android.

Bash devient partiellement compatible POSIX lorsqu'il est utilisé par l'interpréteur sh.
Les distributions GNU/Linux lient généralement /bin/sh à un shell compatible POSIX comme dash ou ksh.

Définir l'interpréteur de commande shell a utiliser par défaut au début de chaque script :

Vérifier la compatibilité POSIX

Vérifier si POSIX est reconnu et activé

Vérifier si POSIX est reconnu par l'environnement :

Vérifier si POSIX est activé depuis le terminal :

Vérifier la compatibilité POSIX avec checkbashisms

Utiliser checkbashisms présent dans le paquet devscripts de debian pour tester partiellement la conformité POSIX.
Par défaut checkbashisms est dash orienté Debian.

Installer le paquet devscripts :

Utiliser checkbashisms avec le drapeau posix -p pour identifier les erreurs du script :

Consulter le manuel de checkbashisms.

Vérifier la compatibilité POSIX avec shellcheck

Vérifier si un script est conforme POSIX en ligne avec l'outil shellcheck :

Le message d'erreur suivant est retourné : (warning): In POSIX sh, here-strings are undefined.

Installer et utiliser shellcheck depuis le terminal pour vérifier la conformité POSIX d'un script :

Le paquet shellcheck permet d'identifier les problèmes suivants :
- Erreurs de syntaxe et fautes de frappe.
- Variables non citées et substitutions de commandes.
- Utilisation de variables non définies.
- Failles de sécurité comme l'injection de commandes et l'injection de shell.
- Problèmes de performances, substitutions de commandes inutiles et constructions inefficaces.

Garantir la portabilité des scripts avec Ruby, Perl ou Python

Un script conforme POSIX ne garantit pas la portabilité.
Rendre un script shell conforme POSIX est généralement plus facile que de le faire réellement fonctionner sur l'ensemble des shells existants.
Rendre un script shell conforme POSIX demande du temps pour un script de plusieurs centaines de lignes.

Pour garantir une bonne portabilité, utiliser des langages de programmation interprétés sur différents systèmes d'exploitation.
Utiliser des langages comme Ruby, Perl ou Python permet d'améliorer la portabilité du programme.
Le code fonctionne de la même manière sur tous les systèmes d'exploitation à condition d'avoir la bonne version du langage.

Un langage de programmation permet de diviser un script complexe en modules plus faciles à utiliser.
Utiliser des langages évolués apporte de nombreuses fonctionnalités et des bibliothèques sophistiquées.

Interpreteurs POSIX

Les shells bournesh, dash, posh, lksh ou yash sont conforme POSIX et idéaux pour développer des scripts conforme POSIX.

Utiliser le shell bash comme interpréteur POSIX

Utiliser les options du shells bash pour activer POSIX :

Si un script bash est appelé avec la commande sh, il active un mode de compatibilité lui permettant d'agir d'avantage comme un shell plus ancien conforme POSIX en modifiant le comportement de bash pour qu'il corresponde à celui spécifié par POSIX dans les zones où la valeur par défaut de bash différent.
Dans ce mode de compatibilité, bash continue de fournir un certain nombre de fonctionnalités optionnelles qui ne sont pas disponibles dans le shell sh ou dans le standard POSIX.
Même en mode POSIX, bash autorisera toujours certaines fonctionnalités non POSIX telles que [[.
POSIX impose l'usage d'un simple crochet [] pour utiliser des conditionnelles.
Préférer l'utilisation du shell dash qui est plus strict et conforme POSIX.

...

Bash utilisé avec --posix, set -o posix ou sh proposera de corriger certaines incompatibilités du script testé pour se rapprocher de la conformité POSIX.
Le shell bash POSIX autorise toujours de nombreuses extensions spécifiques à bash ce qui empêche de respecter la stricte conformité POSIX.
Préférer un shell comme dash pour tester des scripts shell devant être rendu conforme POSIX.

La commande set provient du bourne shell sh et fait partie du standard POSIX.
La commande shopt ne fait pas partie des standards POSIX, elle est spécifique au shell bash.

Activer POSIX sur le terminal :

Contraindre bash a se rapprocher du comportement POSIX avec un lien local symbolique vers ./sh :

Un script avec une syntaxe spécifique à bash peut donner une erreur dans un shell commençant par #!/bin/sh, même avec le lien symbolique sh vers bash en place :
Le script logfile.sh avec une syntaxe spécifique à bash :

Le lancement du script bash avec la commande sh affiche une erreur :

Le lancement du script bash avec la commande bash fonctionne :

Utiliser le shell dash comme interpréteur POSIX

Utiliser le shell dash comme interpréteur shell conforme POSIX pour tester la comptabilité POSIX des scripts.
Il implémente uniquement les fonctionnalités du shell POSIX et renvoie une erreur s'il rencontre des bashismes comme des variables de tableau ou une substitution de processus.
Lancer un script shell avec l'interpréteur dash :

Utiliser le shell lksh comme interpréteur POSIX

Utiliser les options du shell lksh pour activer POSIX :

Utiliser le projet shall pour interpréter du code shell sur différents shells

Le projet shall permet d'interpréter un script ou une commande avec plusieurs shells en même temps.

Consulter le github officiel du projet shall.

Télécharger shall pour paramétrer son installation :

Configurer les shells utilisés par défaut, à la ligne 247 du fichier /usr/bin/shall :

Lire le manuel de shall :

Afficher les noms des shells existants :

Tester la commande suivante : set -o posix; echo "$SHELLOPTS" | grep -o posix

Demander ou est which avec type which :

La liste des commandes POSIX inclut command et type mais pas which.

Spécifier les shells puis vérifier une commande avec shall depuis l'invitation de commande qui s'affiche :

Vérifier le comportement d'un script script.sh sur l'ensemble des shells disponibles avec shall :



Le terminal sur GNU/Linux

×✔ Le terminal sur GNU/Linux.

Différences entre un terminal et un shell

Console = Terminal physique.

Dans sa signification la plus courante, le mot terminal est synonyme du mot TTY TeleTYpewriter : Environnement d'entrée / sortie texte
Terminal = TTY = Environnement d'entrée/sortie de texte.
Le terminal est appelé prompt ou invite de commande depuis l'écran noir d'un ordinateur.
Le terminal est l'interface de ligne de commande qui permet aux utilisateurs d'accéder au shell.
Les émulateurs de terminal reproduisent les fonctionnalités des terminaux informatiques traditionnels avec certaines similitudes.

Shell = Le shell interprète les lignes de commandes. Un terminal n'est pas un shell.
Les commandes shell sont saisies depuis le terminal encore appelé prompt ou invite de commande.
Il peut prendre différentes formes, plein écran ou fenêtré, austère ou évolué.




Reconnaître un utilisateur d'un super utilisateur root

En général un terminal ouvert affiche le nom de l'utilisateur (user), un arrowbase (@) le nom de la machine (localhost), puis le répertoire courant (pwd), et enfin un dièse (#) pour le super utilisateur (root), le signe supérieur (>) ou le signe pourcentage (%) ou encore le signe dollar ($) pour un simple utilisateur.

La commande su nous bascule sur le compte d'utilisateur root et requiert le mot de passe du compte root.
La commande sudo exécute une seule commande avec les privilèges root, il ne passe pas à l'utilisateur root et ne nécessite pas le mot de passe de l'utilisateur root.
Utiliser la commande sudo -s utilisateur pour devenir utilisateur root et lancer plusieurs commandes.




Terminal vs XTerm

Le terminal et xterm sont des programmes d'émulation de terminal qui permettent d'utiliser un terminal dans un environnement graphique.
L'émulateur de terminal xterm est installé par défaut avec le système d'exploitation Linux.
Les systèmes Linux et UNIX exécutant le système X Windows utilisent le terminal xterm comme programme d'émulation de terminal par défaut.
La commande xterm (/usr/bin/xterm) depuis la fenêtre du terminal courant permet de lancer l'environnement X11 avec une fenêtre Xterm.
XTerm peut être utilisé simultanément par plusieurs utilisateurs.
Xterm permet de personnaliser les polices et les couleurs.

La variable $TERM est héritée par tous les processus lancés par init.
Il garantit que tous les processus générés par init utilisent le formatage de terminal approprié pour la sortie vers la console.
Le système X Window définit automatiquement « xterm » ou « xterm-256color » comme valeur pour $TERM dans une fenêtre de terminal xterm.

Émuler un terminal permet d'utiliser une fenêtre terminal depuis une interface graphique ce qui permet aux utilisateurs d'exécuter des commandes shell.
Linux propose un certain nombre d'émulateurs de terminal pour chaque version d'interface graphique.
Les émulateurs de terminal peuvent avoir différents degrés de personnalisation.
La commande /etc/alternatives/x-terminal-emulator lance le terminal par défaut sur le système.

Afficher le nom de l'émulateur de terminal X utilisé par le système :

Sous GNU/Linux Debian et Ubuntu, la commande x-terminal-emulator est un "raccourci" vers la commande de l'émulateur de terminal par défaut xfce4-terminal.

Afficher le nom du terminal X et le nom du shell utilisé.
Le shell utilisé avec l'émulateur de terminal par défaut xfce4-terminal est bash.

ComparerXTermTerminal
AssistanceIl prend en charge par défaut le tampon primaire.Il prend en charge à la fois le tampon principal et le tampon du presse-papiers.
AccèsIl est accessible en tapant xterm dans la fenêtre du terminal. Il affichera l'environnement X11 et une fenêtre XTerm.Il s'ouvre en maintenant les touches CTRL + Alt + T.
ProcessusIl permet à plusieurs instances de s'exécuter simultanément dans le même affichage.Une seule instance à la fois. Chaque session se déroulera séparément.
ÉmulationÉmulation de terminal par défaut pour les systèmes Linux exécutant X Windows System.Émulateur de terminal par défaut pour les systèmes basés sur Linux et UNIX.
UtilisationPlusieurs utilisateurs peuvent y accéder simultanément.Pas plus d'un utilisateur ne peut l'utiliser en même temps.

Modifier le choix du terminal utilisé par défaut

Sur GNU/Linux Mint il existe 6 choix proposés pour l'alternative x-terminal-emulator pour renseigner le fichier /usr/bin/x-terminal-emulator.

La librairie terminfo contient des définitions pour les différents émulateurs de terminaux définies dans les dossiers correspondant :

Utiliser plusieurs terminaux

Si aucun terminal n'est ouvert, CTRL + Alt + T permet d'ouvrir un terminal dans le répertoire utilisateur.
Si le terminal est ouvert, utiliser le menu Fichier / "Ouvrir un terminal" pour ouvrir un nouveau terminal.
Si le terminal est déjà ouvert, CTRL + Maj + N pour ouvrir une fenêtre de terminal dans le même répertoire.
Si le terminal est déjà ouvert, CTRL + Shift + T pour ouvrir un nouvel onglet dans le même répertoire.

Régler les dimensions de la fenêtre du terminal par exemple à 108 colonnes et 24 lignes.
Menu > préférence > Apparence > Géométrie par défaut 80x24, ou 108x24 par exemple.

Exporter le résultat d'une commande vers le terminal xterm

Utiliser le terminal xterm ou uxterm, un terminal très austère visuellement.
Astuce pour afficher le résultat d'un script shell bash dans une nouvelle fenêtre du terminal xterm :

 



Shell de connexion, shell interactif, shell non interactif

Shell de connexion utilisateur : Il demande a saisir le login et le mot de passe pour ouvrir un shell interactif qui permet alors de saisir des commandes.
Les commandes logout et exit sont disponibles pour quitter le shell de connexion.

Shell interactif : Un shell est dit interactif lorsqu'il affiche un prompt pour saisir une commande directement dans le terminal et attendre qu'elle s'exécute.
Pour démarrer un shell non connexion dans un émulateur de terminal, lancer l'émulateur de terminal, par exemple, xfce4-terminal, depuis l'interface graphique.
Un shell interactif "non connexion" s'ouvre.

Shell non interactif : Les tâches exécutées en arrière plan sont des exemples de shell non interactif, le shell lit les commandes d'un script enregistré dans un fichier.

Vérifier si le shell est interactif :

La commande logout est spécifique à un shell de connexion.
Utiliser la commande logout depuis un shell interactif retourne une erreur :

Vérifier si le shell est un shell de connexion :



Identifier le shell utilisé par le terminal

×✔ Identifier le shell utilisé par le terminal.

Un terminal peut utiliser différents types de shell

Démarrer un terminal et lancer la commande ps pour identifier le shell utilisé par le terminal.
La commande ps affiche le nom de l'interpréteur shell.

L'interpréteur de commandes shell utilisé par défaut est affiché comme étant bash.
Les lignes affichées sont le résultat de la commande ps suite à son interprétation par le shell bash.

La variable d'environnement $SHELL permet d'identifier le shell utilisé par défaut par le terminal.
La variable d'environnement $0 affiche le nom du shell actuel.

Afficher la variable d'environnement $SHELL permet de lire l'emplacement du shell par défaut et son nom.

Lister des shells disponibles par défaut sur le système GNU/Linux Mint 20 Ulyana.

Affiche :



Changer de shell sur GNU/Linux

×✔ Changer de shell sur GNU/Linux.

Changer de shell sur GNU/Linux

La commande chsh permet de changer un shell de connexion avec l'option -s ou -shell.
Saisir le chemin du nouveau shell pour qu'il soit modifié sur l'utilisateur courant :

La commande usermod est utilisée pour modifier les détails d'un compte utilisateur y compris son shell :

Modifier le shell manuellement à l'aide d'un éditeur de texte :

Appliquer une modification de shell à tous les nouveaux utilisateurs créés sur l'environnement.
Modifier le fichier "/etc/adduser.conf", éditer sa variable d'environnement DSHELL avec le chemin du shell à appliquer aux nouveaux utilisateurs.




Bloquer le shell de certains comptes

Pour des raisons de sécurité, il est possible de bloquer les connexions shell d'un compte Linux en précisant comme shell "/usr/sbin/nologin" ou "/bin/false".
La commande "nologin" permet de retourner un message clair à l'utilisateur comme "This account is currently not available". Ce message est personalisable depuis le fichier "/etc/nologin.txt".
La commande "false" bloquera la connexion de l'utilisateur sans informations sur le refus.



Personnaliser le shell

×✔ Personnaliser le shell.

Personnaliser le shell

Personnaliser le shell.




Multiplexeur de terminaux

×✔ Installer un multiplexeur de terminaux.

Installer un multiplexeur de terminaux

Utiliser un multiplexeur de terminaux comme GNU Screen, Tmux ou Terminator améliore votre terminal.

GNU Screen est un multiplexeur de terminaux personalisable qui permet de séparer plusieurs fenêtres dans un seul terminal.
Utiliser le multiplexeur de terminaux screen pour diviser le terminal.
GNU Screen est un multiplexeur de terminaux sous licence GPL.

Tmux est un multiplexeur de terminaux personalisable qui permet de séparer plusieurs fenêtres dans un seul terminal.
Utiliser le multiplexeur de terminaux Tmux pour diviser le terminal.
Tmux est un multiplexeur de terminaux sous licence BSD.

Terminator est un multiplexeur de terminaux personalisable qui permet de séparer plusieurs fenêtres dans un seul terminal.
Utiliser le multiplexeur de terminaux terminator pour diviser le terminal.
Terminator est un multiplexeur de terminaux sous licence GPL-2.0 ou version ultérieure.



PID UID GID UUID PPID

×✔ PID UID GID UUID PPID.

PID UID GID UUID PPID

PID

PID est l'abréviation de Process IDentifier ou Process ID, il s'agit du numéro d'identification d'un processus en cours d'exécution dans la mémoire. Un processus fait référence à un programme en exécution.

Afficher le PID d'un processus en exécution avec la commande pidof.

La commande ps -ef affiche la liste des différents processus.
On retrouve la ligne contenant le PID du processus firefox.

Forcer la fermeture du processus firefox en utilisant la commande kill et le PID du processus.

Les commandes suivantes permettent d'afficher le PID du shell et les shells ouvert dans la session :

UID et GID

À chaque processus est associé un identifiant utilisateur UID pour identifier le compte avec lequel le processus s'exécute et déterminer ses droits.
Les UID sont stockés dans le fichier /etc/passwd.

Un utilisateur est rattaché à un ou plusieurs groupes. Un groupe est identifiable par son GID.
Les groupes sont stockés dans le fichier /etc/groups.

Trouver l'UID et le GID d'un utilisateur :

UUID

Il s'agit d'une suite plus ou moins longue de caractères alpha-numériques qui permet d'identifier de façon absolument sûre chaque périphérique de stockage et partition.

La commande blkid liste des UUIDs, les Labels et Types de toutes les partitions montées.

PARTUUID et PTUUID

PARTUUID est un UUID au niveau de la table de partition pour la partition.
C'est une fonctionnalité standard pour toutes les partitions sur les disques partitionnés GPT.

PTUUID est l'UUID de la table de partition elle-même, un identifiant unique pour l'ensemble du disque attribué au moment où le disque a été partitionné.
C'est l'équivalent de la signature de disque sur les disques partitionnés MBR mais avec plus de bits et une procédure standardisée.

PPID

PPID signifie Parent Process ID, le processus parent est responsable de la création d'un processus enfant qui possède un PID unique mais toujours le même PPID du parent.

Avec la commande pstree -p qui affiche la liste des différents processus sous Linux sous forme d'arborescence on retrouve la ligne contenant le PID du processus firefox.
Les PPID sont lisibles plus facilement avec cette méthode d'affichage.



Créer un script shell

×✔ Créer un script shell.

Créer un script shell sur GNU/Linux

Utiliser un fichier au format texte avec pour extension .sh pour contenir les instructions shell qui seront exécutées par un interpréteur de commandes shell.

Le début du script commence par #!/chemin/vers/interpreteur

Coquille POSIX : #!/bin/sh

Préférer un script compatible POSIX quand c'est possible et utiliser #!/bin/sh.
Utiliser le lien symbolique #!/bin/sh pour utiliser l'interpréteur de commande Bourne shell /bin/sh
Le raccourci /bin/sh devrait dans chaque installation toujours pointer vers le shell système préféré compatible POSIX.
La commande sh est un lien symbolique vers l'interpréteur de commandes par défaut : /bin/dash.
Utiliser la commande sh signifie que le script va s'exécuter en mode de compatibilité (POSIX) même si /bin/sh est un alias de bash.

Dash est un shell compatible Posix.
#!/bin/dash

GNU Bash : #!/bin/bash

Si le script utilise des fonctionnalités uniquement prises en charge par bash, utiliser #!/bin/bash.
Si le script est écrit en langage bash, on utilise un interpréteur de commandes bash.
Utiliser la commande bash signifie que le script va s'exécuter en mode bash.




Modifier les droits de votre script shell

Pour exécuter un fichier .sh sur Linux, on utilise la commande chmod pour lui attribuer le droit en exécution.
On peut alors utiliser le fichier contenant le script sans avoir a préciser sh ou bash en début de commande :

Si on ne modifie pas les autorisations avec chmod, la commande sh ou bash permet de lancer l'exécution du script.
Dans le terminal, exécuter le script en le précédent par la commande sh ou bash.




Ajouter un répertoire au PATH du système

Il peut être intéressant d'ajouter un répertoire au "PATH" du système pour y placer ses scripts et pouvoir les exécuter de n'importe ou sans avoir à se placer dans le dossier qui contient les scripts personnalisés.
A la saisie d'une commande, le shell regarde dans le PATH qui lui indique où chercher le code de la commande.
Le shell va aller voir si la commande a exécuter se trouve dans /usr/local/bin puis dans /usr/bin … jusqu'à trouver la commande.

Lire le PATH du système :

Par convention, ce répertoire s'appelle bin et se place dans votre répertoire personnel.
Votre répertoire personnel est /home/USER, le répertoire personnel ajouté au PATH sera /home/USER/bin.
Pour utiliser vos scripts sans avoir a saisir le "./" depuis n'importe quel répertoire, ajouter votre répertoire personnel au PATH du système.
Cette procédure est une modification temporaire du PATH et sera effacée à la fin de la session :

Afficher les PATH du système :

Retourne :

Le script appelé "script.sh" situé dans "/home/USER/bin" peut être appelé directement avec la commande "script".

D'autres répertoires peuvent être utilisés :

Pour rendre la modification permanente, ajouter la commande suivante dans le fichier texte caché .bashrc ou .profile se trouvant dans votre dossier personnel.

Pour rendre la modification permanente accessible à tous les utilisateurs, ajouter la commande dans le fichier /etc/profile :

Dans les dernières versions de ubuntu (12.04 +) si le dossier $HOME/bin existe il est automatiquement ajouté au PATH.
La commande est incluse dans le fichier ~/.profile lancé lors de toutes sessions graphique ou console.

Les variables

En bash les variables sont toutes des chaînes de caractères.
Il est recommandé de toujour affecter une valeur à la variable.
Aucun espace ni avant ni après le signe "=".

Exemple pour utiliser une commande avec arguments.
La variable nbre_lignes contiendra le nombre de ligne du fichier.ext :

Afficher le contenu d'une variable avec echo :

Utiliser des chemins de répertoires dans une variable :

Exemples pour créer un script shell :



Imbrication de shells

×✔ Imbrications de shells.

Imbrications de shells

Pour des questions de sécurité il est possible d'utiliser plusieurs shells pour gagner en confiance.
Les shells peuvent être imbriqués les uns dans les autres ce qui permet de changer de shell à l'intérieur d'une même session.
Cette technique peut être utilisée pour des mesures de renforcement de sécurité.
Le shell du premier cercle est bridé avec des commande exécutables très restricitives mais il permet avec un mot de passe d'accéder au shell du deuxième cercle dont la marge de manoeuvre est plus importante, et, ainsi de suite, jusqu'au dernier cercle où tout est permis pour les administrateurs en fonction de la politique de sécurité qui a été mise en place pour un ou plusieurs administrateurs.

Afficher sur le terminal le niveau d'imbrication du shell sur lequel on se trouve avec la variable d'environnement $SHLVL :

Afficher la valeur d'imbrication du shell sur le terminal, modifier le fichier ~/.bashrc :

Ajouter cette ligne à la fin du fichier ~/.bashrc :

Le niveau d'imbrication du shell est maintenant affiché sur le terminal :

Pour démarrer un shell non connexion il suffit d'utiliser la commande bash :

Pour démarrer un shell de connexion (login vers shell de connexion) :

// Le mot de passe ne m'est pas demandé sous xfce4-terminal depuis GNU/Linux Mint.
L'affichage du nombre d'imbrication n'est plus indiqué par la commande PS1.



Sécuriser une imbrication de shells

×✔ Sécuriser une imbrication de shells.

Sécuriser une imbrication de shells

Utiliser la commande sudo au lieu de passer au compte root avec la commande su est plus sécuritaire.

Utilisateurs et groupes d'utilisateurs

Identifier l'utilisateur courant :

Changer d'utilisateur :

Utiliser le paramètre -c ou --command pour exécuter des commandes avec un utilisateur différent :

Lister les utilisateurs :

Connaître le nombre de comptes utilisateurs :

Filtrer les utilisateurs actifs ayant un accès shell bash :

Chercher un utilisateur :

Lister les utilisateurs par leur UID :
Afficher les valeurs UID_MIN et UID_MAX sur le système.
Les utilisateurs normaux devraient avoir un UID entre 1000 et 60000 :

Afficher tous les utilisateurs " normaux " du système :

La commande passwd

La commande passwd permet de modifier les mots de passe des comptes utilisateurs et de gérer la période de validité des mots de passe.

Afficher l'état d'un compte utilisateur :

Le nom de connexion d'un utilisateur.
Si un utilisateur a un mot de passe verrouillé (L), aucun mot de passe (NP) ou un mot de passe (P).
La date du dernier changement de mot de passe.
L'âge minimum du mot de passe en nombre de jours.
Âge maximal du mot de passe en nombre de jours.
Période d'avertissement pour le changement de mot de passe en nombre de jours.
Période d'inactivité pour le changement de mot de passe en nombre de jours.

Afficher les informations sur l'état du mot de passe pour tous les comptes :

Modifier le mot de passe d'un utilisateur :

Désactiver un mot de passe pour un compte utilisateur :

Afficher les informations de vieillissement d'un compte utilisateur :

Expiration d'un mot de passe :
Une fois le compte d'un utilisateur verrouillé, il doit contacter l'administrateur du système avant de pouvoir à nouveau utiliser le système.

Désactiver le mot de passe et le compte utilisateur automatiquement après un certain nombre de jours si le mot de passe n'a pas été modifié.

Définir le nombre minimum de jours entre les changements de mot de passe :

Définir le nombre maximum de jours durant lesquels le mot de passe reste valide :

Afficher un message d'avertissement pour un mot de passe arrivant à expiration :

Verrouiller le mot de passe d'un compte utilisateur :
Le verouillage d'un mot de passe empêche l'utilisateur de se connecter en utilisant son mot de passe.
L'utilisateur reste en mesure de se connecter en utilisant d'autres méthodes d'authentification comme un accès SSH.

Débloquer un compte utilisateur verrouillé :

La commande --quiet permet de ne pas afficher sur l'écran le nom d'utilisateur pour lequel le mot de passe est modifié.

Utilisateurs et groupes ? // Comment avoir un super utilisateur pour un certain shell seulement

Créer un utilisateur

La commande useradd crée un nouveau compte utilisateur en fonction des options spécifiées sur la ligne de commande et les valeurs par défaut définies dans le fichier /etc/default/useradd.
La commande useradd lit également le contenu du fichier /etc/login.defs qui contient la configuration du mot de passe shadow, avec la stratégie d'expiration du mot de passe et la plage des ID utilisateurs a utiliser lors de la création de systèmes et d'utilisateurs réguliers.

La commande useradd sans option crée un nouveau compte utilisateur à l'aide des paramètres par défaut spécifiés dans le fichier /etc/default/useradd.
Sur la plupart des distributions Linux, lors de la création d'un nouveau compte d’utilisateur avec useradd, le répertoire home de l'utilisateur n'est pas créé.
Créer un nouveau compte utilisateur :

Ajouter un nouvel utilisateur et créer un répertoire personnel (/home)
Utiliser l'option -m (-create-home) pour créer le répertoire domestique utilisateur /home/utilisateur
La commande ci-dessous crée le répertoire home du nouvel utilisateur et copie des fichiers de /etc/skel dans le répertoire de base de l'utilisateur.

Ajouter un nouvel utilisateur et créer un répertoire personnel autre que /home

Créer un utilisateur avec un ID utilisateur spécifique

Les stratégies UID sont utilisées pour déterminer les types d'actions qu'un utilisateur peut effectuer sur les ressources système.
Lorsqu'un nouvel utilisateur est créé, le système attribue la prochaine UID disponible à partir de la plage spécifiée depuis le fichier login.defs.

Vérifier l'UID de l'utilisateur à l'aide de la commande ID :

https://www.malekal.com/la-commande-useradd-utilisations-et-exemples/#Ajouter_un_utilisateur_avec_un_ID_de_groupe_specifique

Utilisateurs et groupes ? // Comment avoir un super utilisateur pour un certain shell seulement ( MAIS Avec 3 niveaux d'imbrication par exemple !!!??? )

Utiliser un autre shell

Monter en droits vers un ou plusieurs shell / plus élevés ? / avec un ou plusieurs autres utilisateurs ?

Il est possible de déplacer l'emplacement du shell pour améliorer la sécurité du système.

Comment déplacer un shell Linux ?

Utiliser un nouveau shell bash :

Utiliser le paramètre -s ou --shell pour utiliser un autre shell que celui en cours :

Comment demander un mot de passe sur la connexion à un shell ?

Utiliser des clés SSH ...

CHROOT + shell ??

Attention ~~ Expiration des utilisateurs, des mots de passe, des clés ~~ voir des shells ~~

--Notes--


Administrer un serveur hôte avec SSH

×✔ Administrer un serveur hôte avec SSH.

Administrer un serveur hôte avec SSH

Pour une machine on parle généralement de serveur hôte.
Pour un logiciel qui s'exécute sur la machine on parle généralement d'un serveur Web.

Commande de connexion au serveur avec SSH :

Vérifier si screen et sudo sont disponibles :

Mise à jour :

Reconfigurer les variables locales :

La variable LANGUAGE surcharge toutes les autres variables (LANG, LC_* et LC_ALL).
On peut ajouter LANGUAGE=fr_FR.UTF-8 dans le fichier "/etc/environment".
Ce fichier est vide par défaut depuis une installation du serveur Debian Bookworm.

Quitter et relancer le terminal pour rafraîchir les valeurs locales et les vérifier avec la commande locale :

Mettre le serveur à l'heure de Paris :

Mettre à jour le dépôt :

Il est préférable d'installer directement la dernière version stable de Debian 12 Bookworm plutôt que de changer de version majeur de Debian par un processus de mise à jour.
Configurer le source.list avec les adresses URL officielles de Debian 12 Bookworm.
Bookworm est le nom de code de développement de Debian 12, publié le 10/06/2023.
Le dépôt Bookworm a modifié sa valeur firmware component de non-free à non-free-firmware.
Désactiver la liste de paquets non-free-firmware en n'affichant pas ce paramètre si il n'est pas nécessaire.

Finaliser la mise à jour :

Facultatif :

Redémarrer :



Sécuriser la connexion SSH

×✔ Sécuriser la connexion SSH.

Sécuriser la connexion SSH

Se connecter en SSH avec l'utilisateur root pour administrer le serveur Debian Bookworm :

Modifier le mot de passe de l'utilisateur root.
Ayant été réceptionné par mail, le mot de passe de l'utilisateur root est considéré comme compromis.

Identifier un utilisateur qui pourra administrer le serveur :
L'utilisateur amis_sh et son

Vérifier si l'utilisateur amis_sh existe sur le serveur :

Créer un utilisateur sudoer pour administrer le serveur VPS

Pour installer un paquet sur le serveur, la plupart des commandes seront à lancer avec sudo.

Vérifier si sudo est déjà installé :

Installer le paquet sudo :

Créer un utilisateur amis_sh qui sera sudoer

Donner les droits sudoer à l'utilisateur amis_sh :

Se connecter au serveur avec l'utilisateur amis_sh:

Créer un utilisateur elevation-restart

Créer un utilisateur elevation-restart aux droits limités pour redémarrer certains services :

Ajouter les élévations de droits pour redémarrer les services apache2, mysql, php8.2-fpm.
Ne pas utiliser cette méthode qui va alourdir le fichier de visudo rendant le suivi des droits compliqué.
Utiliser la proposition par après, considérée comme bonne pratique.

La pratique recommandée consiste à placer un fichier elevation-restart dans le dossier "/etc/sudoers.d/" :

Coller les lignes suivantes :

Ajout des droits d'élévation dans /etc/sudoers.d/elevation-restart avec un script EOF :
Attention si le fichier existe il sera écrasé du fait du caractères unique strictement suppérieur ">".

Se connecter en SSH avec l'utilisateur elevation-restart :

Actions autorisées :

Les autres actions root sont refusées :

Créer un utilisateur elevation-readlogs

Créer un utilisateur elevation-readlogs et l'ajouter au groupe adm pour consulter les logs du serveur :

Se connecter en SSH avec l'utilisateur elevation-readlogs :

Créer un utilisateur elevation-backup

Créer un utilisateur elevation-backup aux droits limités pour sauvegarder le serveur :

La meilleure pratique consiste à placer la ligne elevation-backup dans un fichier nommé au choix dans le dossier "/etc/sudoers.d/".
On nomme le fichier contenant le script "elevation-backup".
Créer le fichier "elevation-backup" :

Coller les lignes :

Se connecter en SSH avec l'utilisateur elevation-backup :

Actions autorisées :

Créer le fichier qui va contenir les actions de sauvegarde :

Le fichier elevation-backup.sh ne doit pas pouvoir être modifié par l'utilisateur elevation-backup. L'utilisateur pourrait modifier le script et lancer des commandes malveillantes.

Créer le script de sauvegarde des données présentes sur le serveur :

Lancer le script :

Créer les clés SSH pour les différents utilisateurs

Les clés SSH et les passphrases pour l'accès au serveur par les différents utilisateurs sont à créer et a sauvegarder dans un fichier Keepass.

Créer les clés SSH pour l'utilisateur amis_sh

Générer une clé ed25519 directement sur le client local.
Génère la clé dans le répertoire SSH de l'utilisateur si l'emplacement n'est pas spécifié lors de la création.

L'image générée permet un rendu visuel de cette clé SSH.
Afficher la randomart image de notre clé [ED25519 256].
Cette commande doit être utilisée sur la clé publique mais fonctionne également sur la clé privée :

Facultatif - Renommer la clé privée avec l'extension private :

Restreindre les droits de la clé privée :

La clé publique est ajoutée sur le serveur distant sur lequel on se connecte en SSH.
La clé est ajoutée dans un fichier spécifique au compte utilisateur auquel on se connecte qui se nomme ~/.ssh/authorized_keys.

Exporter l'empreinte locale de la clé publique avec ssh-copy-id vers le serveur distant :

Connexion au serveur avec la nouvelle clé SSH :
On spécifie l'emplacement de la clé privée sur la machine locale et on demande l'affichage de la randomart image pour vérifier l'identité du serveur.

Si la connexion s'effectue sans erreur, la passe phrase a bien été reconnue.

Alternatives pour exporter l'empreinte locale de la clé publique vers le serveur

Export des clés vers le serveur avec un autre port de connexion SSH :

Export des clés vers le serveur avec ssh-copy-id et une séquence de frappe en cas de port knocking :

Export des clés vers le serveur avec une séquence de frappe en cas de port knocking et un autre port de connexion SSH :

Copier coller la ligne du fichier de la clé publique vers le fichier authorized_keys de l'utilisateur sur le serveur distant si la commande ssh-copy-id ne fonctionne pas.

Créer les clés SSH pour l'utilisateur elevation-restart

Générer une clé ed25519 directement sur le client local : Générer la clé dans le répertoire SSH de l'utilisateur si l'emplacement n'est pas spécifié lors de la création.

L'image générée permet un rendu visuel de cette clé SSH [ED25519 256].

Afficher la randomart image de notre clé [ED25519 256].
Cette commande doit être utilisée sur la clé publique mais fonctionne également sur la clé privée :

Facultatif - Renommer la clé privée avec l'extension private :

Restreindre les droits de la clé privée :

Exporter l'empreinte de la clé avec ssh-copy-id vers le serveur distant :

Connexion au serveur avec la nouvelle clé SSH :
On spécifie l'emplacement de la clé privée sur la machine locale et on demande l'affichage de la randomart image pour vérifier l'identité du serveur.

Si la connexion s'effectue sans erreur, la passe phrase a bien été reconnue.

Créer les clés SSH pour l'utilisateur elevation-backup

Générer une clé ed25519 directement sur le client local :
Générer la clé dans le répertoire SSH de l'utilisateur si l'emplacement n'est pas spécifié lors de la création.

Afficher la randomart image de notre clé [ED25519 256].
Cette commande doit être utilisée sur la clé publique mais fonctionne également sur la clé privée :

Facultatif - Renommer la clé privée avec l'extension private :

Restreindre les droits de la clé privée :

Exporter l'empreinte de la clé avec ssh-copy-id vers le serveur distant :

Connexion au serveur avec la nouvelle clé SSH :
On spécifie l'emplacement de la clé privée sur la machine locale et on demande l'affichage de la randomart image pour vérifier l'identité du serveur.

Créer les clés SSH pour l'utilisateur elevation-readlogs

Générer une clé ed25519 directement sur le client local :
Générer la clé dans le répertoire SSH de l'utilisateur si l'emplacement n'est pas spécifié lors de la création.

Afficher la randomart image de notre clé [ED25519 256].
Cette commande doit être utilisée sur la clé publique mais fonctionne également sur la clé privée :

Facultatif - Renommer la clé privée avec l'extension private :

Restreindre les droits de la clé privée :

Exporter l'empreinte de la clé avec ssh-copy-id vers le serveur distant :

Connexion au serveur avec la nouvelle clé SSH :
On spécifie l'emplacement de la clé privée sur la machine locale et on demande l'affichage de la randomart image pour vérifier l'identité du serveur.

Modifier la configuration du client SSH de la machine locale

Modifier la configuration du client SSH de la machine locale pour ne pas avoir à ajouter le paramètre "-o VisualHostKey=yes" à chaque tentative de connexion.

Soit depuis le fichier de configuration globale du client SSH :

Soit depuis le fichier de configuration personnalisé de l'utilisateur de la machine locale :

Connaître les randomart dans le fichier known_hosts de la machine locale

Afficher les randomart connus et enregistrés dans le fichier known_hosts de la machine locale (ECDSA) :

Si la randomart image est différente lors de la connexion, c'est certainement que l'on est victime d'une attaque de l'homme du milieu.

Remplacer les messages de connexion

Se connecter au serveur avec l'utilisateur amis_sh et sa clé SSH :

Remplacer le message initial affiché lors de la demande de connexion au serveur SSH depuis le fichier "/etc/issue" :

Remplacer le message initial affiché une fois la connexion SSH établie avec le serveur :

Configurer le serveur SSH

Copier la configuration SSH d'origine dans un fichier d'archive :

Accepter uniquement les connexions par clés SSH depuis le serveur.
Se connecter au serveur VPS pour configurer le serveur SSH afin d'accepter uniquement les connexions par clés SSH.
Ne pas se déconnecter de ce terminal avant d'avoir vérifié depuis un deuxième terminal que la connexion par clé fonctionne.

Remplacer la configuration par défaut par la configuration optimisée proposée par après.
Cette configuration autorise uniquement la connexion au serveur à l'aide de clés SSH ed25519.
Il est indispensable de renseigner les noms des utilisateurs autorisés à se connecter au serveur dans cette configuration.

L'utilisateur root a été interdit pour la connexion SSH et le port SSH par défaut a été modifié pour utiliser le port 2226.

Depuis un second terminal, se reconnecter et recharger la configuration :

Dans un troisième terminal, tester les connexions des utilisateurs autorisés par clé SSH depuis un nouveau terminal :
L'utilisateur amis_sh peut se connecter au serveur uniquement avec sa clé privée et sa passphrase via le nouveau port ssh 2226 :

La configuration pour les clés SSH est fonctionnelle.
On peut se connecter au serveur depuis un second terminal. Fermer le premier terminal.
Si la connexion ne fonctionne pas depuis le nouveau terminal, utiliser le premier terminal pour recharger la configuration par défaut précédemment sauvegardée pour ne pas être éjecté du serveur.

Les logs de SSH peuvent aider à identifier un problème de connexion.
Si les logs sont vides, il faudra certainement installer et configurer rsyslog.
Lors de ce premier déploiement, le fichier de logs SSH /var/log/auth.log est correctement renseigné sans avoir eu besoin d'activer ou de démarrer rsyslog.

Afficher des messages système personnalisés en fonction de l'utilisateur

Afficher des messages système personnalisés une fois connecté au serveur en fonction de l'utilisateur.
Personnaliser un message pour chaque utilisateur afin d'obtenir des informations sur le système ou les commandes autorisées suite à la connexion SSH.
Modifier le fichier suivant pour chacun des utilisateurs :

Configuration /home/amis_sh/.bash_profile

Ajouter les lignes :

Configuration /home/elevation-restart/.bash_profile

Ajouter les lignes :

Configuration /home/elevation-backup/.bash_profile

Ajouter les lignes :

Configuration /home/elevation-readlogs/.bash_profile

Ajouter les lignes :

Consulter les droits sur Visudo

Ajouter les insultes de courtoisie en cas de connexion avec erreurs de mot de passe.

Vérifier les droits des clés SSH sur la machine locale

Par défaut les fichiers créés localement depuis l'interface graphique, avec un clique droit créer un fichier, ont les droits CHMOD à 644.
Ajouter des contenus de clés par copier coller dans des fichiers créés manuellement ne va donc pas respecter le contexte de sécurité recommandé.
Suite à une identification en simple utilisateur, un message d'alerte rappel qu'il est indispensable de donner des droits moindre à la clé privée, sinon, la clé privée sera ignorée.

Passer les droits du dossier .ssh et des sous dossiers à 700 :

Passer les droits des fichiers à 644 et les clés privées à 600 :

Configurer le client SSH

Configurer le client SSH de la machine locale pour ne pas avoir à ajouter le paramètre "-o VisualHostKey=yes" à chaque tentative de connexion.

Configurer le client SSH :

Ajouter les lignes suivantes dans le fichier de configuration du client local :

Configurer le fichier de configuration config de l'utilisateur local :

Ajouter les lignes suivantes dans le fichier de configuration de l'utilisateur local :

La connexion SSH reste active et ne redemande pas la passe phrase.

Voir l'option ControlPersist 30m dans le fichier ~/.ssh/config :

Afficher le pid de la connexion persistante :

Vérifier si le socket présent dans le dossier socket est utilisé par la connexion "amis" :

Fermer la persistance de la connexion "amis" :

Gestion du temps d'inactivité du shell sur la machine locale

Ajouter TMOUT=300 (5minutes) sur le serveur va contre la configuration du serveur ssh de conserver la connexion ouverte pendant 15 minutes.
Ajouter TMOUT=300 (5minutes) respecte la configuration du client de conserver la connexion ouverte pendant 5 minutes.
Ajouter TMOUT permet de déconnecter une session du terminal au bout de 5 minutes.
La session reste active avec le paramètre ssh de persistence ControlPersist 30m.
La connexion au serveur peut être relancée en une ligne sans identification.

Ajouter :

(Ne fonctionne pas sur le serveur ? Mais en local.)

Ajouter :

(Ne fonctionne pas sur le serveur ? Mais en local.)

Recharger la session :

Pour appliquer ce paramètre à tous les utilisateurs, configurer le fichier « /etc/bash.bashrc » qui est le fichier sur lequel se base tous les « ~/.bashrc » des utilisateurs.

Exécuter la commande suivante afin de mettre à jour les bash :

Fonctionne sur le serveur pour déconnecter l'utilisateur élevé en sudoers et le passer en simple utilisateur.

Un message d'erreur s'affiche une fois le temps d'inactivité atteint :

L'inactivité d'une session n'est donc plus un problème car celle-ci est déconnectée automatiquement après un certain laps de temps.

Le fichier profile peut également être utilisé pour utiliser TMOUT :
Pour activer TMOUT à l'échelle du système pour tous les utilisateurs, définir la variable dans le fichier d'initialisation du shell /etc/profile.

Fonctionne sur le serveur pour l'utilisateur non sur élevé en droits et ferme le terminal :

Recharger le fichier profile :

Désactiver la déconnexion automatique TMOUT :

Vérifier les sessions en cours d'exécution :

Exemple de commande de connexion SSH au serveur en cas de port knocking :

Pour optimiser la sécurité du système d'exploitation, il est préférable de désactiver le mot de passe et de verrouiller l'utilisateur root une fois SSH configuré.

Erreur rencontrées

Proposition de correctif, manque de documentation :



Supprimer un utilisateur sur Linux

×✔ Supprimer un utilisateur sur Linux.

Supprimer un utilisateur sur Linux

Ne jamais supprimer l'utilisateur root.
Sous Linux (comme Unix), un grand nombre de processus système dépendent de la présence de l'utilisateur root dans la configuration du serveur.

Désactiver et bloquer l'utilisateur root

Créer un nouveau compte utilisateur avec les droits sudoer avant de désactiver l'utilisateur par défaut "root".
Voir l'étape précédente, Sécuriser la connexion SSH.

Supprimer le mot de passe de l'utilisateur root pour ne pas conserver le hash du mot de passe en mémoire :
Pour supprimer un mot de passe, utiliser "passwd -d ou --delete" :

Recréer un mot de passe pour réactiver l'utilisateur root si nécessaire :

Verrouiller un utilisateur

Le verrouillage d'un mot de passe empêche l'utilisateur de se connecter en utilisant son mot de passe.
L'utilisateur reste en mesure de se connecter en utilisant d'autres méthodes d'authentification.
Si l'utilisateur root est verrouillé de la sorte, il ne pourra pas executer toutes les tâches du système, des erreurs concernant les tâches cron seront affichées dans les logs de journalctl. Verrouiller un mot de passe avec "passwd -l ou --lock" et déverouiller avec "passwd -u ou --unlock":

Désactiver et supprimer un utilisateur Linux autre que root

Désactiver et supprimer un utilisateur nommé "debian".

Commenter les élévations de droit de l'utilisateur debian dans les fichiers présents dans le répertoire /etc/sudoers.d/ :

Avant de supprimer un utilisateur, il est important de verrouiller son compte.
La commande suivante verrouille le mot de passe de l'utilisateur debian et donc désactive le compte de l'utilisateur debian :

La commande suivante déverrouille le mot de passe, donc, déverrouille le compte de l'utilisateur debian.

Supprimer l'utilisateur debian et son répertoire "home" ainsi que sa boîte mail avec la commande userdel et l'option -r :

L'utilisateur debian est maintenant supprimé.

Verrouiller et déverrouiller les utilisateurs avec la commande chage

La commande chage est utilisée pour modifier les informations d'expiration du mot de passe utilisateur.
Fixer la date d'expiration au 1970-01-02 et verrouiller l'utilisateur avec 1 :

Supprimer la date d'expiration et déverrouiller l'utilisateur avec -1 :

Vérifier le statut d'un utilisateur avec la commande passwd

Vérifier si un utilisateur est verrouillé ou déverrouillé avec "passwd -S ou --status" :

Le deuxième champ dans la sortie indique le statut du compte :
– P ou PS : Le mot de passe est défini, l'utilisateur est déverrouillé.
– L ou LK : L'utilisateur est verrouillé.
– N ou NP : Aucun mot de passe n'est requis par l'utilisateur.



Utiliser le manuel de Linux

Le manuel de GNU/Linux recense l'ensemble des commandes de votre shell.
Il permet de comprendre les options des différentes commandes.