<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le mpg-blog &#187; Informatique générale</title>
	<atom:link href="http://weblog.elzevir.fr/par-sujet/comp/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.elzevir.fr</link>
	<description>LaTeX et autres geekeries</description>
	<lastBuildDate>Fri, 10 Sep 2010 08:49:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Contexte des liens</title>
		<link>http://weblog.elzevir.fr/2009/02/contexte-des-liens/</link>
		<comments>http://weblog.elzevir.fr/2009/02/contexte-des-liens/#comments</comments>
		<pubDate>Sat, 14 Feb 2009 23:50:53 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/02/contexte-des-liens/</guid>
		<description><![CDATA[Il n&#8217;y pas longtemps, j&#8217;ai lu plus ou moins par hasard un billet sur
l&#8217;importance de l&#8217;intitulé des liens sur le journal de mon copain
Sunny. (Plus ou moins par hasard signifiant que je ne feuilletais pas son
journal par hasard, mais que je ne saurais reproduire le suite de clics exacte
qui n&#8217;a fait aboutir à ce billet.) [...]]]></description>
			<content:encoded><![CDATA[<p>Il n&#8217;y pas longtemps, j&#8217;ai lu plus ou moins par hasard un billet sur
<a href="http://sunfox.org/blog/2004/11/29/google-phealou-et-importance-de-intitule-du-lien/">l&#8217;importance de l&#8217;intitulé des liens</a> sur le <a href="http://sunfox.org/">journal de mon copain
Sunny</a>. (Plus ou moins par hasard signifiant que je ne feuilletais pas son
journal par hasard, mais que je ne saurais reproduire le suite de clics exacte
qui n&#8217;a fait aboutir à ce billet.) Il s&#8217;agit d&#8217;un site arrivant en premier
résultat d&#8217;une recherche, alors qu&#8217;il ne contient aucune des mots de cette
recherche.</p>

<p>C&#8217;est en soi assez édifiant, mais je viens de constater un phénomène qui l&#8217;est
encore plus. <span id="more-46"></span> À l&#8217;heure où j&#8217;écris ces lignes, si l&#8217;on tape <a href="http://www.google.com/search?ie=UTF-8&amp;oe=UTF-8&amp;q=p%C3%A9gouri%C3%A9-gonnard">mon nom dans
Google</a>, le deuxième résultat est la page d&#8217;accueil du présent weblog
(j&#8217;insiste : la page d&#8217;accueil). C&#8217;est dans un sens surprenant, vu que cette
page ne comporte pas mon nom, et que la seule <a href="http://weblog.elzevir.fr/qui-suis-je/">page qui le contient</a>
n&#8217;apparaît que bien plus bas dans les résultats.</p>

<p>L&#8217;explication de ce phénomène est tout simple.
Depuis quelque temps, les articles que je poste sur <a href="http://fr.wikipedia.org/wiki/Usenet">usenet</a> se terminent par
la « signature » suivante :</p>

<pre><code>-- 
&lt;mon prénom et nom nom&gt;             Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/            http://people.math.jussieu.fr/~mpg/
</code></pre>

<p>où bien sûr il y a réellement mon prénom et mon nom au lieu de <code>mon prénom et
mon nom</code>. C&#8217;est donc uniquement le contexte dans lequel le lien apparaît qui
assure son bon placement sur cette requête précise.</p>

<p>Si j&#8217;ai maquillé la signature ci-dessus, c&#8217;est juste pour préserver la magie
apparente du résultat de recherche dans l&#8217;extrait duquel Google ne peut
surligner aucun des mots-clé de la recherche&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/02/contexte-des-liens/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ssh_config(5)</title>
		<link>http://weblog.elzevir.fr/2009/02/ssh_config5/</link>
		<comments>http://weblog.elzevir.fr/2009/02/ssh_config5/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 22:07:34 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[unix-user]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/02/ssh_config5/</guid>
		<description><![CDATA[Le précédent billet évoquait très brièvement l&#8217;existence du fichier
~/.ssh/config et la possibilité de s&#8217;en servir pour faire des trucs
intéressants. Voyons donc quelques options intéressantes de ce fichier,
intéressant étant défini comme « que j&#8217;utilise »&#8230; 

Structure générale du fichier

Commençons par le commencement, c&#8217;est un fichier texte contenant sur chaque
ligne le nom d&#8217;une option et sa valeur. [...]]]></description>
			<content:encoded><![CDATA[<p>Le précédent billet évoquait très brièvement l&#8217;existence du fichier
<code>~/.ssh/config</code> et la possibilité de s&#8217;en servir pour faire des trucs
intéressants. Voyons donc quelques options intéressantes de ce fichier,
intéressant étant défini comme « que j&#8217;utilise »&#8230; <span id="more-43"></span></p>

<h2>Structure générale du fichier</h2>

<p>Commençons par le commencement, c&#8217;est un fichier texte contenant sur chaque
ligne le nom d&#8217;une option et sa valeur. Le fichier est séparés en blocs
commençant par l&#8217;option <code>Host</code>, les directives de chaque bloc ne s&#8217;appliquant
qu&#8217;aux hôtes qui correspondent au motif indiqué. Par exemple</p>

<pre><code>Host *.math.utah.edu
User g-pdm
</code></pre>

<p>dit qu&#8217;à chaque fois que je me connecte à un hôte du domaine <code>math.utah.edu</code>,
mon nom d&#8217;utilisateur est <code>g-pdm</code>. En clair, les deux lignes suivantes
deviennent équivalentes :</p>

<pre><code>$ scp foo sunset.math.utah.edu:
$ scp foo g-pdm@sunset.math.utah.edu:
</code></pre>

<p>Comme on le voit, les options de <code>ssh-config</code> sont  utilisée par tous les outils
de la suite, et pas seulement par la commande <code>ssh</code>.</p>

<h2>Alias</h2>

<p>Précisons que <code>Host</code> se réfère au nom d&#8217;hôte que vous saisissez sur la ligne de
commande, qui peut être différent du nom d&#8217;hôte réel, lequel se spécifie alors
avec <code>HostName</code>. Par exemple, la section suivante n&#8217;a d&#8217;autre but que de
raccourcir mes lignes de commandes en ne tapant que le nom d&#8217;hôte au lieu du nom
pleinement qualifié. (C&#8217;est de la flemme, oui, et alors ?)</p>

<pre><code>Host thue
HostName thue.elzevir.fr
</code></pre>

<p>C&#8217;est aussi pratique pour les hôtes qui n&#8217;ont pas d&#8217;adresse IP publique. Par
exemple j&#8217;ai chez moi une machine principale, et parfois mon laptop qui tourne
et auquel je peux vouloir accéder depuis la fac. Pour cela, j&#8217;utilise les
fonction NAT de ma « libreboîte » (qui porte assez mal son nom, mais passons),
mais c&#8217;est pénible de devoir préciser à chaque fois le numéro de port. L&#8217;entrée
suivant concernait mon ancien laptop (paix à son âme) :</p>

<pre><code>Host siegel
HostName elzevir.fr
Port 12622
HostKeyAlias siegel.elzevir.fr
ForwardAgent yes
</code></pre>

<p>La directive <code>Port</code> se passe sans doute de commentaires, mais si on utilise
qu&#8217;elle, on a vite des problèmes. En effet, l&#8217;hôte en question a la même adresse
que <code>thue</code>, mais une clé publique de serveur SSH différente. Ceci provoque des
avertissements à chaque fois, car le client vérifie que la clé présentée par le
serveur coïncide avec celle enregistrée dans le fichier <code>known_hosts</code>. On peut
désactiver cette vérification, mais ça ne me paraît pas très prudent. Une bonne
solution est fournie par <code>HostKeyAlias</code>, qui permet de donner un nom arbitraire
(et donc unique si on le veut) à l&#8217;entrée de cet hôte dans <code>known_hosts</code>.</p>

<p>Au passage, une directive que j&#8217;aime bien est <code>HashKnownHosts no</code> : c&#8217;est la
valeur par défaut en général, mais dans Debian, c&#8217;est à <code>yes</code>. L&#8217;idée du <code>yes</code>
est que les entrées de <code>known_hosts</code> fournissent à un éventuel intrus des
informations. L&#8217;idée du <code>no</code>, c&#8217;est d&#8217;une part que vous pouvez lire le fichier
et donc le maintenir (effacer les vieilles entrées inutiles, par exemple), et
d&#8217;autre part que ça peut être une source d&#8217;info utile (ça m&#8217;a bien dépanné le
jour où les DNS de mon FAI étaient en rade, d&#8217;avoir des IP d&#8217;hôtes auxquels je
pouvais me connecter, par exemple).</p>

<p>Toujours en passant, j&#8217;ai un peu menti à la fin du dernier billet : en fait,
<code>ForwardAgent</code> vaut <code>no</code> par défaut, et je le passe à <code>yes</code> individuellement par
hôte.</p>

<h2>Tunnels</h2>

<p>La dernière directive que j&#8217;utilise est <code>LocalForward</code>, qui est l&#8217;équivalent de
l&#8217;option <code>-L</code> en ligne de commande. C&#8217;est utile pour les tunnels qu&#8217;on établi
souvent. Par exemple, pour me connecter à la fac, je dois passer par un sas :
les serveurs internes ne sont pas accessibles directement de l&#8217;intérieur. C&#8217;est
embêtant, mais on a plusieurs stratégies pour simplifier la chose. L&#8217;une passe
par l&#8217;utilisation de <code>ProxyCommand</code> : je ne pratique pas, je n&#8217;en dirai donc
rien. Celle que j&#8217;utilise est la suivante.</p>

<pre><code>Host galois2
HostName 127.0.0.1
Port 1033

Host tunnels
HostName sas.math.jussieu.fr
LocalForward 1033 galois2.math.jussieu.fr:22
</code></pre>

<p>J&#8217;établis d&#8217;abord une redirection du port local 1033 vers le port 22 de la
machine à laquelle je veux me connecter via le sas. Cette opération est à
effectuer seulement une fois quand j&#8217;ouvre ma session (je fais ça en même temps
que <code>ssh-add</code> via un alias shell) avec la ligne de commande <code>ssh -Nf tunnels</code>
(<code>-N</code> dit de ne pas exécuter de commande distante (on veut juste rediriger les
ports en fait) et <code>-f</code> de tourner en arrière-plan). Ensuite, je peux me
connecter directement à <code>galois2</code> en tapant juste <code>ssh galois2</code>.</p>

<h2>Ligne de commande</h2>

<p>Oui, le titre du billet est <code>ssh_config(5)</code> et pas <code>ssh(1)</code> ni <code>scp(1)</code>, mais
bon, voyons quand même trois options pratiques en ligne de commande. Le première
est <code>-o</code> qui permet de spécifier sur la ligne de commande toute option
disponible dans le fichier de configuration.</p>

<p>Une autre option que j&#8217;aime, spécifique à <code>scp</code>, est <code>-l</code> pour limiter la bande
passante utilisée (pratique pour un téléchargement non urgent en tâche de fond,
un cron de sauvegarde, etc.)</p>

<p>Enfin, une spécifique à <code>ssh</code> est <code>-t</code>, qui permet de forcer l&#8217;attribution d&#8217;un
<code>tty</code> sur la machine distante, même quand on spécifie une commande distante.
Exemple : je veux me connecter sur <code>thue</code>, mon serveur de fichiers, relié à ma
chaîne hifi, pour y lancer <code>mocp</code>, un lecteur de musique en console. Essayons
naïvement.</p>

<pre><code>mpg@roth:~% ssh thue mocp
Error opening terminal: unknown.
</code></pre>

<p>L&#8217;option <code>-t</code> est faite précisément pour ça. Je l&#8217;utilise aussi pour me
connecter à la fac en choisissant mon shell (on n&#8217;a pas le droit de changer son
shell de login) : <code>ssh -t galois1 'zsh -l'</code> et hop !</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/02/ssh_config5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petit hack de ssh-agent</title>
		<link>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/</link>
		<comments>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 22:23:14 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[unix-user]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/</guid>
		<description><![CDATA[Si vous êtes un utilisateur régulier de ssh et que vous ne connaissez pas
encore ssh-agent, ruez-vous sur sa documentation. En deux mots, ses
principales fonctionnalités sont :


Garder en cache une copie déchiffrée de votre clé privée ssh, pour vous
éviter d&#8217;avoir à saisir constamment la passphrase.
Permettre de voyager facilement entre différentes machines : les demandes
d&#8217;authentification sont retransmises [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous êtes un utilisateur régulier de <code>ssh</code> et que vous ne connaissez pas
encore <code>ssh-agent</code>, ruez-vous sur sa documentation. En deux mots, ses
principales fonctionnalités sont :</p>

<ol>
<li>Garder en cache une copie déchiffrée de votre clé privée ssh, pour vous
éviter d&#8217;avoir à saisir constamment la <em>passphrase</em>.</li>
<li>Permettre de voyager facilement entre différentes machines : les demandes
d&#8217;authentification sont retransmises à la machine initiale.</li>
</ol>

<p>Mon propos ici n&#8217;est pas de faire un guide de l&#8217;usage normal de <code>ssh-agent</code> mais
plutôt de montrer comment le détourner légèrement.<span id="more-41"></span> L&#8217;usage prévu est que
les processus fils de <code>ssh-agent</code> ou du <em>shell</em> où il a été lancé aient dans
leur environnement une variable <code>SSH_AUTH_SOCK</code> pointant vers un <em>socket</em> Unix
permettant de communiquer avec l&#8217;agent.</p>

<p>Il n&#8217;y a pas longtemps, j&#8217;ai voulu utiliser une connexion ssh dans le contexte
d&#8217;un <em>hook</em> post-commit de Subversion. Il s&#8217;agit par exemple de pages web que je
tiens sous contrôle de version, et dont je souhaite qu&#8217;à chaque <em>commit</em> elles
soient mises à jour sur le serveur web (auquel j&#8217;ai accès par ssh). Ça tombe
bien, je me connecte à mon serveur SVN par la méthode <code>ssh+svn://</code>, et en
principe j&#8217;ai toujours un <code>ssh-agent</code> qui tourne sur la machine de départ.
Problème, les <em>hooks</em> SVN démarrent avec un environnement essentiellement vide.</p>

<p>Il faut donc essayer de retrouver soi-même les informations de <code>ssh-agent</code>. Ce
n&#8217;est pas très difficile, en fait l&#8217;accès au <em>socket</em> n&#8217;est protégé que par les
permissions au niveau du système de fichiers. Les quelques lignes de Perl
suivantes trouvent un <em>socket</em> <code>ssh-agent</code> actif s&#8217;il y en a un et positionnent
la variable <code>SSH_AUTH_SOCK</code> pour permettre son utilisation facile par les fils
du processus courant.</p>


<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> hack_ssh_agent <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">return</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SSH_AUTH_SOCK'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$success</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">opendir</span> TMP<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/tmp&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dir</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">grep</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/ssh-/</span><span style="color: #339933;">,</span> <span style="color: #000066;">readdir</span> TMP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">opendir</span> TEST<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/tmp/$dir&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$agent</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">grep</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^agent/</span><span style="color: #339933;">,</span> <span style="color: #000066;">readdir</span> <span style="color: #009900;">&#40;</span>TEST<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">closedir</span> <span style="color: #009900;">&#40;</span>TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$ENV</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SSH_AUTH_SOCK'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;/tmp/$dir/$agent&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Trying /tmp/$dir/$agent<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$success</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">system</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;ssh localhost true&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">last</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$success</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">closedir</span> TMP<span style="color: #339933;">;</span>
    <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;Pas moyen de trouver un ssh-agent.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #b1b100;">unless</span> <span style="color: #0000ff;">$success</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<p>Outre l&#8217;utilisation présentée, à savoir récupérer les informations permettant de
se connecter à un <code>ssh-agent</code> depuis un processus qui n&#8217;en est pas un
descendant, je pense que ces quelques lignes de code ont un intérêt pédagogique.
Elles montrent qu&#8217;il est très facile pour <code>root</code> de récupérer les <code>ssh-agent</code> de
tous les utilisateurs s&#8217;il le désire. (Notons quand même que ça ne lui donne pas
accès à la clé déchiffrée de façon permanente, non plus : c&#8217;est déjà ça.)</p>

<p>En soi, ce n&#8217;est pas un grand problème de sécurité : si on a pas confiance en
<code>root</code>, on est de toutes façons déjà dans&#8230; les problèmes jusqu&#8217;au cou. Par
contre, j&#8217;ai un compte sur la machine d&#8217;un ami en qui j&#8217;ai en général toute
confiance mais qui est souvent très blagueur en matière informatique. J&#8217;ai donc
pris soin d&#8217;insérer <code>ForwardAgent no</code> dans mon <code>~/.ssh/config</code> concernant sa
machine.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/01/petit-hack-de-ssh-agent/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ma vie sans libc</title>
		<link>http://weblog.elzevir.fr/2009/01/ma-vie-sans-libc/</link>
		<comments>http://weblog.elzevir.fr/2009/01/ma-vie-sans-libc/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 02:46:09 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2009/01/ma-vie-sans-libc/</guid>
		<description><![CDATA[Avoir des amis geeks, c&#8217;est mal. Ça pousse à parler de blagues de geek, ce
qui pousse à tester des trucs pas clairs. Pas plus tard qu&#8217;aujourd&#8217;hui, je
parlais à un ami du message marrant lancé par apt-get, aptitude ou dpkg
(je ne sais plus) quand on demande à désinstaller la libc : au lieu de
confirmer seulement en [...]]]></description>
			<content:encoded><![CDATA[<p>Avoir des amis <em>geeks</em>, c&#8217;est mal. Ça pousse à parler de blagues de <em>geek</em>, ce
qui pousse à tester des trucs pas clairs. Pas plus tard qu&#8217;aujourd&#8217;hui, je
parlais à un ami du message marrant lancé par <em>apt-get</em>, <em>aptitude</em> ou <em>dpkg</em>
(je ne sais plus) quand on demande à désinstaller la <a href="http://fr.wikipedia.org/wiki/Biblioth%C3%A8que_standard_du_C">libc</a> : au lieu de
confirmer seulement en appuyant sur <code>y</code>, on doit recopier textuellement une
longue phrase du style « Oui, je sais que ça a l&#8217;air bizarre, mais je suis un
grand garçon et je veux le faire quand même ». <span id="more-34"></span></p>

<p>Petite parenthèse pour qui se demande d&#8217;où vient cette idée de désinstaller la
<code>libc</code> : ça fait partie du folklore de <a href="news://fr.misc.bavarges.linux">fr.misc.bavardages.linux</a>, un
groupe <a href="http://www.usenet-fr.net/">iouzenette</a> ma foi fort sympathique (voir ses <a href="http://www.usenet-fr.net/fur/chartes/misc.bavardages.linux.html">conseils
d&#8217;utilisation</a> et notamment les liens de la section 4 (<em>alerte
procrastination</em>) mais aussi le <em><a href="http://hivernal.org/resources/static/FMBL/GFA">fortune-file</a></em> (alerte bis)). La
vérification du rapport avec la <a href="http://www.pafoo.net/uninstallglibc/uninstglibc.html">désinstallation de <code>libc</code></a> est laissée
au lecteur.</p>

<p>Bref, souhaitant retrouver les termes exacts de la phase de sécurité en question
(pour vérifier si elle suppose bien que l&#8217;utilisateur est de sexe masculin, ce
qui ne serait pas forcément sexiste : une fille est bien trop responsable pour
désinstaller sa <code>libc</code>&#8230;), me voilà parti à bidouiller les trois commandes
sus-citées pour leur faire cracher le message. Quand, sûr de moi car n&#8217;ayant pas
précisé <code>--force-remove-essential</code> je tape (en <code>root</code> sur mon <em>laptop</em>, qui est
ma machine principale) :</p>

<pre><code>dpkg --force-depends --remove libc6
</code></pre>

<p>à ma grande surprise ça « marche » (si l&#8217;on peut dire), sauf les scripts
post-désinstallation, qui échouent, comme on devrait s&#8217;en douter. J&#8217;ai alors le
plaisir d&#8217;entretenir avec mon <em>shell</em> préféré un dialogue aussi réjouissant que</p>

<pre><code>% /bin/ls
zsh: command not found: /bin/ls
% ??!
</code></pre>

<p>le temps de réaliser ce que je viens de faire.</p>

<p>Arrivés à ce stade de votre lecture, vous êtes sans doute mort de rire. Même si
j&#8217;en suis heureux, ce n&#8217;est pas la finalité principale de ce blog, qui avait
plutôt pour but de partager des astuces techniques en LaTeX, ou en <em>geekeries</em>
linuxiennes. La partie technique arrive : je vais vous expliquer comment il est
facile de réinstaller sa <code>libc</code>. (Je lis la déception dans votre regard :
rassurez-vous, ça m&#8217;a quand même pris un bon moment avant de comprendre que
c&#8217;était facile.)</p>

<p>On s&#8217;arme bien sûr d&#8217;un bon Live CD, car le système n&#8217;est pas <em>bootable</em> (on
pourrait en fait, avec l&#8217;option <code>init=/sbin/sash</code> mais je ne pense pas que ça
avance à grand chose). Mon choix se porte que <a href="http://grml.org/">grml</a> pour sa parenté avec
Debian, son état d&#8217;esprit et sa finition que j&#8217;apprécie (je pratique aussi
<a href="http://www.sysresccd.org/Index.fr.php">sysresccd</a> à l&#8217;occasion). Je vous épargne les détails, mais je finis par
découvrir <a href="http://www.debian.org/doc/manuals/reference/ch-package.en.html#s-un-bootable">ici</a> l&#8217;option <code>--root</code> de <code>dpkg</code> qui semble résoudre mon
problème.</p>

<p>Après avoir monté toutes les partition adéquates de mon disque dur (petit
instant de doute en voyant qu&#8217;il n&#8217;y a rien dans <code>/dev/mapper</code>, mais la FAQ grml
me conseille <code>Start lvm</code> et a bien raison), j&#8217;essaie et là c&#8217;est le drame : la
version de <code>dpkg</code> du CD grml gravé il y a un an est trop vieille pour toucher à
ma <em>Lenny</em> (la prochaine version de Debian) à jour. Yaka en graver une plus
récente. Ou pas, parce que graver un CD en tournant sur Live CD, euh&#8230;
Bref, vivent le <em>boot</em> sur clé USB, et les <a href="http://wiki.grml.org/doku.php?id=usb">tutoriels</a> qui marchent du
premier coup (c&#8217;est aussi pour ça que j&#8217;aime grml).</p>

<p>Deuxième essai. Ok, <code>dpkg</code> fait de son mieux mais c&#8217;est le script d&#8217;installation
qui marche pas : <code>command not found: /bin/ls</code>, ça vous dit quelque chose ?
Visiblement <code>--root</code> en fait un peu trop. On passe donc au 6.3.7 de <a href="http://www.debian.org/doc/manuals/reference/ch-package.en.html#s-un-bootable">la
page</a> qui en parlait : faire soi-même le boulot de <code>dpkg</code>. Enfin, juste
une partie de son boulot, lui il est plus subtil. Mais ça suffit, ouf.</p>

<p>Donc résumé en deux mots, le <em>how-to</em> (même si le mieux c&#8217;est de pas commencer,
hein) :</p>

<ol>
<li>Démarrer sur Live CD, récent ou pas.</li>
<li>Télécharger le <code>.deb</code> de la <code>libc</code> sur <a href="http://packages.debian.org">http://packages.debian.org</a>.</li>
<li>Monter ses partoches ou volumes LVM du système cassé quelque part.</li>
<li><code>ar x lic6-*.deb</code> où vous voulez, puis <code>tar xf data.tar.gz</code> à la racine du
point de montage.</li>
<li>Redémarrage sur le système anciennement cassé, et <code>dpkg -i libc6-*.deb</code> quand
même, juste pour que les petits papiers de <code>dpkg</code> soient à jour.</li>
</ol>

<p>Morale de l&#8217;histoire : ne plus jamais tester des trucs idiots ailleurs que sur
une machine de test (fut-ce une machine virtuelle ou un simple <em>chroot</em>).</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2009/01/ma-vie-sans-libc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Noyau à la vanille façon Debian</title>
		<link>http://weblog.elzevir.fr/2008/12/noyau-a-la-vanille-facon-debian/</link>
		<comments>http://weblog.elzevir.fr/2008/12/noyau-a-la-vanille-facon-debian/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 20:21:02 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[unix-admin]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2008/12/noyau-a-la-vanille-facon-debian/</guid>
		<description><![CDATA[Aide-mémoire perso qui peut éventuellement servir à d&#8217;autres : compilation d&#8217;un
noyau Linux upstream en utilisant les outils fournis par Debian (Lenny) pour
construire un paquet .deb du noyau et l&#8217;installer sans douleur. 

Télécharger les sources du noyau sur kernel.org. Pour une version
stable (ex. aujourd&#8217;hui : 2.6.27.7), utiliser le lien F (full source) sur la
ligne.  Dans [...]]]></description>
			<content:encoded><![CDATA[<p>Aide-mémoire perso qui peut éventuellement servir à d&#8217;autres : compilation d&#8217;un
noyau Linux <em>upstream</em> en utilisant les outils fournis par Debian (Lenny) pour
construire un paquet <code>.deb</code> du noyau et l&#8217;installer sans douleur. <span id="more-31"></span></p>

<p>Télécharger les sources du noyau sur <a href="http://kernel.org/">kernel.org</a>. Pour une version
stable (ex. aujourd&#8217;hui : 2.6.27.7), utiliser le lien <strong>F</strong> (full source) sur la
ligne.  Dans tous les autres cas, il faut télécharger le patch (lien du numéro
de version, ex.  2.6.28-rc6) <em>et</em> la base à laquelle l&#8217;appliquer, donnée par le
lien <strong>B</strong> sur la même ligne. Dans les exemples qui suivent, je suppose que les
trucs sont enregistrés sous <code>~/tmp</code>.</p>

<p>Ajouter son utilisateur au groupe <code>src</code> si ce n&#8217;est pas déjà fait. Par
exemple :</p>

<pre><code># adduser mpg src
</code></pre>

<p>Puis se relogguer avec cet utilisateur pour que la modification soit effective.
Le vérifier en tapant <code>id</code> ou <code>groups</code>.</p>

<p>En utilisateur, aller dans <code>/usr/src</code>, y détruire le lien symbolique <code>linux</code>.
Décompresser l&#8217;archive des sources. S&#8217;il s&#8217;agit d&#8217;une version à patcher,
procéder comme dans l&#8217;exemple suivant.</p>

<pre><code>% tar xjf ~/tmp/linux-2.6.27.tar.bz
% bunzip2 ~/tmp/patch-2.6.28-rc6.bz2
% cp -r linux-2.6.27 linux-2.6.28-rc6
% cd linux-2.6.28-rc6
% patch -p1 &lt;~/tmp/patch-2.6.28-rc6
</code></pre>

<p>Une fois obtenue une belle arborescence des sources dûment patchée au besoin,
rétablir le lien symbolique <code>linux</code> vers sa racine.</p>

<p>Il faut maintenant configurer le nouveau noyau. Pour partir de la
configuration de l&#8217;ancien, faire par exemple</p>

<pre><code>% cp /boot/config-2.6.27.5 /usr/src/linux/.config
</code></pre>

<p>Aller alors dans <code>/usr/src/linux</code> et y lancer alors <code>make menuconfig</code>. (Il faut
sans doute installer un ou deux paquets pour ça, dont <code>libncurses-dev</code>et
peut-être d&#8217;autres.) Selon les besoins, sélectionner les drivers voulus (chez
moi, c&#8217;est <code>ath9k</code> qui m&#8217;a motivé à installer une version récente du noyau, et
que je vais activer la première fois dans Device driver -> Networks device
support -> Wireless Lan -> Atheros 802.11n wireless cards support).</p>

<p>Il est alors temps de construire le noyau. Pour cela, il faut avoir installé
les paquets nécessaires : <code>kernel-package</code>, <code>fakeroot</code>, <code>build-essential</code> et
<code>initramfs-tools</code> en font partie, et je crois qu&#8217;ils suffisent. Exécuter alors</p>

<pre><code>% fakeroot make-kpkg clean
% fakeroot make-kpkg --initrd kernel_image
</code></pre>

<p>(Si on envisage de faire plusieurs noyaux personnalisés successifs à partir
d&#8217;une même version <em>upstream</em>, on a intérêt à utiliser l&#8217;option
<code>--append-to-version=.20081107</code> (ou tout autre numéro) pour les distinguer et ne
pas mélanger leurs modules.) C&#8217;est en tout cas le moment de s&#8217;en jeter une
petite de son breuvage favori, ou de faire autre chose d&#8217;intéressant sur sa
machine si on elle a un double cœur.</p>

<p>Maintenant, la seule étape nécessitant les droits de <code>root</code> : l&#8217;installation
du paquet créé.</p>

<pre><code># dpkg -i /usr/src/linux-image-2.6.27.5_2.6.27.5-10.00.Custom_amd64.deb
</code></pre>

<p>Voilà, il ne reste plus qu&#8217;à rebooter sur le nouveau noyau, et éventuellement
recompiler les modules externes.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2008/12/noyau-a-la-vanille-facon-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress à ma sauce (partie 1)</title>
		<link>http://weblog.elzevir.fr/2008/07/wordpress-a-ma-sauce-partie-1/</link>
		<comments>http://weblog.elzevir.fr/2008/07/wordpress-a-ma-sauce-partie-1/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 15:07:37 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/2008/07/wp-syntax-ca-a-lair-bien/</guid>
		<description><![CDATA[Bon, ça faisait donc plus d&#8217;un mois que je n&#8217;avais pas posté ici. Pas bien.
Reprenons. Je viens donc de mettre la touche (pour l&#8217;instant) finale à mon
installation Wordpress en ajoutant la dernière brique qui me paraissait
indispensable pour publier facilement de jolis billets : wp-syntax. Mais
reprenons à partir du début.

Le première point qui m&#8217;a frappé en [...]]]></description>
			<content:encoded><![CDATA[<p>Bon, ça faisait donc plus d&#8217;un mois que je n&#8217;avais pas posté ici. Pas bien.
Reprenons. Je viens donc de mettre la touche (pour l&#8217;instant) finale à mon
installation Wordpress en ajoutant la dernière brique qui me paraissait
indispensable pour publier facilement de jolis billets : wp-syntax. Mais
reprenons à partir du début.</p>

<p>Le première point qui m&#8217;a frappé en essayant Wordpress, c&#8217;est que jamais je ne
pourrai m&#8217;habituer au pseudo-éditeur de texte en ligne qu&#8217;il propose par défaut
pour rédiger les billets. 
<span id="more-8"></span>
 J&#8217;ai pensé un moment copier-coller depuis vim,
mais c&#8217;est pénible, et de plus <abbr title="WordPress">WP</abbr> fait par défaut subir à mon texte un
traitement bizarre qui remplace les fins de lignes par des balises <code>&lt;br /&gt;</code> :
pénible, quand on édite sur 80 colonnes. (Je reviendrai sur ces traitements dans
le prochain billet.)</p>

<p>Pour l&#8217;intégration de vim et de <abbr title="WordPress">WP</abbr>, j&#8217;ai gougueuler un peu à tout hasard, et
après avoir trouvé une extension Firefox qui permettrait d&#8217;éditer n&#8217;importe quel
champ de texte d&#8217;une page ouèbe dans vim (ou emacs pour ceux qui y tiennent), ce
qui a l&#8217;air prometteur mais ne tient malheureusement pas ses promesse après 5
minutes d&#8217;essai/combat, j&#8217;ai plutôt rapidement trouvé le Nirvana, sous la forme
de <a href="http://friggeri.net/blog/2007/07/13/vimpress">vimpress</a>, un <a href="http://www.vim.org/scripts/script.php?script_id=1953">plugin
vim</a>.</p>

<p>L&#8217;idée est très simple : <abbr title="WordPress">WP</abbr> propose plusieurs <abbr title="Advanced programming interface">API</abbr> utilisant le protocole
<a href="http://en.wikipedia.org/wiki/Xml-rpc"><abbr title="XML remote procedure call">XMLRPC</abbr></a>. En gros, ce protocole (pour ce que j&#8217;en comprends) est très
générique et permet de représenter en <abbr title="eXtensible Markup Language">XML</abbr> quelques types de données naturels
dans les langages courants. À partir de là, on peut définir facilement des type
de données « billet de blog », « liste de billets », etc. et les échangers en
<abbr title="eXtensible Markup Language">XML</abbr>.  Pour l&#8217;utilisateur-programmeur, c&#8217;est magique : modulo l&#8217;existence d&#8217;une
bibliothèque <abbr title="XML remote procedure call">XMLRPC</abbr> dans son langage favori, on a un type de données dans ce
langage qui réprésente un billet de blog, et une fonction simple pour le
récupérer ou l&#8217;envoyer.</p>

<p><a href="http://friggeri.net/blog/2007/07/13/vimpress">vimpress</a>, c&#8217;est l&#8217;implémentation de tout ça sous la forme d&#8217;un plugin vim en
python, utilisant l&#8217;<abbr title="Advanced programming interface">API</abbr> <a href="http://www.sixapart.com/developers/xmlrpc/movable_type_api/">MovableType</a>, et sous <abbr title="General Public Licence">GPL</abbr>. (Il faut donc avoir une
version de vim compilée avec le support python, j&#8217;en reparlerai sans doute un de
ces jours.) C&#8217;est bel et bon, mais ça un défaut : ça ne gère pas la
fonctionalité qui permet d&#8217;affiicher seulement les première lignes d&#8217;un billets
comme je le fais sur le page d&#8217;accueil : quand on tente de récupérer un tel
billet pour l&#8217;éditer, on reçoit seulement ses prmières lignes, justement.</p>

<p>Heureusement, après avoir un peu fouillé, on finit par comprendre des choses sur
l&#8217;<abbr title="Advanced programming interface">API</abbr> metaWeblog (à mon avis mal documentée : là où j&#8217;ai le mieux compris, c&#8217;est
dans le source PHP de <abbr title="WordPress">WP</abbr>), à savoir que les premières lignes d&#8217;un message et sa
suite sont deux éléments metaWeblog distincts, à savoir <code>description</code> et
<code>mt_text_more</code>. Heureusement aussi que python est facile à lire et à éditer même
si on ne le connait pas : quelques temps après, j&#8217;avais patché avec succès ma
version locale de vimpress.</p>

<p>Bref, c&#8217;est maintenant un plaisir pour moi de pouvoir éditer mes billets sous
vim, confortablement. Pour augmenter ce confort, je rédige en <a href="http://daringfireball.net/projects/markdown/">markdown</a> (et
plus précisément en <a href="http://michelf.com/projects/php-markdown/extra/">markdown extra</a>), mais je vous ai déjà assez ennuyé
pour aujourd&#8217;hui : ce sera l&#8217;objet du prochain billet.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2008/07/wordpress-a-ma-sauce-partie-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Installation Wordpress sur Apache sur Debian</title>
		<link>http://weblog.elzevir.fr/2008/06/installation-wordpress-sur-apache-sur-debian/</link>
		<comments>http://weblog.elzevir.fr/2008/06/installation-wordpress-sur-apache-sur-debian/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 21:46:38 +0000</pubDate>
		<dc:creator>mpg</dc:creator>
				<category><![CDATA[Informatique générale]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[unix-admin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.elzevir.fr/?p=5</guid>
		<description><![CDATA[En guise de premier article, un how-to de circonstance : tout frais avant que
j&#8217;aie oublié. Et un avertissement pour inaugurer le tag « how-to » : il ne faut
pas le lire « comment faire », mais plutôt « comment j&#8217;ai fait »&#8230;

Tout d&#8217;abord, j&#8217;ai lancé un petit aptitude install wordpress et commencé à
regarder ce qui [...]]]></description>
			<content:encoded><![CDATA[<p>En guise de premier article, un how-to de circonstance : tout frais avant que
j&#8217;aie oublié. Et un avertissement pour inaugurer le tag « how-to » : il ne faut
pas le lire « comment faire », mais plutôt « comment j&#8217;ai fait »&#8230;</p>

<p>Tout d&#8217;abord, j&#8217;ai lancé un petit <code>aptitude install wordpress</code> et commencé à
regarder ce qui se trouvait dans <code>/u/s/d/wordpress</code>. Il y avait un <code>README</code> et
des exemples de configuration Apache et de script pour aider à créer une base
mysql et permettre à wordpress d&#8217;y accéder.
<span id="more-5"></span></p>

<p>J&#8217;ai d&#8217;abord été surpris de constater que le script échouait, tout simplement
parce que je n&#8217;avais pas de serveur mysql qui tournait. Enquête faite,
mysql-server est simplement suggéré par wordpress et pas installé d&#8217;office, car
on pourrait en principe utiliser une <abbr title="base de données">bdd</abbr>
distante. Soit, j&#8217;installe <code>mysql-server-5.0</code> et tout marche.</p>

<p>Mais après quelques minutes à configurer la chose, je change d&#8217;avis et me met à
penser que c&#8217;est mieux d&#8217;installer wordpress à la main dans mon home : je trouve
lourd d&#8217;avoir à être root pour installer des thèmes par exemple. Donc on efface
tout et on recommence, sauf qu&#8217;avant de désinstaller on dit <code>aptitude
unmarkauto</code> avec la liste des dépendances de wordpress histoire de les garder
sous le coude.</p>

<p>Bref, je suis donc parti du site <a href="http://fr.wordpress.org/">http://fr.wordpress.org/</a>, j&#8217;ai téléchargé
l&#8217;archive et l&#8217;ai dézippée dans <code>~/www/weblog</code>. J&#8217;ai alors suivi les
instructions en bas de page et plus spécifiquement celles présentes
<a href="http://codex.wordpress.org/Installing_WordPress">ici</a> pour la création et
configuration de la bdd. Tout a bien marché.</p>

<p>Par contre, en testant, j&#8217;ai une mauvaise surprise, provenant des exemples de
<code>.htaccess</code> préalablement recopiés : il semblerait que la directive <code>ErrorLog</code>,
qui ne provoquait pas d&#8217;erreur à la relecture de la configuration, faisait par
contre tout bonnement mourir le serveur (dans des souffrances atroces,
j&#8217;imagine) quand on tentait d&#8217;accéder à la page. J&#8217;ai abandonné l&#8217;idée
d&#8217;utiliser cette fonctionnalité pour le moment.</p>

<p>L&#8217;autre petit souci est survenu quand j&#8217;ai voulu configurer des jolis
<em>permaliens</em> : d&#8217;une part il faut penser à mettre le code aimablement fournit
par wordpress dans une directive <code>&lt;Directory&gt;</code> comme nous l&#8217;apprend le message
d&#8217;erreur. D&#8217;autre part, c&#8217;est stupide mais il faut y penser : il faut activer
<code>mod_rewrite</code> <img src='http://weblog.elzevir.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<p>Pour finir, deux mots sur la configuration d&#8217;Apache. Comme souvent chez Debian,
c&#8217;est un peu sophistiqué mais assez bien fait : pour les sites comme pour les
modules, il y a un répertoire <code>*-available</code> et un <code>*-enabled</code> et on active les
trucs en faisant des liens symboliques du deuxième vers le premier. J&#8217;en profite
d&#8217;ailleurs pour place dans le home de mon utilisateur les fichiers de
configuration propres à chacun des serveurs virtuels, et lui donne le droit
grâce à sudo de demander à Apache de relire ses fichiers de configuration.</p>

<p>Je trouve ça plus pratique que de lister les sites virtuels dans le fichier de
conf principal d&#8217;Apache puis d&#8217;utiliser des <code>.haccess</code>. D&#8217;une part, au moment du
<code>reload</code> on a les messages d&#8217;erreur si les directives ne sont pas correctes,
d&#8217;autre part, ça fait toujours un fichier de moins à analyser chaque requête
pour Apache.</p>

<p>Bref, mon <code>~/www/weblog.conf</code> Kimarch® est le suivant :</p>

<pre><code>&lt;VirtualHost *:*&gt;
    ServerName weblog.elzevir.fr
    DocumentRoot /home/mpg/www/weblog
    &lt;Directory /&gt;
        Options FollowSymLinks
        AllowOverride All
    &lt;IfModule mod_rewrite.c&gt;
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.php [L]
    &lt;/IfModule&gt;
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</code></pre>

<p>Je crois n&#8217;avoir rien oublié, tout a l&#8217;air de marcher pour le moment.</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.elzevir.fr/2008/06/installation-wordpress-sur-apache-sur-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
