Trucs et astuces

Table des matières

1  Activer la complétion pour Zsh

1.1  Introduction

Zsh est un « interpréteur de commande UNIX (ou shell) » (# man zsh) proposant de nombreux avantages par rapport à Bash qui est le shell par défaut sur Debian GNU/Linux. En attendant une introduction de zsh sur http://www.andesi.org/, vous pouvez toujours lire le FAQ en Anglais de zsh : http://www.b2pi.com/zsh/FAQ/ qui permettra de répondre à vos éventuelles questions. Ce court article explique donc l'installation de Zsh et comment activer la complétion automatique sur le paquet Debian de zsh qui n'est pas mis par défaut sur Debian GNU/Linux.

1.2  Installer zsh

Nous allons installer zsh avec l'aide de apt-get et changer le shell par défaut de l'utilisateur root. Nous allons ensuite vérifier que zsh est bien notre shell par défaut grâce à la variable d'environnement $SHELL.

# echo $SHELL
/bin/bash
# apt-get install zsh
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
    zsh
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1676kB of archives.
After unpacking 4985kB of additional disk space will be used.
Get:1 http://192.168.0.1 unstable/main zsh 4.0.7-5 [1676kB]
Fetched 1676kB in 0s (4041kB/s)
Reading changelogs... Done
Preconfiguring packages ...
Selecting previously deselected package zsh.
(Reading database ... 150836 files and directories currently installed.)
Unpacking zsh (from .../archives/zsh
_4.0.7-5_i386.deb) ...
Setting up zsh (4.0.7-5) ...
# chsh
Changing the login shell for root
Enter the new value, or press return for the default
    Login Shell
[/bin/bash]:/bin/zsh
# su -
# echo
$SHELL
/bin/zsh


Voilà le shell de l'utilisateur root est désormais zsh. Il ne nous reste plus qu'à activer la complétion.

1.3  Activer la complétion

Par défaut, la complétion pour zsh n'est pas activée. Il faut donc modifier le fichier ~/.zshrc dans le répertoire de l'utilisateur, ou bien dans le fichier /etc/zshrc. Le script zsh compinstall automatise l'activation de la complétion. Il se trouve dans le répertoire /usr/share/zsh/<VERSION DE ZSH>/functions/Completion par défaut sur Debian GNU/Linux.

# cd /usr/share/zsh/`zsh --version | awk -F" " '{print $2}'`/functions/Completion
# source compinstall

I haven't found any existing completion definitions.
If you have some already defined by compinstall, edit the name of the
file where these can be found. Note that this will only work if they
are exactly the form in which compinstall inserted them. If you leave
the line as it is, or empty, I won't search.
file> /root/.zshrc
Starting a new completion configuration from scratch.
This will be written to the new file /root/.zshrc.
Note that you will be given a chance to save the new setup
somewhere else at the end.
--- Hit newline to continue or `q' to exit without saving ---

d=/usr/share/zsh/4.0.7/functions/Zle
compdir=/usr/share/zsh/4.0.7/functions/Completion
subdirs=1
lines=''
Completion directories /usr/share/zsh/4.0.7/functions/Completion/*
are already in your
$fpath, good.
--- Hit newline to continue or `q' to exit without saving ---

            *** compinstall: main menu ***
Note that hitting `q' in menus does not abort the set of changes from
lower level menus. However, quitting at top level will ensure that
noting at all is actually written out.

1.  Completers: choose completion behaviour for tasks such as
    approximation, spell-checking, expansion.

2.  Matching control: set behaviour for case-insensitive matching, extended (partial-word) matching and substring matching.

3.  Styles for changing the way completions are displayed and inserted.

4.  Styles for particular completions.

c.  Change context (plus more information on contexts).

q.  Return without saving.
0.  Save and exit.

--- Hit choice ---


Nous allons sélectionner les modules de complétion en appuyant sur les touches correspondantes aux modules que nous désirons utiliser.

            *** compinstall: completer menu ***

Current context: :completion:*

The following completers are available. Those marked `(*)' are already
set for the context shown above. If none are selected, the completers
will not be set for this context at all.

1. (*) Basic completion.
2. (*) Approximate completion: completion with correction of existing word.
3. (*) Correction: correct existing word, no completion.
4. (*) Expansion: use globbing and parameter substitution, if possible.

o.     Set options for the completers above.
m.     Set completers that modify the behaviour of the four main ones above.
q.     Return without saving.
0.     Done setting completers.

--- Hit selection --- 1 2 3 4


Pour avoir la complétion sur les paquets, il suffit de choisir Basic completion. Après avoir choisi le comportement de zsh, il faut retourner au menu principal à l'aide de la touche '0'. Et sauvegarder son choix par cette même touche '0'.

--- Hit choice --- 0 output=''
Save new settings to /root/.zshrc? y

Successfully added compinstall lines to /root/.zshrc.
Set new styles for immediate use? n


Zsh doit être relancé pour que la nouvelle configuration soit prise en compte.

# zsh
# apt-get install ppp
ppp-pam         ppp-sh4-cross    pppdcapiplugin     pppoeconf
ppp-sh3-cross   ppp-udeb         pppoe              pppstatus


Comme vous pouvez le voir, zsh complète tout les paquets qui commencent par ppp et qui ne sont pas installé sur mon système. Il peut effectuer des complétions sur beaucoups d'autres choses comme les pages de manuels, mais je vous laisse le découvrir par vous même.

Un dernière petite précision à propos du script compinstall. Celui-ci ajoute les lignes suivantes dans le fichier /root/.zshrc.

# The following lines were added by compinstall

zstyle ':completion:*' completer
_expand _complete _correct _approximate
zstyle :compinstall filename '/root/.zshrc'

autoload -U compinit
compinit
# End of lines added by compinstall


Le script compinstall se trouve dans le PATH de zsh, et il est possible de modifier le comportement du compléteur à n'importe quel moment. Vous pouvez copier le fichier de configuration .zshrc de l'utilisateur root dans le fichier de configuration global de zsh pour que chaque utilisateur qui l'utilise bénéficie de la complétion.
# cp /root/.zshrc /etc/zsh/zshrc

Vous pouvez également copier ce fichier dans les répertoires de tous les utilisateurs de votre système, si vos groupes correspondent aux noms d'utilisateur. Par exemple, si l'utilisateur toto appartient au groupe toto, alors vous pouvez tapez ceci pour automatiser la copie de ce fichier dans tous les répertoires présent dans /home/ (notez cependant que cette ligne de commande est vraiment basique car elle ne vérifie pas que le groupe et l'utilisateur existe vraiment) :
# for i in `ls /home | egrep "[^ftp,^lost+found]"` ; do cp /root/.zshrc \
/home/
$i/ && chown $i. /home/$i/.zshrc ; done

Une autre petite astuce pour rendre un peu plus convivial zsh : modifier « l'apparence » du prompt (section PROMPT EXPANSION du la page de manuel zshmic) qui ressemble à ça par défaut si le nom de votre machine est exemple : exemple# . Pour cela éditer le fichier ~/.zshrc ou le fichier /etc/zshrc, et rajouté la ligne suivante : PROMPT='%n@%m%:[%~]%# '. Maintenant votre prompt devrait ressembler à quelque chose comme ça : root@samy[~]# , n'oubliez pas de taper : # source ~/.zshrc pour que la modification soit prise en compte immédiatement.

1.4  Ressources

Je vous conseille vivement de lire les pages de manuels de zsh qui sont très complète (zsh, zshcompctl, zshcontrib, zshmodules, zshzftpsys, zshcompsys, zshexpn, zshoptions, zshzle, zshbuiltins, zshcompwid, zshmisc, zshparam) ou la page de manuel rassemblant toutes les autres : # man zshall. Le site officiel contient également quelques documents intéressants. Pour personnaliser votre prompt encore un peu plus, cette adresse devrait vous convenir : http://aperiodic.net/phil/prompt/.

Auteur de cet astuce : Christophe Nowicki (nowick at epita dot fr) et Arnaud Fontaine (arnaud at andesi.org dot org)

2  Régler votre horloge via NTP avec une connexion intermitente

2.1  Introduction

NTP est l'abréviation de Network Time protocol. Ce protocole permet de synchroniser l'horloge de votre ordinateur très précisément par l'intermédiaire de serveurs disposant d'une précision plus importante classés par niveaux (strates). Ainsi on trouvera les serveurs de niveau 1 très précis mais un peu moins répandus et les serveurs de niveau 2 et 3.

NTP est donc très utile pour synchroniser l'horloge de votre machine si la pile de votre carte mère est défaillante. Nous allons donc décrire l'utilisation du service ntpdate (disponible en paquet Debian) afin de synchroniser notre horloge à partir d'un ordinateur disposant d'une connexion intermittente (RTC ou équivalent).

2.2  Installation et configuration

Nous allons tout d'abord effectuer l'installation de l'utilitaire ntpdate qui va nous permettre de synchroniser l'horloge de notre système grâce au protocol NTP :
# apt-get install ntpdate

Lors de l'installation de ce paquet, il vous est demandé de spécifier l'adresse IP ou le nom du serveur sur lequel vous voulez synchroniser votre horloge. Nous choississons le serveur ntp1.curie.fr mais vous pouvez bien sûr en choisir un ou plusieurs autres, en séparant leurs noms par une virgule, parmi ceux proposés sur la page suivante : http://www.eecis.udel.edu/~mills/ntp/servers.html. Si vous souhaitez modifier le nom du serveur ultérieurement, il vous suffira de taper la commande suivante afin d'accéder à nouveau à ce menu :
# dpkg-reconfigure ntpdate

Ntpdate est un service qui se lancera à chaque démarrage de votre système Debian GNU/Linux comme vous pouvez le voir en listant le répertoire /etc/rc2.d :
% ls /etc/rc2.d/ | grep "ntpdate"
S51ntpdate


Si vous disposez d'une connexion permanente à Internet, cet astuce est terminée. Cependant, le but de celle ci est de configurer ntpdate afin qu'il s'adapte à une connexion RTC. Comment faire pour que le service soit lancé à chaque fois que vous vous connectez ? Facile grâce au répertoire /etc/ppp/ip-up.d/ et /etc/ppp/ip-down.d/ qui permettent d'exécuter des commandes respectivement après qu'une adresse IP vous ait été assignée par votre FAI (abbréviation de Fournisseur d'Accès à Internet) et après que vous vous soyez déconnecté.

Nous allons tout d'abord enlever les liens vers les scripts de démarrage grâce à la commande update-rc.d décrite dans un précédent article (http://www.andesi.org/article.php?id=services) puis créer un fichier /etc/ppp/ip-up.d/ntpdate :
# update-rc.d -f ntpdate remove
update-rc.d: /etc/init.d/ntpdate exists during rc.d purge (continuing)
Removing any system startup links for /etc/init.d/ntpdate ...
  /etc/rcS.d/S51ntpdate
# touch /etc/ppp/ip-up.d/ntpdate


Editons le fichier précédemment créé :
#! /bin/sh
# /etc/ppp/ip-up.d/ntpdate


INIT_SCRIPT=/etc/init.d/ntpdate

if [ -x $INIT_SCRIPT ]; then
    $INIT_SCRIPT start
fi

Ce fichier est très simple car son but est seulement de démarrer le script /etc/init.d/ntpdate. Nous procédons exactement de la même manière pour le script du répertoire /etc/ppp/ip-down.d/ :
# touch /etc/ppp/ip-down.d/ntpdate

Editons enfin le fichier précédemment créé :
#! /bin/sh
# /etc/ppp/ip-down.d/ntpdate


INIT_SCRIPT=/etc/init.d/ntpdate

if [ -x $INIT_SCRIPT ]; then
    $INIT_SCRIPT stop
fi

Après avoir tapé les commandes qui suivent afin de rendre exécutables les scripts précédemment créés :
# chmod 755 /etc/ppp/ip-up.d/ntpdate
# chmod 755 /etc/ppp/ip-down.d/ntpdate


Vous pouvez essayer de vous connecter normalement en tapant % pon. Normalement vous devriez voir apparaître quelque chose comme ça dans les log (/var/log/syslog) :
# tail -v -f /var/log/syslog
pppd[19798]: Script /etc/ppp/ip-up started (pid 27576)
[...]
ntpdate[5898]: step time server 193.49.205.19 offset 0.115940 sec
[...]
pppd[19798]: Script /etc/ppp/ip-up finished (pid 27576), status = 0x0


Maintenant que vous avez configuré ntpdate, nous allons ensuite donner les règles pour iptables destinées à autoriser la connexion au serveur ntp sur le port par défaut (123).
# On récupère d'abord le nom du serveur
source /etc/default/ntp-servers

# puis on extrait l'adresse IP du serveur du fichier /etc/hosts
# en ayant préalablement ajouté cette ligne au fichier /etc/hosts :
# echo "193.49.205.19    ntp1.curie.fr" >> /etc/hosts

ip
_ntp=`cat /etc/hosts | grep $NTPSERVERS | awk 'print $1'`

# enfin les règles de filtrage appropriées pour les protocoles UDP et TCP sur le port 123

/sbin/iptables -A INPUT -i ppp0 -p tcp --sport 123 -s
$ip_ntp -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 -p tcp --dport 123 -d
$ip_ntp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

/sbin/iptables -A INPUT -i ppp0 -p udp --sport 123 -s
$ip_ntp -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 -p udp --dport 123 -d
$ip_ntp -m state --state NEW,ESTABLISHED,RELATED

3  Ressources

Si vous souhaitez mieux comprendre le fonctionnement du protocole NTP, je vous conseille vivement de lire les RFC (abbréviation de Request for Comments) 958, 1165 et 1305. Enfin vous pouvez également visiter le site officiel du projet ntp à l'adresse suivante : http://www.ntp.org qui contient des liens vers des documentations diverses.

Je tiens à remercier zwazo pour avoir corrigé les fautes d'orthographe contenues dans cette astuce.
Auteur de cet astuce : Arnaud Fontaine (arnaud at andesi.org dot org)