\documentclass[11pt]{article} \usepackage{helvetic} \usepackage{url} \usepackage{color} \usepackage{hyperref} \usepackage{hevea} \usepackage{article} \title{Trucs et astuces} \begin{document} \maketitle \tableofcontents \section{Activer la complétion pour Zsh} \subsection {Introduction} Zsh est un \textit{« interpréteur de commande UNIX (ou shell) »} (\texttt{# 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 \ahref{andesi}{http://www.andesi.org/}, vous pouvez toujours lire le FAQ en Anglais de zsh : \ahref{http://www.b2pi.com/zsh/FAQ/}{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. \subsection{Installer zsh} Nous allons installer zsh avec l'aide de \texttt{apt-get} et changer le \textit{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 \texttt{\verb+$+SHELL}.\\ \\ \texttt{ \textbf{# echo \verb+$+SHELL}\\ /bin/bash\\ \textbf{# apt-get install zsh}\\ Reading Package Lists... Done\\ Building Dependency Tree... Done\\ The following NEW packages will be installed:\\ \qquad 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\verb+_+4.0.7-5\verb+_+i386.deb) ...\\ Setting up zsh (4.0.7-5) ...\\ \textbf{# chsh}\\ Changing the login shell for root\\ Enter the new value, or press return for the default\\ \qquad Login Shell\\ \verb+[+/bin/bash\verb+]+:/bin/zsh\\ \textbf{# su -}\\ \textbf{# echo \verb+$+SHELL}\\ /bin/zsh}\\ \\ Voilà le shell de l'utilisateur root est désormais zsh. Il ne nous reste plus qu'à activer la complétion. \subsection{Activer la complétion} Par défaut, la complétion pour zsh n'est pas activée. Il faut donc modifier le fichier \texttt{\verb+~+/.zshrc} dans le répertoire de l'utilisateur, ou bien dans le fichier \texttt{/etc/zshrc}. Le script zsh \texttt{compinstall} automatise l'activation de la complétion. Il se trouve dans le répertoire \texttt{/usr/share/zsh//functions/Completion} par défaut sur Debian GNU/Linux.\\ \\ \begin{bgcolor}{Gray} \texttt{ \textbf{ # cd /usr/share/zsh/\verb+`+zsh --version | awk -F" " '\verb+{+print \verb+$+2\verb+}+'\verb+`+/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> \textbf{/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 \verb+$+fpath, good.\\ --- Hit newline to continue or `q' to exit without saving ---\\ \\ \qquad \qquad \qquad *** 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.\quad Completers: choose completion behaviour for tasks such as\\ \qquad approximation, spell-checking, expansion.\\ \\ 2.\quad Matching control: set behaviour for case-insensitive matching, extended (partial-word) matching and substring matching.\\ \\ 3.\quad Styles for changing the way completions are displayed and inserted.\\ \\ 4.\quad Styles for particular completions.\\ \\ c.\quad Change context (plus more information on contexts).\\ \\ q.\quad Return without saving.\\ 0.\quad Save and exit.\\ \\ --- Hit choice ---}\\ \end{bgcolor} \\ Nous allons sélectionner les modules de complétion en appuyant sur les touches correspondantes aux modules que nous désirons utiliser.\\ \\ \begin{bgcolor}{Gray} \texttt{ \qquad \qquad \qquad *** 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. \qquad Set options for the completers above.\\ m. \qquad Set completers that modify the behaviour of the four main ones above.\\ q. \qquad Return without saving.\\ 0. \qquad Done setting completers.\\ \\ --- Hit selection --- \textbf{1 2 3 4}}\\ \end{bgcolor} \\ Pour avoir la complétion sur les paquets, il suffit de choisir \textit{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'.\\ \\ \begin{bgcolor}{Gray} \texttt{ --- Hit choice --- \textbf{0}\ output=''\\ Save new settings to /root/.zshrc? \textbf{y}\\ \\ Successfully added compinstall lines to /root/.zshrc.\\ Set new styles for immediate use? \textbf{n}}\\ \end{bgcolor} \\ Zsh doit être relancé pour que la nouvelle configuration soit prise en compte.\\ \\ \texttt{ \textbf{# zsh}\\ \textbf{# apt-get install ppp}\\ ppp-pam \qquad \qquad ppp-sh4-cross\quad\quad pppdcapiplugin \qquad pppoeconf\\ ppp-sh3-cross \quad ppp-udeb \qquad \qquad pppoe\qquad\qquad\qquad\quad 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 \texttt{compinstall}. Celui-ci ajoute les lignes suivantes dans le fichier \texttt{/root/.zshrc}.\\ \\ \begin{bgcolor}{Gray} \texttt{ # The following lines were added by compinstall\\ \\ zstyle ':completion:*' completer \verb+_+expand \verb+_+complete \verb+_+correct \verb+_+approximate\\ zstyle :compinstall filename '/root/.zshrc'\\ \\ autoload -U compinit\\ compinit\\ # End of lines added by compinstall}\\ \end{bgcolor} \\ Le script \texttt{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 \texttt{.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.\\ \texttt{# 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 \textit{toto} appartient au groupe \textit{toto}, alors vous pouvez tapez ceci pour \textit{automatiser} la copie de ce fichier dans tous les répertoires présent dans \texttt{/home/} (\textbf{notez} cependant que cette ligne de commande est vraiment basique car elle ne vérifie pas que le groupe et l'utilisateur existe vraiment) :\\ \texttt{ # for i in \verb+`+ls /home | egrep "[\verb+^+ftp,\verb+^+lost+found]"` ; do cp /root/.zshrc \verb+\+ \\ /home/\verb+$+i/ \verb+&&+ chown \verb+$+i. /home/\verb+$+i/.zshrc ; done}\\ \\ Une autre petite astuce pour rendre un peu plus convivial zsh : modifier « l'apparence » du prompt (section \textit{PROMPT EXPANSION} du la page de manuel \texttt{zshmic}) qui ressemble à ça par défaut si le nom de votre machine est \textit{exemple} : \texttt{exemple# }. Pour cela éditer le fichier \texttt{\verb+~+/.zshrc} ou le fichier \texttt{/etc/zshrc}, et rajouté la ligne suivante : \texttt{PROMPT='\verb+%+n@\verb+%+m\verb+%+:[\verb+%+\verb+~+]\verb+%+# '}. Maintenant votre prompt devrait ressembler à quelque chose comme ça : \texttt{root@samy[\verb+~+]# }, n'oubliez pas de taper : \texttt{# source \verb+~+/.zshrc} pour que la modification soit prise en compte immédiatement. \subsection{Ressources} Je vous conseille vivement de lire les pages de manuels de zsh qui sont très complète (\textit{zsh, zshcompctl, zshcontrib, zshmodules, zshzftpsys, zshcompsys, zshexpn, zshoptions, zshzle, zshbuiltins, zshcompwid, zshmisc, zshparam}) ou la page de manuel rassemblant toutes les autres : \texttt{# man zshall}. Le \ahref{http://www.zsh.org}{site officiel} contient également quelques documents intéressants. Pour personnaliser votre prompt encore un peu plus, cette adresse devrait vous convenir : \ahref{http://aperiodic.net/phil/prompt/}{http://aperiodic.net/phil/prompt/}.\\ \\ \textit{\textbf{Auteur de cet astuce : Christophe Nowicki (nowick at epita dot fr) et Arnaud Fontaine (arnaud at andesi.org dot org)}} \section{Régler votre horloge via NTP avec une connexion intermitente} \subsection{Introduction} NTP est l'abréviation de \textit{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 (\textit{strates)}. Ainsi on trouvera les serveurs de \ahref{http://www.eecis.udel.edu/~mills/ntp/clock1.htm}{niveau 1} très précis mais un peu moins répandus et les serveurs de \ahref{http://www.eecis.udel.edu/~mills/ntp/clock2.htm}{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 \texttt{ntpdate} (disponible en paquet Debian) afin de synchroniser notre horloge à partir d'un ordinateur disposant d'une connexion intermittente (RTC ou équivalent). \subsection{Installation et configuration} Nous allons tout d'abord effectuer l'installation de l'utilitaire \texttt{ntpdate} qui va nous permettre de synchroniser l'horloge de notre système grâce au protocol NTP :\\ \texttt{# 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 \texttt{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 : \ahref{http://www.eecis.udel.edu/\verb+~+mills/ntp/servers.html} {http://www.eecis.udel.edu/\verb+~+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 :\\ \texttt{# 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 \texttt{/etc/rc2.d} :\\ \texttt{\verb+%+ 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 \texttt{/etc/ppp/ip-up.d/} et \texttt{/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 \textit{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 \texttt{update-rc.d} décrite dans un précédent article (\ahref{http://www.andesi.org/article.php?id=services} {http://www.andesi.org/article.php?id=services}) puis créer un fichier \texttt{/etc/ppp/ip-up.d/ntpdate} :\\ \texttt{ # 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 ...\\ \quad /etc/rcS.d/S51ntpdate\\ # touch /etc/ppp/ip-up.d/ntpdate}\\ \\ Editons le fichier précédemment créé :\\ \begin{bgcolor}{Gray} \textit{\textcolor{PineGreen}{#! /bin/sh\\ # /etc/ppp/ip-up.d/ntpdate}}\\ \\ INIT\verb+_+SCRIPT=/etc/init.d/ntpdate\\ \\ if [ -x \verb+$+INIT\verb+_+SCRIPT ]; then\\ \qquad \verb+$+INIT\verb+_+SCRIPT start\\ fi \end{bgcolor} \\ Ce fichier est très simple car son but est seulement de démarrer le script \texttt{/etc/init.d/ntpdate}. Nous procédons exactement de la même manière pour le script du répertoire \texttt{/etc/ppp/ip-down.d/} :\\ \texttt{ # touch /etc/ppp/ip-down.d/ntpdate}\\ \\ Editons enfin le fichier précédemment créé :\\ \begin{bgcolor}{Gray} \textit{\textcolor{PineGreen}{#! /bin/sh\\ # /etc/ppp/ip-down.d/ntpdate}}\\ \\ INIT\verb+_+SCRIPT=/etc/init.d/ntpdate\\ \\ if [ -x \verb+$+INIT\verb+_+SCRIPT ]; then\\ \qquad \verb+$+INIT\verb+_+SCRIPT stop\\ fi \end{bgcolor} \\ Après avoir tapé les commandes qui suivent afin de rendre exécutables les scripts précédemment créés :\\ \texttt{ # 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 \texttt{\verb+%+ pon}. Normalement vous devriez voir apparaître quelque chose comme ça dans les log (\texttt{/var/log/syslog}) :\\ \texttt{ # tail -v -f /var/log/syslog\\ pppd[19798]: Script /etc/ppp/ip-up started (pid 27576) \verb+[+...\verb+]+\\ ntpdate[5898]: step time server 193.49.205.19 offset 0.115940 sec \verb+[+...\verb+]+\\ pppd[19798]: Script /etc/ppp/ip-up finished (pid 27576), status = 0x0}\\ \\ Maintenant que vous avez configuré \texttt{ntpdate}, nous allons ensuite donner les règles pour \textit{iptables} destinées à autoriser la connexion au serveur \textit{ntp} sur le port par défaut (123).\\ \texttt{ \textit{\textcolor{PineGreen}{# On récupère d'abord le nom du serveur}}\\ source /etc/default/ntp-servers\\ \\ \textit{\textcolor{PineGreen}{ # 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\qquad ntp1.curie.fr" >> /etc/hosts}}\\ ip\verb+_+ntp=\verb+`+cat /etc/hosts | grep \verb+$+NTPSERVERS | awk '{print \verb+$+1}'\verb+`+\\ \\ \textit{\textcolor{PineGreen}{# 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 \verb+$+ip\verb+_+ntp -m state --state ESTABLISHED,RELATED -j ACCEPT\\ /sbin/iptables -A OUTPUT -o ppp0 -p tcp --dport 123 -d \verb+$+ip\verb+_+ntp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT\\ \\ /sbin/iptables -A INPUT -i ppp0 -p udp --sport 123 -s \verb+$+ip\verb+_+ntp -m state --state ESTABLISHED,RELATED -j ACCEPT\\ /sbin/iptables -A OUTPUT -o ppp0 -p udp --dport 123 -d \verb+$+ip\verb+_+ntp -m state --state NEW,ESTABLISHED,RELATED} \section{Ressources} Si vous souhaitez mieux comprendre le fonctionnement du protocole NTP, je vous conseille vivement de lire les RFC (abbréviation de \textit{Request for Comments}) \ahref{http://www.ietf.org/rfc/rfc0958.txt}{958}, \ahref{http://www.ietf.org/rfc/rfc1165.txt}{1165} et \ahref{http://www.ietf.org/rfc/rfc1305.txt}{1305}. Enfin vous pouvez également visiter le site officiel du projet \texttt{ntp} à l'adresse suivante : \ahref{http://www.ntp.org}{http://www.ntp.org} qui contient des liens vers des documentations diverses.\\ \\ \textit{Je tiens à remercier zwazo pour avoir corrigé les fautes d'orthographe contenues dans cette astuce.}\\ \textit{\textbf{Auteur de cet astuce : Arnaud Fontaine (arnaud at andesi.org dot org)}} \end{document}