Poste de travail CentOS 7 + Xfce “aux petits oignons”

Logo CentOSCet article décrit pas à pas et de manière détaillée l’installation d’un poste de travail léger de qualité entreprise basé sur CentOS 7 et l’environnement de bureau Xfce. Pour plus de détails, lire la documentation officielle. CentOS 7 est officiellement supporté jusqu’au 30 juin 2024. On choisira cette branche sur du matériel raisonnablement récent qui supporte un OS 64-bits. L’installateur de CentOS 7 requiert au moins 1 Go de RAM. Sur une machine disposant de moins de mémoire vive ou dotée d’un processeur 32-bits, on pourra opter pour CentOS 6.

Note importante : l’article initialement publié fin 2017 a été entièrement revu et corrigé. La procédure de post-installation est maintenant bien plus simple, étant donné qu’elle est à peu près entièrement scriptée.

Pour en savoir plus sur la configuration de Xfce, on pourra lire cet article.

Xfce CentOS

Le poste de travail présenté ici offre une série d’améliorations par rapport à un poste de travail CentOS standard.

  • L’esthétique de l’environnement Xfce est améliorée de manière significative.
  • Plank, Whiskermenu et Caja rendent le bureau bien plus fonctionnel.
  • Une panoplie d’applications populaires est installée pour toutes les tâches courantes.
  • Les codecs et plug-ins multimédia permettent de gérer les contenus audio et vidéo.
  • Les polices TrueType offrent une meilleure interopérabilité avec l’univers Microsoft.
  • Infinality permet d’obtenir un affichage aussi net que sur les systèmes de chez Apple.

Support d’installation

On choisira le CD minimal, mais rien n’empêche d’utiliser le DVD.

  • CentOS-7-x86_64-Minimal-1708.iso
  • CentOS-7-x86_64-DVD-1708.iso

Graver le CD ou le DVD à partir de l’ISO téléchargé.

Sur les machines dépourvues de lecteur optique, il faudra confectionner une clé USB d’installation. L’image ISO est hybride et peut s’écrire directement sur une clé USB.

# dd if=CentOS-7-x86_64-Minimal-1708.iso of=/dev/sdX

Démarrage

Débrancher clés USB, disques externes et autres périphériques amovibles. Autrement l’installateur les proposera au formatage.

Sur un ordinateur portable, il vaut mieux passer par une connexion cablée le temps de l’installation. La connexion wifi sera réglée en mode graphique par NetworkManager une fois que le bureau sera installé.

Langue et clavier

Dans l’écran de bienvenue, sélectionner la langue (Français) et la localisation (Français – France). La disposition du clavier sera définie par le biais de l’écran principal de l’installateur.

Interfaces réseau

Le réseau n’est pas activé par défaut, il faut donc songer à l’activer explicitement.

Les noms des interfaces réseau ont changé avec cette nouvelle version. Désormais, on n’a plus affaire à eth0, eth1, eth2, wlan0, etc. Le nouveau schéma de nommage est moins arbitraire et offre davantage de consistance en se basant sur l’emplacement physique de la carte dans la machine.

  • enp2s0
  • enp3s0
  • enp3s1
  • etc.

Date et heure

Vérifier si le fuseau horaire (Europe/Paris) est correctement configuré. Éventuellement, activer Heure du réseau et vérifier les serveurs NTP.

Désactivation de Kdump

Kdump est un mécanisme de capture lors du plantage d’un noyau. Il peut être désactivé.

Partitionnement manuel

L’outil de partitionnement graphique de CentOS n’est pas très intuitif. Voici un exemple de schéma de partitionnement courant.

  • une partition /boot de 500 MiB, formatée en ext2
  • une partition /boot/efi de 100 MiB sur les systèmes EFI
  • une partition swap, équivalent à la RAM disponible
  • une partition principale, formatée en ext4

Sur une station de travail munie de deux disques durs, on choisira le RAID 1.

  1. Cliquer sur Destination de l’installation.
  2. Vérifier si le ou les disques durs sont bien sélectionnés.
  3. Cocher Je vais configurer le partitionnement et cliquer sur Terminé.
  4. Dans le menu déroulant, sélectionner Partition standard au lieu de LVM.

Partition /boot

La taille de la partition /boot sera relativement réduite. Il faudra veiller à ne pas laisser s’entasser les vieux kernels sous peine de la remplir assez rapidement.

  1. Cliquer sur le bouton “+” pour créer un nouveau point de montage.
  2. Créer le point de montage /boot avec une capacité de 500 MiB.
  3. Définir le type de périphérique standard ou RAID 1.
  4. Choisir le système de fichiers ext2 et l’étiquette boot.
  5. Confirmer Mise à jour des paramètres.

Partition EFI

Sur les systèmes UEFI, il faut créer un point de montage /boot/efi pour une partition de type EFI, au début du disque.

  1. Cliquer sur le bouton “+” pour créer un point de montage.
  2. Créer le point de montage /boot/efi et spécifier une taille de 100 MiB.
  3. Définir le type de périphérique standard.
  4. Choisir le système de fichiers EFI System Partition et l’étiquette efi.
  5. Confirmer Mise à jour des paramètres.

Partition swap

Dans certains cas, la partition swap pourra être reléguée à la fin du disque par l’installateur pour une utilisation optimale.

  1. Cliquer sur le bouton “+” pour créer un autre point de montage.
  2. Créer le point de montage swap en spécifiant sa capacité en GiB.
  3. Définir le type de périphérique standard ou RAID 1.
  4. Choisir l’étiquette swap.
  5. Confirmer Mise à jour des paramètres.

Partition principale

La partition principale occupera tout l’espace disque restant.

  1. Cliquer sur le bouton “+” pour créer un dernier point de montage.
  2. Créer le point de montage / sans spécifier la capacité souhaitée.
  3. Définir le type de périphérique standard ou RAID 1.
  4. Choisir le système de fichiers ext4 et l’étiquette root.
  5. Confirmer Mise à jour des paramètres, puis Terminé.

Choix des paquets

Dans l’écran de sélection des logiciels du DVD, on optera pour le groupe de paquets Installation minimale proposé par défaut. Le CD minimal ne laisse pas le choix de toute façon.

Utilisateur initial

Créer un utilisateur provisoire install. Éventuellement, cocher l’option Faire de cet utilisateur un administrateur pour l’ajouter au groupe wheel et lui permettre d’utiliser sudo. Cet utilisateur sera supprimé une fois l’installation terminée.

Configuration provisoire du réseau

L’installation par défaut ne fournit pas la commande ifconfig, qui fait partie du paquet net-tools. Dans un premier temps, il faudra afficher la configuration réseau en utilisant la commande ip fournie par le paquet iproute2.

# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
 ...
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
   qdisc mq state UP qlen 1000
 link/ether 2c:27:d7:15:54:a1 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.2/24 brd 192.168.1.255 scope global dynamic enp2s0
 ...
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
 ...
# ip route
default via 192.168.1.1 dev enp2s0

Récupérer le script de post-installation

L’utilitaire git ne fait pas partie d’une installation par défaut. Il va donc falloir l’installer.

# yum install git

Ensuite, récupérer le contenu de mon dépôt Github.

# cd
# git clone https://github.com/kikinovak/centos-7-desktop-xfce

Lancer le script de post-installation

Le répertoire centos-7-desktop-xfce contient un script postinstall.sh. Lancer ce script.

# cd centos-7-desktop-xfce
# ./postinstall.sh

L’affichage du script est assez laconique. Pour en savoir un peu plus sur le détail et la progression des opérations, on peut ouvrir un deuxième terminal et afficher le fichier journal “à chaud”, comme ceci.

# tail -f /tmp/postinstall.log

Le script se charge automatiquement des opérations suivantes.

  • Activer la gestion des Delta RPM.
  • Effectuer la mise à jour initiale du système.
  • Basculer SELinux en mode permissif.
  • Désactiver l’IPv6.
  • Personnaliser le shell Bash pour root et les utilisateurs.
  • Personnaliser la configuration de Vim.
  • Configurer les dépôts de paquets officiels de manière prioritaire.
  • Configurer les dépôts de paquets tiers : EPEL, Nux, Adobe, etc.
  • Installer une panoplie d’outils en ligne de commande.
  • Installer le serveur graphique X Window.
  • Installer l’environnement de bureau Xfce.
  • Supprimer une poignée de paquets inutiles.
  • Supprimer les polices TrueType exotiques qui encombrent les menus.
  • Installer une panoplie cohérente d’applications supplémentaires.
  • Personnaliser les entrées du menu Xfce
  • Installer le profil par défaut des nouveaux utilisateurs.
  • Installer une panoplie de polices TrueType avec le rendu Infinality.
  • Installer une collection de fonds d’écran.
  • Basculer en mode graphique au démarrage.

Remarque importante : SELinux est basculé en mode permissif de manière temporaire afin de permettre à l’administrateur de résoudre manuellement les éventuels blocages avant de rebasculer en mode renforcé.

Pour vous donner un ordre d’idée, j’ai testé le script sur une paire de vieux Dell Optiplex avec un processeur double coeur, 4 gigaoctets de RAM et une connexion ADLS à 20 Mbit/s, et ça a mouliné près de 40 minutes. Vous avez donc largement le temps de boire un ou deux cafés en attendant que ça défile.

Créer un ou plusieurs utilisateurs

Une fois que le script est arrivé à terme, on peut créer un nouvel utilisateur. Si vous souhaitez qu’il puisse utiliser sudo, ajoutez-le au groupe wheel.

# useradd -c "Nicolas Kovacs" kikinovak
# passwd kikinovak
# usermod -a -G wheel kikinovak

Redémarrez le PC, connectez-vous et supprimez l’utilisateur install provisoire.

# userdel -r install

Configurer le réseau sur un poste de travail

Dans la configuration par défaut, le réseau est géré par NetworkManager, qui est pratique sur un portable, mais ne sert pas à grand-chose sur un poste de travail ou une station de travail. Notons au passage que contrairement à ce qui se dit dans des blogs un peu partout sur le Web, NetworkManager n’est pas nécessaire pour la gestion du réseau. C’est juste une couche d’abstraction et de complexité supplémentaire, et dont on peut aisément se passer.

# systemctl stop NetworkManager
# yum remove NetworkManager

Voici un exemple de configuration simple.

# /etc/sysconfig/network-scripts/ifcfg-enp2s0
DEVICE=enp2s0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp

Si l’on gère les noms d’hôtes de manière centralisée avec Dnsmasq, il faut supprimer les occurrences correspondantes dans /etc/hosts.

# /etc/hosts
127.0.0.1 localhost.localdomain localhost

Le fichier /etc/hostname devra juste contenir ceci.

localhost

Configurer le réseau sur un portable

Sur un ordinateur portable, on utilisera le NetworkManager et l’applet correspondant network-manager-applet, qu’il faudra installer.

# yum install network-manager-applet

Pour éviter les conflits, il vaut mieux supprimer les fichiers ifcfg-<interface> dans /etc/sysconfig/network-scripts et garder uniquement ifcfg-lo. Ensuite, il suffit de vérifier si NetworkManager est actif.

# systemctl status NetworkManager

 

Publié dans CentOS, Documentation Microlinux | Marqué avec , | 9 commentaires

Les redirections

TerminalVoici le septième volet de mon cours d’introduction au shell Bash. La dernière fois, nous avons vu les expressions complexes. Aujourd’hui, nous abordons les redirections, qui sont couramment utilisées dans les commandes Unix.

Les redirections permettent…

  • de récupérer le résultat d’une ou plusieurs commandes dans un fichier ;
  • de faire lire un fichier à une commande.

Entrée et sorties standard des processus

Les processus Unix ont, par défaut, leur fichier terminal ouvert trois fois, sous trois descripteurs de fichiers différents : 0, 1 et 2.

Entrée standard

Le descripteur de fichier 0 est également nommé “entrée standard du processus”. Les processus qui attendent des informations de la part de l’utilisateur déclenchent une requête de lecture sur le descripteur 0. Si ce dernier est associé au terminal, cela se matérialise pour l’utilisateur par une demande de saisie au clavier.

Sortie standard

Le descripteur de fichier 1 est également nommé “sortie standard du processus”. Par convention, un processus qui souhaite envoyer un message résultat à l’utilisateur doit le faire transiter via le descripteur 1. Si ce dernier est associé au terminal, ce qui est le cas par défaut, cela se matérialise pour l’utilisateur par un affichage à l’écran.

Sortie d’erreur standard

Le descripteur de fichier 2 est également nommé “sortie d’erreur standard du processus”. Par convention, un processus qui souhaite envoyer un message d’erreur à l’utilisateur doit le faire transiter via le descripteur 2. Si ce dernier est associé au terminal, ce qui est le cas par défaut, cela se matérialise pour l’utilisateur par un affichage à l’écran.

Redirection des sorties en écriture

La redirection des sorties en écriture permet d’envoyer les affichages liés à un descripteur particulier non plus sur le terminal, mais dans un fichier.

$ commande 1> fichier

Cette commande peut s’écrire plus simplement.

$ commande > fichier

Voici un exemple.

$ touch fichier{1,2,3}
$ ls fichier?
fichier1 fichier2 fichier3
$ ls fichier? > liste
$ cat liste
fichier1
fichier2
fichier3

Si le fichier n’existe pas, il est créé. S’il existe déjà, il est écrasé.

La double redirection permet de concaténer les messages résultant d’une commande au contenu d’un fichier déjà existant.

$ commande 1>> fichier

Là encore, la commande peut s’écrire plus simplement.

$ commande >> fichier

Si le fichier n’existe pas, il est créé. S’il existe déjà, il est ouvert en mode ajout.

Dans l’exemple suivant, on va ajouter la date à la fin du fichier liste créé précédemment.

$ date
ven. janv. 12 15:47:59 CET 2018
$ date >> liste
$ cat liste
fichier1
fichier2
fichier3
ven. janv. 12 15:48:22 CET 2018

La redirection de la sortie d’erreur standard permet de récupérer les messages d’erreur dans un fichier. Les résultats restent à l’écran.

$ commande 2> fichier

Voici un exemple.

$ find / -name passwd 2> erreur
/usr/share/bash-completion/completions/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
$ cat erreur
find: ‘/var/cache/httpd’: Permission non accordée
find: ‘/var/cache/ldconfig’: Permission non accordée
find: ‘/var/cache/cups’: Permission non accordée
...

Là encore, la double redirection de la sortie d’erreur standard permet de concaténer les messages d’erreur d’une commande au contenu d’un fichier existant.

$ commande 2>> fichier

Dans l’exemple suivant, on va concaténer les messages d’erreur de la commande invalide ls -z à la fin du fichier erreur.

$ ls -z
ls : option invalide -- 'z'
Saisissez « ls --help » pour plus d'informations.
$ ls -z 2>> erreur
$ cat erreur
find: ‘/var/cache/httpd’: Permission non accordée
find: ‘/var/cache/ldconfig’: Permission non accordée
find: ‘/var/cache/cups’: Permission non accordée
...
find: ‘/proc/27895/map_files’: Permission non accordée
find: ‘/proc/27895/fdinfo’: Permission non accordée
find: ‘/proc/27895/ns’: Permission non accordée
ls : option invalide -- 'z'
Saisissez « ls --help » pour plus d'informations.

Il est possible de rediriger plusieurs descripteurs sur une même ligne de commande.

$ commande 1> fichier_a 2> fichier_b

Ou encore.

$ commande 2> fichier_b 1> fichier_a

Reprenons l’exemple de tout à l’heure.

$ find / -name passwd 1> resultat 2> erreur
$ cat resultat
/usr/share/bash-completion/completions/passwd
/usr/bin/passwd
/etc/passwd
/etc/pam.d/passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
$ head -n 3 erreur
find: ‘/var/cache/httpd’: Permission non accordée
find: ‘/var/cache/ldconfig’: Permission non accordée
find: ‘/var/cache/cups’: Permission non accordée

L’option noclobber du shell permet de se protéger d’un écrasement involontaire de fichier. Elle est désactivée par défaut.

$ set -o noclobber
$ date > resultat
bash: resultat : impossible d'écraser le fichier existant

Pour forcer l’écrasement il faudra utiliser le symbole de redirection >|.

$ date >| resultat
$ cat resultat
ven. janv. 12 16:02:42 CET 2018

Et voici comment on réactive l’écrasement des fichiers.

$ set +o noclobber

Toutes les plates-formes Unix possèdent un fichier spécial nommé /dev/null qui permet de faire disparaître les affichages. Ce fichier est géré comme un périphérique et n’a pas de notion de contenu. On peut donc considérer qu’il est toujours vide.

$ find / -name passwd 1> resultat 2> /dev/null

Redirection de l’entrée standard

La redirection de l’entrée standard concerne les commandes qui utilisent le descripteur 0, autrement dit celles qui déclenchent une saisie au clavier.

$ commande 0< fichier_message

Cette commande peut s’écrire plus simplement.

$ commande < fichier_message

Dans l’exemple qui suit, on va envoyer un mail à l’utilisateur glagaffe.

$ mail glagaffe
Subject: RDV
Rendez-vous au resto à 13h.
Nico
.
EOT

Pour mettre l’exemple ci-dessus en pratique, il faut que l’utilisateur glagaffe existe et que le serveur mail soit configuré pour la machine locale. Sur un système CentOS, on pourra faire ceci.

# useradd -c "Gaston Lagaffe" glagaffe
# passwd lagaffe
# yum install postfix mailx mutt
# systemctl start postfix

Et pour lire le mail, on pourra s’y prendre comme ceci.

$ su - glagaffe
$ mutt

La commande mail lit l’entrée standard jusqu’à la saisie d’un point . sur une ligne. Les données saisies seront envoyées dans la boîte aux lettres de l’utilisateur glagaffe.

Si l’on souhaite faire lire à la commande mail non plus le clavier mais le contenu d’un fichier, il suffit de connecter le descripteur 0 sur le fichier désiré.

$ cat message
RDV au resto à 13h.
Nico
$ mail -s "RDV" glagaffe < message

Redirections avancées

Pour envoyer la sortie standard et la sortie d’erreur standard dans le même fichier, il faut employer une syntaxe particulière.

$ commande 1> fichier 2>&1

Ou encore…

$ commande 2> fichier 1>&2

Au quotidien, on utilisera plutôt la syntaxe suivante.

$ commande > fichier 2>&1

Reprenons l’exemple de tout à l’heure.

$ find / -name passwd > resultat 2>&1
$ cat resultat
...
/usr/bin/passwd
find: ‘/boot/lost+found’: Permission non accordée
find: ‘/boot/grub2’: Permission non accordée
find: ‘/root’: Permission non accordée

La double redirection en lecture est principalement utilisée dans les scripts shell. Elle permet de connecter l’entrée standard d’une commande sur une portion du script.

$ commande <<ETIQUETTE
données
données
données
ETIQUETTE

Le symbole placé à la suite des caractères << est une déclaration d’étiquette. Elle sera utilisée pour marquer la fin des données à lire. Les lignes insérées entre les deux mots ETIQUETTE seront envoyées sur l’entrée standard de la commande.

Voici un exemple.

$ mail -s "RDV" glagaffe <<FIN
> Rendez-vous au resto à 13h.
> Nico
> FIN

Notez que les étiquettes doivent être immédiatement suivies d’un retour à la ligne.

Rediriger la sortie de la commande ls

Vous avez peut-être essayé de rediriger le résultat de la commande ls comme ceci.

$ ls /etc > config.txt

Le résultat de l’opération est quelque peu inattendu.

$ cat config.txt
adjtime
aliases
aliases.db
alternatives
anacrontab
asound.conf
...

La différence entre les affichages respectifs tient au fait que les développeurs de l’outil ls se sont dit qu’avec un affichage à l’écran, vous préfériez probablement une vue en colonnes, alors que pour une redirection, un affichage avec un élément par ligne serait préférable.

Si l’on souhaite préserver les colonnes dans la redirection, il faut donc l’expliciter à l’aide de l’option -C.

$ ls -C /etc > config.txt
$ cat config.txt
adjtime                  init.d                    qemu-ga
aliases                  inittab                   rc0.d
aliases.db               inputrc                   rc1.d
alternatives             iproute2                  rc2.d
...

En contrepartie, pour être sûr d’obtenir un affichage avec un élément par ligne, on pourra utiliser l’option -1.

$ ls -1 /etc > config.txt

Connecter deux programmes

Dans l’exemple suivant, on prend le résultat d’une commande pour le fournir à une autre commande. Dans un premier temps, on écrit la liste en vrac de tous les paquets du système dans un fichier.

$ rpm -qa > rpms_vrac.txt

Cette liste peut être classée par ordre alphabétique grâce à la commande sort.

$ sort < rpms_vrac.txt

Enfin, le résultat de cette dernière commande peut à son tour être écrit dans un fichier.

$ sort < rpms_vrac.txt > rpms.txt

Voilà ce que ça donne.

$ head rpms.txt
acl-2.2.51-12.el7.x86_64
aic94xx-firmware-30-6.el7.noarch
alsa-firmware-1.0.28-2.el7.noarch
alsa-lib-1.1.3-3.el7.x86_64
alsa-tools-firmware-1.1.0-1.el7.x86_64
audit-2.7.6-3.el7.x86_64
audit-libs-2.7.6-3.el7.x86_64
authconfig-6.2.8-30.el7.x86_64
basesystem-10.0-7.el7.centos.noarch
bash-4.2.46-28.el7.x86_64

Notons que ce genre d’opération s’effectuera plutôt avec des tubes, que nous aborderons dans la prochaine leçon.

Enregistrer une séquence de commandes

Le caractère spécial ; du shell permet d’écrire plusieurs commandes sur une même ligne. Les commandes sont exécutées séquentiellement.

$ date ; pwd ; ls
sam. janv. 13 08:23:43 CET 2018
/home/kikinovak
config.txt message resultat rpms.txt rpms_vrac.txt

Si l’on cherche à enregistrer le résultat de cette séquence, on n’obtient pas le résultat escompté.

$ date ; pwd ; ls > sequence.txt
sam. janv. 13 08:24:50 CET 2018
/home/kikinovak

Les deux premières commandes affichent leur résultat à l’écran, et seule la dernière est redirigée.

La solution consiste ici à utiliser une paire d’accolades {...} pour regrouper les commandes.

$ { date ; pwd ; ls ; } > sequence.txt

Notez bien le caractère ; après la dernière commande.

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 38 – 55
  • Cameron Newham – Learning the Bash shell, pp. 14 – 16
  • Carl Albing – Bash Cookbook – pp. 33 – 44

La suite au prochain numéro.

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Un commentaire

Expressions complexes

TerminalVoici le sixième volet de mon cours d’introduction au shell Bash. La dernière fois, nous avons vu la substitution de noms de fichiers. Aujourd’hui, nous abordons les expressions complexes (extended pattern matching dans la documentation anglophone).

Prérequis

Pour utiliser les expressions complexes en Bash, il faut préalablement activer l’option extglob avec la commande suivante.

$ shopt -s extglob

Créer une série de fichiers que nous utiliserons dans les exemples suivants.

$ touch fic fic866866.log fic866.log fic868.log readme.txt \
  fic866866866.log fic866868.log fic867.log fic.log typescript

L’expression ?(…)

L’expression ?(expression) sera présente 0 ou 1 fois.

Fichiers dont le nom commence par fic suivi de 0 ou 1 occurrence de 866, suivi de .log.

$ ls fic?(866).log
fic866.log fic.log

L’expression *(…)

L’expression *(expression) sera présente entre 0 et n fois.

Fichiers dont le nom commence par fic, suivi de 0 à n occurrence(s) de 866, suivi de .log.

$ ls fic*(866).log
fic866866866.log fic866866.log fic866.log fic.log

L’expression +(…)

L’expression +(expression) sera présente entre 1 et n fois.

Fichiers dont le nom commence par fic, suivi d’au moins une occurrence de 866, suivi de .log.

$ ls fic+(866).log
fic866866866.log fic866866.log fic866.log

L’expression @(…)

L’expression @(expression) sera présente exactement 1 fois.

Fichiers dont le nom commence par fic, suivi exactement d’une occurrence de 866, suivi de .log.

$ ls fic@(866).log
fic866.log

L’expression !(…)

L’expression !(expression) ne sera pas présente.

Fichiers dont le nom commence par fic, suivi d’une expression qui n’est pas la chaîne 866, suivi de .log.

$ ls fic!(866).log
fic866866866.log fic866866.log fic866868.log fic867.log fic868.log
fic.log

Fichiers dont le nom ne commence pas par fic.

$ ls !(fic*)
readme.txt typescript

Alternatives

Une barre verticale | à l’intérieur d’une expression complexe prend le sens de “ou bien”.

Fichiers dont le nom commence par fic, suivi de 866 ou 867, suivi de .log.

$ ls fic@(866|867).log
fic866.log fic867.log

Fichiers dont le nom commence par fic, suivi de 1 à n occurrence(s) de 866 ou 868, suivi de .log.

$ ls fic+(866|868).log
fic866866866.log fic866866.log fic866868.log fic866.log fic868.log

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 34 – 37
  • Cameron Newham – Learning the Bash shell, p. 99
  • Carl Albing – Bash Cookbook, p. 122

Lire la suite : Les redirections

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Laisser un commentaire

Poste de travail CentOS 6 + GNOME “aux petits oignons”

centos-logoCette page décrit de manière succincte l’installation d’un poste de travail de qualité entreprise basé sur CentOS 6 32-bits et l’environnement de bureau GNOME. Pour plus de détails, lire la documentation officielle. CentOS 6 est officiellement supporté jusqu’au 30 novembre 2020. On choisira cette branche sur du matériel obsolète qui ne supporte pas un OS 64-bits, comme par exemple les machines dotées de processeurs Intel Atom 32-bits ou Pentium-IV. L’installateur de CentOS requiert au moins 632 Mo de RAM.

Note importante : l’article initialement publié en janvier 2017 a été entièrement revu et corrigé. La procédure de post-installation est maintenant bien plus simple, étant donné qu’elle est à peu près entièrement scriptée.

CentOS 6 GNOME

Le poste de travail présenté ici offre une série d’améliorations par rapport à un poste de travail CentOS standard.

  • L’environnement de bureau GNOME est plus agréable à l’oeil.
  • Une panoplie d’applications populaires est installée pour toutes les tâches courantes.
  • Les codecs et plug-ins multimédia permettent de gérer les contenus audio et vidéo.
  • Les polices TrueType offrent une meilleure interopérabilité avec l’univers Microsoft.
  • Infinality permet d’obtenir un affichage aussi net que sur les systèmes de chez Apple.

Support d’installation

Pour l’installation d’un poste de travail, on choisira le DVD.

  • CentOS-6.9-i386-bin-DVD1.iso

Graver le DVD à partir de l’ISO téléchargé.

Sur les machines dépourvues de lecteur optique, il faudra confectionner une clé USB d’installation. Depuis CentOS 6.5, l’image ISO est hybride et peut s’écrire directement sur une clé.

# dd if=CentOS-6.9-i386-DVD1.iso of=/dev/sdX

Démarrage

Débrancher clés USB, disques externes et autres périphériques amovibles. Autrement l’installateur les proposera au formatage.

Depuis la version 6.0, l’installateur en mode texte est tronqué de quelques fonctionnalités essentielles comme le partitionnement personnalisé. Il faut donc utiliser l’installateur graphique proposé par défaut.

Sur un ordinateur portable, il vaut mieux passer par une connexion cablée le temps de l’installation. La connexion wifi sera réglée en mode graphique par NetworkManager une fois que le bureau sera installé.

Partitionnement

Choisir l’option Créer un partitionnement personnalisé.

  • une partition /boot de 200 Mo, formatée en ext2
  • une partition d’échange égale à la quantité de RAM
  • une partition principale formatée en ext4

Réseau

Le réseau n’est pas activé par défaut, il faut donc songer à l’activer explicitement. Cliquer sur Configurer le réseau, sélectionner l’interface réseau que l’on souhaite configurer, cliquer sur Modifier et cocher la case Connecter automatiquement. Dans la configuration par défaut, le réseau est géré par NetworkManager. On pourra peaufiner cette configuration par la suite.

Choix des paquets

Opter pour la sélection Minimal Desktop.

Redémarrage initial

Accepter le contrat de licence, créer un utilisateur install initial et désactiver Kdump.

Récupérer le script de post-installation

L’utilitaire git ne fait pas partie d’une installation par défaut. Il va donc falloir l’installer.

# yum install git

Ensuite, récupérer le contenu de mon dépôt Github.

# cd
# git clone https://github.com/kikinovak/centos-6-desktop-gnome

Si l’on souhaite récupérer le dépôt en lecture/écriture, il faudra invoquer la commande comme ceci.

# git clone https://kikinovak@github.com/kikinovak/...

Il se peut qu’on se retrouve confronté au message d’erreur suivant.

(gnome-ssh-askpass:2340): Gtk-WARNING **: cannot open display
SSH_ASKPASS :

Dans ce cas, il suffit de supprimer la variable d’environnement SSH_ASKPASS.

# unset SSH_ASKPASS

Lancer le script de post-installation

Le répertoire centos-6-desktop-gnome contient un script postinstall.sh. Lancer ce script.

# cd centos-6-desktop-gnome
# ./postinstall.sh

L’affichage du script est assez laconique. Pour en savoir un peu plus sur le détail et la progression des opérations, on peut ouvrir un deuxième terminal et afficher le fichier journal “à chaud”, comme ceci.

# tail -f /tmp/postinstall.log

Le script se charge automatiquement des opérations suivantes.

  • Effectuer la mise à jour initiale du système.
  • Basculer SELinux en mode permissif.
  • Désactiver l’IPv6.
  • Personnaliser le shell Bash pour root et les utilisateurs.
  • Personnaliser la configuration de Vim.
  • Configurer les dépôts de paquets officiels de manière prioritaire.
  • Configurer les dépôts de paquets tiers : EPEL, Nux, Adobe, etc.
  • Installer une panoplie d’outils en ligne de commande.
  • Supprimer les applications inutiles.
  • Supprimer les polices TrueType exotiques qui encombrent les menus.
  • Installer une panoplie cohérente d’applications supplémentaires
  • Personnaliser les entrées du menu GNOME
  • Installer le profil par défaut des nouveaux utilisateurs.
  • Installer une panoplie de polices TrueType avec le rendu Infinality.
  • Installer une collection de fonds d’écran.

Remarque importante : SELinux est basculé en mode permissif de manière temporaire afin de permettre à l’administrateur de résoudre manuellement les éventuels blocages avant de rebasculer en mode renforcé.

Pour vous donner un ordre d’idée, j’ai testé le script sur une paire de vieux Dell Optiplex avec un processeur double coeur, 4 gigaoctets de RAM et une connexion ADLS à 20 Mbit/s, et ça a mouliné une bonne demi-heure. Vous avez donc largement le temps de boire un ou deux cafés en attendant que ça défile.

Créer un ou plusieurs utilisateurs

Une fois que le script est arrivé à terme, on peut créer un nouvel utilisateur. Si vous souhaitez qu’il puisse utiliser sudo, ajoutez-le au groupe wheel.

# useradd -c "Nicolas Kovacs" kikinovak
# passwd kikinovak
# usermod -a -G wheel kikinovak

Redémarrez le PC, connectez-vous et supprimez l’utilisateur install provisoire.

# userdel -r install

Configurer le réseau sur un poste de travail

Dans la configuration par défaut, aucune interface réseau à part lo n’est activée, et le réseau est géré par NetworkManager, dont on n’a pas forcément besoin sur un poste de travail.

# service NetworkManager stop
# chkconfig NetworkManager off

Voici un exemple de configuration simple.

# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp

Si l’on gère les noms d’hôtes de manière centralisée avec Dnsmasq, il faut supprimer les occurrences correspondantes dans /etc/hosts :

# /etc/hosts
127.0.0.1   localhost.localdomain localhost 

Le fichier /etc/sysconfig/network devra contenir ceci :

# /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost

Prendre en compte les modifications :

# service network restart

Configurer le réseau sur un portable

Sur un ordinateur portable, on utilisera le NetworkManager et l’applet correspondant NetworkManager-gnome. Pour éviter les conflits, il vaut mieux supprimer les fichiers ifcfg-<interface> dans /etc/sysconfig/network-scripts et garder uniquement ifcfg-lo. Ensuite, il suffit de vérifier si NetworkManager est actif.

# chkconfig --list NetworkManager

Désactiver les services inutiles

Lancer l’interface de configuration des services au démarrage.

# ntsysv --level 2345

Désactiver quelques services inutiles selon la configuration.

  • ip6tables
  • lvm2-monitor (si l’on n’utilise pas le LVM)
  • mdmonitor (si l’on n’utilise pas le RAID)
  • postfix

Compiz

Sur les machines équipées d’une carte graphique raisonnablement performante, on peut activer les effets 3D.

# yum install compiz-gnome

Pour activer Compiz, aller dans Système > Préférences > Effets du bureau > Compiz

CentOS 6 Compiz

Configuration de GNOME 2.28

GNOME Terminal :

  • Police : Fixed 12.
  • Définir la taille adaptée du terminal
  • Palettes prédéfinies du premier plan et de l’arrière plan : Gris sur noir.
  • Palette de couleurs : Tango.
  • Arrière-plan transparent 80 %.
  • Désactiver la barre de défilement.

Système > Préférences > Apparence :

  • Thème : Clearlooks > Personnaliser
  • Contrôles : MurrinaGilouche
  • Bordures de fenêtres : Bluecurve
  • Icônes : Elementary Xfce
  • Pointeur : dmz
  • Arrière-plan : par défaut

Système > Préférences > Applications préférées :

  • Navigateur Web : Firefox
  • Logiciel de messagerie : Thunderbird

Système > Préférences > Économiseur d’écran :

  • Thème Cosmos.
  • Considérer l’ordinateur inactif après : 30 minutes

Système > Préférences > Gestion des fichiers :

  • Comportement : Toujours ouvrir dans des fenêtres de navigation
  • Inclure une commande Supprimer qui ignore la corbeille

Tableau de bord supérieur :

  • Lanceurs rapides : Firefox, Thunderbird, LibreOffice, Nautilus
  • Verrouiller les lanceurs rapides au tableau de bord.

Supprimer les icônes Poste de Travail, Dossier personnel et Corbeille du bureau :

$ gconf-editor

Ouvrir apps > nautilus > desktop et décocher :

  • [ ] computer_icon_visible
  • [ ] home_icon_visible
  • [ ] trash_icon_visible

GNOME enregistre tous les réglages individuel dans ~/.gconf/. Il suffit de copier cette arborescence vers /etc/skel/ avant de créer un nouvel utilisateur.

Publié dans CentOS, Documentation Microlinux | Marqué avec , , | Laisser un commentaire

Substitution de noms de fichiers

TerminalVoici le cinquième volet de mon cours d’introduction au shell Bash. La dernière fois, nous avons vu en détail la navigation dans les répertoires. Aujourd’hui, nous abordons la substitution de noms de fichiers.

De nombreuses commandes prennent des noms de fichiers en argument. Ces derniers peuvent être cités littéralement ou être spécifiés de manière plus générique. Le shell propose un certain nombre de caractères spéciaux qui permettent de fabriquer des expressions utilisées comme modèles de noms de fichiers.

Le caractère *

Le caractère * représente une suite de caractères quelconques. Pour commencer, créer une série de fichiers.

$ touch f12 f1.i FICa fic.c fic.s monscript.pl MONSCRIPT.pl ours.c

Afficher tous les noms de fichier se terminant par .c.

$ ls *.c
fic.c ours.c

Afficher tous les noms de fichier commençant par la lettre f.

$ ls f*
f12 f1.i fic.c fic.s

Le caractère ?

Le caractère ? représente un caractère quelconque. Là encore, on essaiera d’illustrer par l’exemple.

Afficher tous les noms de fichier ayant une extension composée d’un seul caractère.

$ ls *.?
f1.i fic.c fic.s ours.c

Afficher tous les noms de fichier composés de quatre caractères.

$ ls ????
f1.i FICa

Les crochets [ ]

Les crochets [ ] permettent de spécifier la liste des caractères que l’on attend à une position bien précise dans le nom du fichier. Il est également possible d’utiliser les notions d’intervalle et de négation.

Les exemples cités ci-dessous peuvent produire des résultats surprenants en fonction des variables d’environnement. Le cas échéant, on devra modifier une paire de ces variables.

$ LANG=C
$ LC_COLLATE=C

Pour chacun des exemples, une alternative est donnée qui fonctionne parfaitement pour des variables d’environnement LANG et LC_COLLATE différentes, par exemple fr_FR.utf8.

Fichiers dont le nom commence par f ou o et se termine par le caractère . suivi d’une minuscule.

$ ls [fo]*.[a-z]
f1.i fic.c fic.s ours.c

Alternativement…

$ ls [fo]*.[[:lower:]]
f1.i fic.c fic.s ours.c

Fichiers dont le nom comporte en deuxième caractère une majuscule ou un chiffre ou la lettre i. Les deux premiers caractères seront suivis d’une chaîne quelconque.

$ ls ?[A-Z0-9i]*
FICa MONSCRIPT.pl f1.i f12 fic.c fic.s

Alternativement…

$ ls ?[[:upper:]0-9i]*
f12 f1.i FICa fic.c fic.s MONSCRIPT.pl

Il est également possible d’exprimer la négation de tous les caractères spécifiés à l’intérieur d’une paire de crochets. Ceci se fait en plaçant un ! en première position à l’intérieur de celle-ci.

Noms de fichier ne commençant pas par une minuscule.

$ ls [!a-z]*
FICa MONSCRIPT.pl

Alternativement…

$ ls [![:lower:]]*
FICa MONSCRIPT.pl

Noms de fichier ne commençant pas par une majuscule.

$ ls [!A-Z]*
f1.i f12 fic.c fic.s monscript.pl ours.c

Alternativement…

$ ls [![:upper:]]*
f12 f1.i fic.c fic.s monscript.pl ours.c

Supprimer tous les fichiers dont le nom se termine par .c ou par .s.

$ rm -i *.c *.s
rm : supprimer fichier « fic.c » ? o
rm : supprimer fichier « ours.c » ? o
rm : supprimer fichier « fic.s » ? o

Les fichiers cachés dans la pratique

Un cas spécial mérite d’être mentionné, celui des fichiers cachés. Si l’on applique la substitution des noms de fichiers à cette catégorie de fichiers, on risque d’obtenir des résultats surprenants. Là encore, on va préférer un cas pratique à la théorie.

Créez une série de six fichiers fic1, fic2, fic3, .fic1, .fic2 et .fic3 dans un répertoire vide. Voici la manière la plus rapide de faire ceci.

$ touch {,.}fic{1,2,3}
$ ls -a
.  ..  .fic1  .fic2  .fic3  fic1  fic2  fic3

Si l’on essaie d’afficher uniquement les fichiers cachés à l’aide d’un caractère de substitution, on risque d’être quelque peu surpris par le résultat. Essayez pour voir.

$ ls .*

Au vu de la manière dont le shell traite les caractères de substitution, la séquence .* englobe également le répertoire parent .. qui s’affiche donc de manière apparemment intempestive.

La solution consiste ici à utiliser l’option -d conjointement avec les autres critères.

$ ls -d .*
.  ..  .fic1  .fic2  .fic3
$ ls -d .f*
.fic1  .fic2  .fic3

Une solution alternative consiste à exclure le répertoire parent comme ceci.

$ ls .[!.]*
.fic1  .fic2  .fic3

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 32 – 34
  • Carl Albing – Bash Cookbook, pp. 10 – 12

Lire la suite : Expressions complexes

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Laisser un commentaire

Naviguer dans les répertoires

TerminalVoici le quatrième volet de mon cours d’introduction au shell Bash. La dernière fois, nous avons vu l’affichage à l’écran. Aujourd’hui, nous abordons certains aspects de la navigation dans l’arborescence des répertoires.

Le caractère ~

Le caractère ~ (tilde) représente le répertoire d’accueil de l’utilisateur courant.

$ whoami
kikinovak
$ cd ~
$ pwd
/home/kikinovak
$ ls ~/ISO
CentOS  Debian  Mageia  Neon  PopOS  Slax  SolydK  Ubuntu

Si le caractère ~ est immédiatement suivi d’un mot, ce dernier est considéré comme un nom d’utilisateur.

# pwd
/root
# cd ~microlinux
# pwd
/home/microlinux

La commande interne cd

La commande cd sans argument permet à l’utilisateur de revenir dans son répertoire d’accueil.

$ cd
$ pwd
/home/kikinovak

Comme nous venons de le voir, on peut effectuer la même opération en utilisant le caractère ~, qui représente le répertoire d’accueil de l’utilisateur courant.

$ cd ~
$ pwd
/home/kikinovak

L’option - permet de revenir dans le répertoire précédent.

$ pwd
/home/kikinovak
$ cd /tmp/
$ pwd
/tmp
$ cd -
/home/kikinovak
$ pwd
/home/kikinovak

Gérer une pile de répertoires avec pushd et popd

La commande cd avec l’option - est très pratique pour revenir dans le répertoire précédent. Or, il peut s’avérer pratique d’empiler les chemins pour les réutiliser par la suite. Dans ce cas, on utilisera les commandes pushd, popd et dirs pour gérer les piles de répertoire, comme le montre l’exemple suivant.

$ pwd
/home/kikinovak
$ pushd /tmp/
/tmp ~
$ pushd /var/log/
/var/log /tmp ~
$ pushd /usr/bin/
/usr/bin /var/log /tmp ~
$ dirs
/usr/bin /var/log /tmp ~
$ popd
/var/log /tmp ~
$ popd
/tmp ~
$ popd
~
$ pwd
/home/kikinovak

Chaque invocation de pushd ajoute un chemin à la pile de répertoires. En contrepartie, popd enlève un chemin à cette pile et revient dans le répertoire précédent sur la pile. Quant à la commande dirs, elle sert tout simplement à afficher la pile.

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 30 – 31
  • Cameron Newham – Learning the Bash shell, pp. 7 – 10
  • Carl Albing – Bash Cookbook, pp. 453 – 455

Lire la suite : Substitution de noms de fichiers

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Laisser un commentaire

L’affichage à l’écran

TerminalVoici le troisième volet de mon cours d’introduction au shell Bash. La dernière fois, nous avons vu les commandes internes et externes. Aujourd’hui, nous abordons les différentes manières d’afficher des informations à l’écran.

La commande echo

La commande interne echo permet de réaliser des affichages à l’écran.

$ echo Yatahongaga !
Yatahongaga !

Ce qui suit la commande echo est considéré comme un argument ou une série d’arguments. L’affichage sera donc traité en conséquence.

$ echo Du   texte   avec   des   espaces
Du texte avec des espaces

Pour préserver l’espacement, il faudra utiliser des guillemets ou des apostrophes.

$ echo "Du   texte   avec   des   espaces"
Du   texte   avec   des   espaces
$ echo 'Du   texte   avec   des   espaces'
Du   texte   avec   des   espaces

La commande echo du shell Bash doit être utilisée avec l’option -e pour que l’interprétation des caractères d’échappement ait lieu. Pour plus de détails, voir man echo.

Le caractère \n

Le caractère \n sert à provoquer un saut de ligne.

$ echo -e "Première ligne\nDeuxième ligne\nTroisième ligne"
Première ligne
Deuxième ligne
Troisième ligne

On peut également utiliser des apostrophes au lieu des guillemets.

$ echo -e 'Première ligne\nDeuxième ligne\nTroisième ligne'
Première ligne
Deuxième ligne
Troisième ligne

Le caractère \c

Le caractère \c sert à éliminer le saut de ligne naturel de la commande echo. Il doit se situer impérativement en dernière position de l’argument de echo, juste avant le guillemet fermant. L’option -e est indispensable pour l’interprétation du caractère d’échappement \c.

$ echo "Première ligne" ; echo "Deuxième ligne"
Première ligne
Deuxième ligne
$ echo -e "Première ligne\c" ; echo -e "Deuxième ligne\c"
Première ligneDeuxième ligne $

Alternativement, l’option -n peut remplacer le caractère \c.

$ echo -n "Première ligne" ; echo -n "Deuxième ligne"
Première ligneDeuxième ligne $

Le caractère \t

Le caractère \t permet d’afficher une tabulation.

$ echo -e "|\tTab 1\tTab 2\tTab 3\tTab 4\t|"
|    Tab 1    Tab 2    Tab 3    Tab 4    |

Pour aller plus loin

À partir du moment où l’on souhaite contrôler davantage le formatage de l’affichage du shell, on utilisera la commande printf. Nous l’aborderons plus loin, étant donné qu’elle est un peu “pointue” à manipuler. Pour l’instant, nous allons faire avec les moyens de bord et utiliser echo avec la poignée d’options de mise en forme que nous venons de voir.

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 27 – 30
  • Carl Albing – Bash Cookbook, pp. 28 – 33

Lire la suite : Naviguer dans les répertoires

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Un commentaire

Commandes internes et externes

TerminalVoici le deuxième volet de mon cours d’introduction au shell Bash. Après avoir vu l’historique du shell, nous abordons aujourd’hui la différence entre les commandes externes et les commandes internes.

Une commande Linux appartient à l’une des deux catégories suivantes.

  1. commandes externes
  2. commandes internes

Les commandes externes

Une commande externe est un fichier localisé dans l’arborescence. Par exemple, lorsqu’un utilisateur lance la commande ls, le shell demande au noyau Linux de charger en mémoire le fichier /bin/ls.

Sont considérées comme commandes externes les fichiers possédant l’un des formats suivants.

  • fichiers au format binaire exécutable
  • fichiers au format texte représentant un script de commandes

La commande file donne une indication sur le type de données contenues dans un fichier. L’argument de la commande file est un nom de fichier exprimé en relatif ou en absolu. Voici deux exemples.

La commande ls est un fichier au format binaire exécutable.

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.32, 
BuildID[sha1]=3d705971a4c4544545cb78fd890d27bf792af6d4, stripped

La commande gettext.sh est un script shell.

$ file /usr/bin/gettext.sh
/usr/bin/gettext.sh: POSIX shell script, ASCII text executable

Les commandes internes

Une commande interne est intégrée au processus shell. Elle ne correspond donc en aucun cas à un fichier sur le disque.

La commande type indique si une commande possède une implémentation interne. Elle prend en argument le nom d’une commande. Si cette dernière n’est pas interne, elle est recherchée dans les répertoires cités dans PATH. Voici deux exemples.

La commande cd est une commande interne.

$ type cd
cd est une primitive du shell

La commande ls est une commande externe.

$ type -a ls
ls est un alias vers « ls --color=auto »
ls est /usr/bin/ls
ls est /bin/ls

Ici on invoque l’option -a pour afficher les infos sur l’ensemble des exécutables nommés ls. Pour plus d’infos, voir man bash.

Implémentation interne et externe

Certaines commandes ont une implémentation interne et une implémentation externe. Dans ce cas, la commande interne est lancée en priorité. L’exécution d’une commande interne est plus rapide que l’exécution d’une commande externe.

La commande pwd est une commande interne au shell.

$ type pwd
pwd est une primitive du shell

Elle possède également une implémentation externe.

$ type -a pwd
pwd est une primitive du shell
pwd est /usr/bin/pwd
pwd est /bin/pwd

C’est la commande interne qui est exécutée en priorité.

$ pwd
/home/kikinovak

Pour forcer l’exécution de la commande externe, il faut indiquer explicitement l’emplacement de la commande, en absolu ou en relatif.

$ /usr/bin/pwd 
/home/kikinovak
$ cd /usr/bin/
$ ./pwd 
/usr/bin

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 23 – 26
  • Carl Albing – Bash Cookbook, pp. 13 – 14

Lire la suite : L’affichage à l’écran

Publié dans Bash, Documentation Microlinux | Marqué avec , , | 2 commentaires

Abonnez-vous à la newsletter de Microlinux

La newsletter de Microlinux est une publication épisodique qui vous parle de l’actualité numérique en général et celle de Microlinux en particulier, dans un langage accessible à tous. Et oui, c’est gratuit. Abonnez-vous ici.

Newsletter

Publié dans Divers | Marqué avec | Laisser un commentaire

Qu’est-ce que le shell ?

TerminalComme la plupart des administrateurs Linux, j’ai appris à me servir du shell Bash “sur le tas”, en lisant de la documentation et des tutos, en recopiant des scripts shell et en les adaptant à ma sauce, avec une bonne dose de tentative et échec. Au fil des années, j’ai rédigé une floppée de scripts Bash, sans avoir jamais appris de manière formelle à le faire. Depuis quelque temps, je me suis dit que ça serait peut-être une bonne idée de mettre un peu d’ordre dans tout ça. On va donc tenter d’expliquer le shell Bash aux débutants, en commençant par le début, en mettant un pied devant l’autre et en terminant par la fin. Suivez le guide, et on verra ce que ça donne en cours de route.

Définition du shell

Le shell est un programme ayant pour fonction d’assurer l’interface entre l’utilisateur et le système Linux. C’est un interpréteur de commandes. Autrement dit, c’est quelque chose qui vous permet de communiquer avec l’ordinateur par le biais du clavier et de l’écran. Le shell est donc la partie du système qui vous permet de saisir des commandes.

Si vous savez invoquer des commandes dans un shell, vous êtes capable d’écrire un script shell (ou script Bash, puisque nous parlons ici du shell Bash). Un script shell, c’est tout simplement une série de commandes écrites dans un fichier. Le shell lit les commandes depuis le fichier comme si vous les invoquiez directement dans un terminal.

Il y donc deux manières d’utiliser Bash :

  • comme interface utilisateur ;
  • comme environnement de programmation.

Plusieurs shells sont disponibles sur les plates-formes Linux.

Caractéristiques du shell

Les interpréteurs de commandes disponibles en environnement Unix et Linux ont en commun les fonctionnalités suivantes.

  • Ils proposent un jeu de caractères spéciaux permettant de déclencher des actions particulières.
  • Ils possèdent des commandes internes et des mots clés parmi lesquels certains sont utilisés pour faire de la programmation.
  • Ils utilisent des fichiers d’initialisation permettant à un utilisateur de paramétrer son environnement de travail.

Chaque shell propose ses propres caractères spéciaux, commandes internes, mots clés et fichiers de paramétrage. Heureusement, les interpréteurs les plus utilisés actuellement dérivent tous du shell Bourne et ont, par conséquent, un certain nombre de fonctionnalités en commun.

Historique du shell

Le shell qui est considéré comme le plus ancien est le Bourne Shell (sh). Il a été écrit dans les années 1970 par Steve Bourne aux laboratoires AT&T. Outre sa capacité à lancer des commandes, il offre des fonctionnalités de programmation. Le Bourne Shell est un shell ancien qui est de moins en moins utilisé sur les plates-formes Unix.

Durant la même période, Bill Joy invente le C-Shell (csh), incompatible avec le Bourne Shell, mais qui offre des fonctionnalités supplémentaires telles que l’historique des commandes, le contrôle des tâches ou la possibilité de créer des alias de commandes. Ces trois aspects seront repris plus tard dans le Korn Shell. Le C-Shell est peu utilisé dans le monde Unix.

En 1983, David Korn reprend le Bourne Shell et l’enrichit. Ce nouvel interpréteur prendra le nom de Korn Shell (ksh). Il sera de plus en plus employé et deviendra un standard de fait. Le ksh88 (version datant de 1988) est, avec le Bourne Again Shell, le shell le plus utilisé actuellement. Il a servi de base à la normalisation POSIX du shell.

En 1993, une nouvelle version du Korn Shell voit le jour (ksh93). Celle-ci présente une compatibilité arrière avec le ksh88, à quelques exceptions près. Le ksh93 est disponible sur certaines versions Unix récentes comme Solaris et AIX.

La Free Software Foundation propose le Bourne Again Shell (bash). Bash est censé être le shell standard des systèmes GNU. Le jeu de mots qui constitue son nom est un hommage à Steven Bourne. Bash est conforme à la norme POSIX à laquelle il a ajouté quelques extensions. Ce shell est l’interpréteur fourni en standard sur les systèmes Linux. Il est également disponible en standard ou en téléchargement sur les systèmes Unix.

Scripts de démarrage

Sur certaines plates-formes, les scripts de démarrage sont interprétés par un Bourne Shell. Si l’on souhaite modifier ces scripts ou créer de nouveaux scripts de démarrage, il faut dans ce cas se restreindre à la syntaxe Bourne Shell. De manière plus générale, il faut utiliser la syntaxe qui correspond au shell qui interprète les scripts de démarrage.

Autres scripts

Dans les cas les plus fréquents – scripts de traitement exécutés en mode de fonctionnement Unix normal – le développeur choisira soit le shell Bash, soit le Korn Shell 88 ou 93, selon le shell disponible sur sa plate-forme. En ce qui nous concerne, nous nous concentrerons sur le shell Bash.

Documentation

  • Christine Deffaix-Rémy – Programmation shell sous Unix/Linux, pp. 19 – 22
  • Brian Ward – How Linux Works, p. 249
  • Cameron Newham – Learning the Bash shell, pp. 1 – 5
  • Carl Albing – Bash Cookbook, pp. 1 – 4

Lire la suite : Commandes internes et externes

Publié dans Bash, Documentation Microlinux | Marqué avec , , | Laisser un commentaire