<?xml
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Guillaume Orsal</title>
	<link>https://www.orsal.fr/</link>
	<description>Ing&#233;nieur informatique, d&#233;veloppeur Web Freelance, cr&#233;ation site Internet, conseil en r&#233;f&#233;rencement, expert Laravel, SEO, Intelligence Artificielle</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.orsal.fr/spip.php?id_rubrique=3&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>R&#233;g&#233;n&#233;rer les permaliens WordPress apr&#232;s une mise &#224; jour</title>
		<link>https://www.orsal.fr/Regenerer-les-permaliens-WordPress</link>
		<guid isPermaLink="true">https://www.orsal.fr/Regenerer-les-permaliens-WordPress</guid>
		<dc:date>2026-01-11T15:29:30Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Apr&#232;s une mise &#224; jour ou un d&#233;ploiement WordPress, il peut arriver que les permaliens cessent de fonctionner. Une simple commande en ligne de commande permet de corriger le probl&#232;me sans acc&#233;der au back-office.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Developpement-Web" rel="directory"&gt;D&#233;veloppement Web&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton75-00d22.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff75-db3ba.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton75-00d22.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Apr&#232;s une mise &#224; jour ou un d&#233;ploiement WordPress, il peut arriver que les permaliens cessent de fonctionner. Une simple commande en ligne de commande permet de corriger le probl&#232;me sans acc&#233;der au back-office.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Quand WordPress est mis &#224; jour, certains sites se retrouvent avec des erreurs 404 ou des messages du type :
&lt;strong&gt;Not Found &#8211; no results were found for the requested archive&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Dans la majorit&#233; des cas, rien n'a disparu. C'est simplement le syst&#232;me des permaliens qui ne correspond plus &#224; la configuration effective du serveur.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Pourquoi les permaliens doivent &#234;tre r&#233;g&#233;n&#233;r&#233;s ?&lt;/h2&gt;
&lt;p&gt;WordPress conserve sa structure d'URL dans sa base et part du principe que l'environnement ne change pas. Or il suffit d'un d&#233;placement de dossier, d'une migration, d'un changement subtil sur Apache, pour que le syst&#232;me perde ses rep&#232;res. Quand cela arrive, les requ&#234;tes ne sont plus r&#233;&#233;crites correctement, ce qui se traduit par des pages introuvables alors que le contenu est bien l&#224;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Solution sans interface : une commande shell&lt;/h2&gt;
&lt;p&gt;Quand on a acc&#232;s &#224; l'administration WordPress, le passage par R&#233;glages &gt; Permaliens suffit &#8212; mais si l'on travaille en SSH ou en d&#233;ploiement automatis&#233;, une commande r&#233;sout le probl&#232;me plus proprement :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; &lt;br /&gt; cd /chemin/vers/mon/site/wordpress \&lt;br /&gt; &amp;&amp; php -r &quot;define('WP_USE_THEMES', false); require('./wp-load.php'); flush_rewrite_rules();&quot; \&lt;br /&gt; &amp;&amp; echo &quot;Permaliens r&#233;g&#233;n&#233;r&#233;s avec succ&#232;s&quot; &lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Elle charge WordPress, force la r&#233;g&#233;n&#233;ration de la structure d'URL et s'arr&#234;te l&#224;, sans n&#233;cessiter d'acc&#232;s au back-office.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Quand l'utiliser ?&lt;/h2&gt;
&lt;p&gt;Ce petit flush devient utile apr&#232;s un changement de domaine, une mise &#224; jour majeure, l'ajout ou la suppression d'un plugin qui modifie les URLs, ou tout simplement apr&#232;s un d&#233;ploiement CI/CD qui recopie le site sur un serveur neuf.&lt;/p&gt; &lt;p&gt;Si l'erreur se reproduit, il est possible de l'int&#233;grer dans un script de maintenance ou un hook post-d&#233;ploiement.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Bonnes pratiques et limites&lt;/h2&gt;
&lt;p&gt;La commande est efficace, mais ce n'est pas un bouton magique &#224; actionner en continu. R&#233;g&#233;n&#233;rer les permaliens demande &#224; WordPress de reconstruire sa m&#233;canique interne. Cela reste une op&#233;ration raisonnablement lourde en fonction du nombre de contenu sur le site.&lt;/p&gt; &lt;p&gt;Si apr&#232;s ex&#233;cution les erreurs persistent, le probl&#232;me est probablement ailleurs : mod_rewrite peut &#234;tre d&#233;sactiv&#233;, le .htaccess mal plac&#233;, ou le virtual host trop restrictif. Une v&#233;rification rapide de ces points r&#233;sout la plupart des cas t&#234;tus.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;En r&#233;sum&#233;, forcer WordPress &#224; reconstruire ses permaliens r&#232;gle en quelques secondes un probl&#232;me qui peut faire perdre des heures si l'on cherche trop loin. C'est une astuce simple, propre, et id&#233;ale quand l'acc&#232;s au tableau de bord n'est pas pratique ou quand on automatise ses d&#233;ploiements.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>llms.txt : un standard de documentation pour l'usage des contenus par les mod&#232;les d'IA</title>
		<link>https://www.orsal.fr/llms-txt-un-standard-de</link>
		<guid isPermaLink="true">https://www.orsal.fr/llms-txt-un-standard-de</guid>
		<dc:date>2025-12-30T14:03:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Faut-il mettre en place un fichier llms.txt sur son site ? &#192; quoi sert-il vraiment, et est-ce que les IA le respectent ? Tour d'horizon concret de ce standard &#233;mergent, entre bonnes pratiques, limites r&#233;elles et usages possibles.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Referencement-SEO-GEO" rel="directory"&gt;R&#233;f&#233;rencement SEO/GEO&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton71-fcc41.png' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff71-83c70.png'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton71-fcc41.png'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;llms.txt est un standard &#233;mergent qui permet d'indiquer aux mod&#232;les d'IA comment les contenus d'un site web peuvent &#234;tre utilis&#233;s. Cette page d&#233;taille le r&#244;le du fichier llms.txt, son fonctionnement, ses principaux cas d'usage, ainsi que ses implications pour l'IA g&#233;n&#233;rative, le droit d'auteur et la notion de consentement des donn&#233;es.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Faut-il mettre en place un fichier &lt;strong&gt;llms.txt&lt;/strong&gt; sur son site ? &#192; quoi sert-il vraiment, et est-ce que les IA le respectent ? Tour d'horizon concret de ce standard &#233;mergent, entre bonnes pratiques, limites r&#233;elles et usages possibles.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; TL ;DR &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; est un &lt;strong&gt;fichier texte&lt;/strong&gt; plac&#233; &#224; la racine d'un site web (&lt;strong&gt;/llms.txt&lt;/strong&gt;) permettant de documenter, de fa&#231;on d&#233;clarative, les conditions d'utilisation de ses contenus par des &lt;strong&gt;mod&#232;les d'IA&lt;/strong&gt; (LLMs). Ce standard &#233;mergent vise &#224; am&#233;liorer la transparence entre cr&#233;ateurs de contenu et d&#233;veloppeurs d'IA, &lt;strong&gt;sans m&#233;canisme technique contraignant&lt;/strong&gt;. Il permet notamment d'autoriser l'entra&#238;nement des mod&#232;les tout en en fixant les limites (usage commercial, attribution, donn&#233;es sensibles). Il s'inscrit dans la continuit&#233; des standards du web ouvert comme &lt;strong&gt;robots.txt&lt;/strong&gt; ou &lt;a href='https://www.orsal.fr/Humans-txt-creer-un-fichier-de' class='spip_in'&gt;Humans.txt&lt;/a&gt;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Introduction : llms.txt, un standard &#233;mergent pour l'&#232;re de l'IA g&#233;n&#233;rative &lt;/h2&gt;
&lt;p&gt;Avec la g&#233;n&#233;ralisation des mod&#232;les de langage de grande taille (Large Language Models, ou LLMs), une question devient centrale : comment les cr&#233;ateurs de contenu peuvent-ils indiquer aux syst&#232;mes d'IA les conditions d'utilisation de leurs donn&#233;es ?&lt;/p&gt; &lt;p&gt;Le fichier &lt;strong&gt;llms.txt&lt;/strong&gt; est une proposition de standard visant &#224; r&#233;pondre &#224; ce besoin. Il permet &#224; un site web de documenter, de mani&#232;re lisible par des agents automatis&#233;s, ses pr&#233;f&#233;rences concernant l'utilisation de ses contenus par des mod&#232;les d'IA.&lt;/p&gt; &lt;p&gt;L'objectif n'est pas d'imposer un m&#233;canisme technique de contr&#244;le, mais de fournir un cadre d&#233;claratif, simple et d&#233;centralis&#233;, que les d&#233;veloppeurs d'IA peuvent choisir de respecter.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Contexte : pourquoi llms.txt a &#233;merg&#233; &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;L'explosion des LLMs et des donn&#233;es d'entra&#238;nement&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Depuis 2023, avec la d&#233;mocratisation de mod&#232;les comme ChatGPT, les LLMs sont entra&#238;n&#233;s sur des volumes massifs de donn&#233;es issues du web public.&lt;/p&gt; &lt;p&gt;Concr&#232;tement, cela signifie que des contenus peuvent &#234;tre r&#233;utilis&#233;s pour entra&#238;ner des mod&#232;les sans que leurs auteurs aient forc&#233;ment &#233;t&#233; inform&#233;s, ni m&#234;me qu'ils aient eu l'occasion d'exprimer une position sur cet usage.&lt;/p&gt; &lt;p&gt;Ce flou pose un probl&#232;me assez basique : il n'existe pas vraiment de moyen standard pour dire ce qui est acceptable ou non. C&#244;t&#233; cr&#233;ateurs, difficile d'indiquer des conditions d'utilisation claires. Et c&#244;t&#233; d&#233;veloppeurs, tout aussi difficile de savoir sur quelles bases ils peuvent s'appuyer pour utiliser ces contenus.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;L'insuffisance des outils existants&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;robots.txt&lt;/strong&gt; permet de r&#233;guler l'exploration des pages par des moteurs de recherche, mais ne s'applique pas explicitement aux usages li&#233;s &#224; l'entra&#238;nement des mod&#232;les d'IA. Les balises &lt;strong&gt;&lt;meta&gt;&lt;/strong&gt; offrent une granularit&#233; limit&#233;e et ne couvrent pas les cas d'usage sp&#233;cifiques aux LLMs.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; propose une approche compl&#233;mentaire : un fichier plac&#233; &#224; la racine du site (&lt;strong&gt;/llms.txt&lt;/strong&gt;), destin&#233; &#224; &#234;tre consult&#233; par des agents IA pour comprendre les r&#232;gles d'usage d&#233;clar&#233;es par le propri&#233;taire du contenu.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Qu'est-ce que llms.txt et comment l'utiliser &lt;/h2&gt;
&lt;p&gt;Le fichier &lt;strong&gt;llms.txt&lt;/strong&gt; est un document texte simple, accessible publiquement, qui permet de documenter les politiques d'utilisation des contenus d'un site par des syst&#232;mes d'IA et des LLMs.&lt;/p&gt; &lt;p&gt;Il ne constitue ni une obligation l&#233;gale, ni une barri&#232;re technique, mais un m&#233;canisme de transparence destin&#233; &#224; faciliter le respect des pr&#233;f&#233;rences exprim&#233;es par les cr&#233;ateurs.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Ce que permet concr&#232;tement llms.txt &lt;/h2&gt;
&lt;p&gt;Contrairement &#224; une id&#233;e assez r&#233;pandue, &lt;strong&gt;llms.txt&lt;/strong&gt; ne sert pas uniquement &#224; interdire l'entra&#238;nement.&lt;/p&gt; &lt;p&gt;Son int&#233;r&#234;t est justement de permettre des positions plus nuanc&#233;es. On peut tr&#232;s bien &lt;strong&gt;autoriser l'entra&#238;nement des mod&#232;les&lt;/strong&gt;, tout en encadrant les usages qui en sont faits ensuite. Par exemple, accepter un usage dans un cadre de recherche ou d'indexation, mais refuser une exploitation commerciale directe ou une &lt;strong&gt;int&#233;gration dans un mod&#232;le propri&#233;taire&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;De la m&#234;me mani&#232;re, il devient possible de poser des conditions d'attribution explicites, ou d'exclure certaines cat&#233;gories de donn&#233;es, notamment lorsqu'elles sont personnelles ou sensibles.&lt;/p&gt; &lt;p&gt;Selon les cas, on peut aussi aller plus loin et d&#233;finir des r&#232;gles diff&#233;rentes en fonction des acteurs ou des types de mod&#232;les, m&#234;me si ce point reste encore assez informel aujourd'hui.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Structure recommand&#233;e (exemple indicatif) &lt;/h2&gt;
&lt;p&gt;Le format suivant est une proposition illustrative, inspir&#233;e de mises en &#339;uvre r&#233;elles. Il ne s'agit pas d'une sp&#233;cification officielle et peut &#233;voluer.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;# llms.txt &#8211; AI usage policy (example)&lt;br /&gt; &lt;br /&gt; [Preferences]&lt;br /&gt; Allow-LLM-Training: true&lt;br /&gt; Allow-Document-Indexing: true&lt;br /&gt; Allow-LLM-Scraping: true&lt;br /&gt; Allow-Embedded-LLM-Training: false&lt;br /&gt; &lt;br /&gt; [Restrictions]&lt;br /&gt; Content-Restrictions: commercial-use-restriction, copyright-sensitive&lt;br /&gt; Sensitive-Data: excluded&lt;br /&gt; &lt;br /&gt; [Rules]&lt;br /&gt; GPT-4: allow-training, allow-indexing&lt;br /&gt; Claude: allow-training, allow-indexing&lt;br /&gt; OpenSource-Models: allow-training&lt;br /&gt; &lt;br /&gt; [Attribution-Requirements]&lt;br /&gt; Citation-Required: true&lt;br /&gt; Attribution-Format: Author, Date, URL&lt;br /&gt; &lt;br /&gt; [Contact]&lt;br /&gt; Email: contact@example.com&lt;br /&gt; &lt;br /&gt; [Last-Updated]&lt;br /&gt; Date: 2026-01-04&lt;br /&gt; Version: 1.1&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt; Explication des principaux champs &lt;/h2&gt;
&lt;p&gt;Les principaux champs utilis&#233;s restent assez simples &#224; comprendre, m&#234;me sans sp&#233;cification formelle :&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Allow-LLM-Training&lt;/strong&gt; : autorise l'utilisation du contenu pour l'entra&#238;nement des mod&#232;les d'IA
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Allow-Embedded-LLM-Training&lt;/strong&gt; : interdit l'int&#233;gration directe du contenu dans des mod&#232;les propri&#233;taires ferm&#233;s
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Allow-Document-Indexing&lt;/strong&gt; : autorise l'usage pour des syst&#232;mes de r&#233;cup&#233;ration de documents (RAG)
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Sensitive-Data&lt;/strong&gt; : exclut explicitement toute donn&#233;e personnelle ou sensible
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Rules&lt;/strong&gt; : permet de d&#233;finir des r&#232;gles sp&#233;cifiques par acteur ou type de mod&#232;le
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Citation-Required&lt;/strong&gt; : rend l'attribution obligatoire pour tout usage&lt;/p&gt; &lt;p&gt;L'ensemble reste volontairement simple, l'objectif &#233;tant d'&#234;tre lisible plut&#244;t qu'exhaustif.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Pourquoi impl&#233;menter llms.txt &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pour les cr&#233;ateurs de contenu&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Pour un cr&#233;ateur de contenu, l'int&#233;r&#234;t de &lt;strong&gt;llms.txt&lt;/strong&gt; est surtout de pouvoir reprendre la main sur quelque chose qui, jusqu'ici, restait implicite.&lt;/p&gt; &lt;p&gt;On peut autoriser l'entra&#238;nement sans pour autant accepter tous les usages derri&#232;re. Cela permet par exemple de poser des limites sur l'exploitation commerciale, de clarifier les conditions d'attribution, ou simplement d'exprimer une position sur la mani&#232;re dont ses contenus peuvent &#234;tre r&#233;utilis&#233;s.&lt;/p&gt; &lt;p&gt;Au-del&#224; de l'aspect juridique, il y a aussi une logique de transparence. Formaliser ces r&#232;gles, m&#234;me de mani&#232;re d&#233;clarative, revient &#224; rendre explicite ce qui ne l'&#233;tait pas.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Pour les d&#233;veloppeurs d'IA&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;C&#244;t&#233; d&#233;veloppeurs, l'int&#233;r&#234;t est diff&#233;rent mais compl&#233;mentaire.&lt;/p&gt; &lt;p&gt;Disposer d'un fichier &lt;strong&gt;llms.txt&lt;/strong&gt; permet d'identifier plus facilement les contenus qui peuvent &#234;tre utilis&#233;s, et dans quelles conditions. Dans un contexte o&#249; les questions de droit d'auteur et de responsabilit&#233; sont de plus en plus pr&#233;sentes, ce type d'information devient utile pour cadrer les pratiques.&lt;/p&gt; &lt;p&gt;Cela ouvre aussi la voie &#224; des processus plus tra&#231;ables, o&#249; les sources et les conditions d'utilisation ne sont plus compl&#232;tement implicites.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Bonnes pratiques &lt;/h2&gt;
&lt;p&gt;Dans la pratique, l'enjeu principal est d'&#233;viter toute ambigu&#239;t&#233;.&lt;/p&gt; &lt;p&gt;Un &lt;strong&gt;llms.txt&lt;/strong&gt; efficace est d'abord un fichier explicite et coh&#233;rent. Il doit distinguer clairement les diff&#233;rents usages &#8212; entra&#238;nement, indexation, int&#233;gration &#8212; sans introduire de contradictions.&lt;/p&gt; &lt;p&gt;Lorsque le contenu est amen&#233; &#224; &#234;tre r&#233;utilis&#233;, il est g&#233;n&#233;ralement pertinent de pr&#233;ciser les attentes en mati&#232;re d'attribution. De la m&#234;me mani&#232;re, les donn&#233;es sensibles devraient &#234;tre exclues sans ambigu&#239;t&#233;.&lt;/p&gt; &lt;p&gt;Enfin, comme pour les autres fichiers de ce type, il est utile de maintenir le document &#224; jour et de l'inscrire dans un ensemble plus large, aux c&#244;t&#233;s de &lt;strong&gt;robots.txt&lt;/strong&gt;, &lt;a href='https://www.orsal.fr/Humans-txt-creer-un-fichier-de' class='spip_in'&gt;Humans.txt&lt;/a&gt; ou &lt;a href=&quot;https://securitytxt.org/&quot; class='spip_out' rel='external'&gt;security.txt&lt;/a&gt;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Impl&#233;mentation technique &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cr&#233;ation du fichier&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Cr&#233;er un fichier texte nomm&#233; &lt;strong&gt;llms.txt&lt;/strong&gt; &#224; la racine du site (&lt;strong&gt;/llms.txt&lt;/strong&gt;).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;V&#233;rification de l'accessibilit&#233;&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl -I https://www.example.com/llms.txt&lt;br /&gt; # Doit retourner : 200 OK&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Lien optionnel depuis le site&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;link rel=&quot;llms-policy&quot; href=&quot;/llms.txt&quot; /&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ou via un lien visible :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;a href=&quot;/llms.txt&quot;&gt;Politique d'utilisation IA (llms.txt)&lt;/a&gt;&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt; Adoption et perspectives &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; reste aujourd'hui un &lt;strong&gt;standard &#233;mergent&lt;/strong&gt;, apparu autour de 2023&#8211;2024, et dont l'adoption est encore assez h&#233;t&#233;rog&#232;ne.&lt;/p&gt; &lt;p&gt;Il n'existe pas, &#224; ce stade, de reconnaissance formelle par un organisme de standardisation. Pour autant, la dynamique n'est pas nouvelle : on retrouve un sch&#233;ma assez proche de celui de &lt;strong&gt;robots.txt&lt;/strong&gt; &#224; ses d&#233;buts, avec une adoption progressive port&#233;e par les usages, avant une &#233;ventuelle normalisation.&lt;/p&gt; &lt;p&gt;Dans le m&#234;me temps, les &#233;volutions r&#233;glementaires, notamment en Europe avec l'&lt;a href=&quot;https://artificial-intelligence-act.eu/&quot; class='spip_out' rel='external'&gt;AI Act&lt;/a&gt;, pourraient renforcer l'int&#233;r&#234;t de ce type de m&#233;canisme d&#233;claratif. Sans forc&#233;ment le rendre obligatoire, elles contribuent &#224; installer l'id&#233;e qu'une certaine transparence sur l'usage des donn&#233;es devient n&#233;cessaire.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Limitations et consid&#233;rations &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; pr&#233;sente aujourd'hui des limites qu'il vaut mieux avoir en t&#234;te d&#232;s le d&#233;part.&lt;/p&gt; &lt;p&gt;D'abord, son respect repose enti&#232;rement sur la bonne volont&#233; des acteurs qui choisissent de le consulter. Il n'existe aucun m&#233;canisme technique permettant de s'assurer qu'un agent s'y conforme r&#233;ellement.&lt;/p&gt; &lt;p&gt;Ensuite, le fichier ne pr&#233;voit pas de syst&#232;me d'authentification. En pratique, il est donc impossible de distinguer de mani&#232;re fiable les diff&#233;rents types d'agents ou de v&#233;rifier leur identit&#233;.&lt;/p&gt; &lt;p&gt;Enfin, la granularit&#233; reste assez limit&#233;e. Les r&#232;gles s'appliquent globalement au site, sans possibilit&#233; fine de d&#233;finir des politiques diff&#233;rentes selon les pages ou les sections.&lt;/p&gt; &lt;p&gt;Ces limites n'enl&#232;vent pas tout int&#233;r&#234;t au fichier, mais elles rappellent qu'il s'agit avant tout d'un outil de transparence, et non d'un dispositif de contr&#244;le.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Conclusion : une ouverture encadr&#233;e plut&#244;t qu'un refus global &lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; n'est pas un outil de blocage, mais un moyen d'exprimer clairement des conditions d'utilisation raisonn&#233;es.&lt;/p&gt; &lt;p&gt;Il permet d'autoriser l'entra&#238;nement des mod&#232;les d'IA tout en en fixant les limites : attribution, respect du droit d'auteur, exclusion des donn&#233;es sensibles et refus de certaines int&#233;grations propri&#233;taires.&lt;/p&gt; &lt;p&gt;&#192; l'image de &lt;strong&gt;robots.txt&lt;/strong&gt; ou &lt;a href='https://www.orsal.fr/Humans-txt-creer-un-fichier-de' class='spip_in'&gt;Humans.txt&lt;/a&gt;, &lt;strong&gt;llms.txt&lt;/strong&gt; s'inscrit dans la tradition du web ouvert : un &#233;cosyst&#232;me fond&#233; sur des conventions partag&#233;es, la transparence et la responsabilit&#233;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Ressources et r&#233;f&#233;rences &lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;a href=&quot;https://llmstxt.org/&quot; class='spip_out' rel='external'&gt;Site officiel llmstxt.org&lt;/a&gt;&lt;/p&gt; &lt;h2 class='h3 spip'&gt; Voir aussi &lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;a href='https://www.orsal.fr/Humans-txt-creer-un-fichier-de' class='spip_in'&gt;Humans.txt&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Obfuscation d'email : CSS vs JavaScript, am&#233;lioration des performances SEO (LCP, CLS)</title>
		<link>https://www.orsal.fr/Obfuscation-d-email-CSS-vs</link>
		<guid isPermaLink="true">https://www.orsal.fr/Obfuscation-d-email-CSS-vs</guid>
		<dc:date>2025-12-06T17:20:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Lors d'une analyse de performance web, un JavaScript charg&#233; uniquement pour l'obfuscation d'une adresse email a &#233;t&#233; identifi&#233; comme inutile. Cet article pr&#233;sente une alternative bas&#233;e sur du CSS pur, puis une solution c&#244;t&#233; serveur permettant d'am&#233;liorer les performances SEO (LCP, CLS) tout en pr&#233;servant l'exp&#233;rience utilisateur, notamment sur mobile.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Referencement-SEO-GEO" rel="directory"&gt;R&#233;f&#233;rencement SEO/GEO&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton72-eb5a9.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff72-85da7.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton72-eb5a9.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lors d'une analyse de performance web, un JavaScript charg&#233; uniquement pour l'obfuscation d'une adresse email a &#233;t&#233; identifi&#233; comme inutile. Cet article pr&#233;sente une alternative bas&#233;e sur du CSS pur, puis une solution c&#244;t&#233; serveur permettant d'am&#233;liorer les performances SEO (LCP, CLS) tout en pr&#233;servant l'exp&#233;rience utilisateur, notamment sur mobile.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Pourquoi l'obfuscation d'email pose un probl&#232;me de performance&lt;/h2&gt;
&lt;p&gt;L'&lt;strong&gt;obfuscation d'email&lt;/strong&gt;, qui d&#233;signe les techniques utilis&#233;es pour rendre une adresse moins directement exploitable par des robots tout en restant lisible pour un humain, est une probl&#233;matique ancienne du web. Historiquement, elle a souvent &#233;t&#233; trait&#233;e via du JavaScript charg&#233; au runtime pour reconstruire une adresse ou un lien &lt;code class='spip_code' dir='ltr'&gt;mailto:&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;M&#234;me si ce type de script n'a pas toujours un impact mesurable imm&#233;diat sur les &lt;strong&gt;Core Web Vitals&lt;/strong&gt;, il alourdit la page en ajoutant une &lt;strong&gt;ressource non essentielle&lt;/strong&gt;. Il complexifie le rendu c&#244;t&#233; client, introduit des d&#233;pendances &#233;vitables et peut d&#233;grader marginalement le LCP sur des pages simples. &#192; cela s'ajoute un effet sur la lisibilit&#233; du code, ce qui nuit &#224; long terme &#224; la maintenabilit&#233;.&lt;/p&gt; &lt;p&gt;Dans une d&#233;marche d'&lt;strong&gt;optimisation SEO moderne&lt;/strong&gt;, chaque ressource doit justifier sa pr&#233;sence.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Rappel : Core Web Vitals et performance per&#231;ue&lt;/h2&gt;
&lt;p&gt;Les Core Web Vitals sont un ensemble d'indicateurs d&#233;finis par Google pour &#233;valuer la qualit&#233; de l'exp&#233;rience utilisateur r&#233;elle. Ils ne mesurent pas uniquement la rapidit&#233; brute, mais la perception du chargement et la stabilit&#233; de l'interface.&lt;/p&gt; &lt;p&gt;Le &lt;strong&gt;LCP (Largest Contentful Paint)&lt;/strong&gt; refl&#232;te la vitesse d'affichage du contenu principal.&lt;/p&gt; &lt;p&gt;Le &lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt; mesure la stabilit&#233; visuelle de la page.&lt;/p&gt; &lt;p&gt;Un script JavaScript non essentiel peut retarder l&#233;g&#232;rement le rendu initial ou provoquer des recalculs inutiles.&lt;/p&gt; &lt;p&gt;M&#234;me lorsqu'un script n'entra&#238;ne pas de d&#233;gradation mesurable imm&#233;diate, sa suppression simplifie la cha&#238;ne de rendu et am&#233;liore la performance per&#231;ue, en particulier sur mobile. Ces principes s'inscrivent dans les recommandations de Google pour favoriser des pages rapides, stables et adapt&#233;es &#224; l'&lt;strong&gt;indexation mobile-first&lt;/strong&gt;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;R&#233;duire le JavaScript pour am&#233;liorer le SEO technique&lt;/h2&gt;
&lt;p&gt;La performance web ne se r&#233;sume pas &#224; un score PageSpeed. Elle repose sur plusieurs principes cl&#233;s : limiter le JavaScript non essentiel, r&#233;duire le travail du navigateur, stabiliser l'affichage pour &#233;viter les d&#233;calages visuels (CLS) et am&#233;liorer la performance per&#231;ue, notamment sur mobile.&lt;/p&gt; &lt;p&gt;Supprimer un script inutile est souvent l'une des optimisations les plus simples et les plus efficaces.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Obfuscation d'email sans JavaScript : approche CSS&lt;/h2&gt;
&lt;p&gt;Il est possible d'afficher une adresse email sans qu'elle soit directement exploitable dans le code source, en utilisant uniquement du HTML et du &lt;strong&gt;CSS&lt;/strong&gt;, sans JavaScript c&#244;t&#233; client.&lt;/p&gt; &lt;p&gt;La technique consiste &#224; d&#233;couper l'email dans des attributs &lt;code class='spip_code' dir='ltr'&gt;data-*&lt;/code&gt;. Le CSS se charge ensuite de masquer le placeholder, et de reconstituer le contenu visible &#224; partir des attributs. Ainsi, il n'y a plus de code c&#244;t&#233; client qui r&#233;alise le masquage de l'information.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Structure HTML&lt;/h2&gt;
&lt;p&gt;L'email est d&#233;coup&#233; en deux parties stock&#233;es dans des attributs &lt;code class='spip_code' dir='ltr'&gt;data-*&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Il n'appara&#238;t jamais directement sous forme exploitable dans le HTML.&lt;/p&gt; &lt;p&gt;L'application de la classe de style masque le contenu initial et reconstruit l'affichage via le CSS.&lt;/p&gt; &lt;p&gt;Le texte pr&#233;sent dans le &lt;code class='spip_code' dir='ltr'&gt;&lt;span&gt;&lt;/code&gt; reste dans le DOM mais n'est plus visible.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;span class=&quot;protected-email&quot;&lt;br /&gt; data-email-user=&quot;guillaume&quot;&lt;br /&gt; data-email-domain=&quot;orsal.net&quot;&gt;&lt;br /&gt; [email protected]&lt;br /&gt; &lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Feuille de style CSS&lt;/h2&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;/* Masque le contenu initial du bloc */&lt;br /&gt; .protected-email {&lt;br /&gt; font-size: 0;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /* Reconstruit visuellement l'email &#224; partir des attributs data-* */&lt;br /&gt; .protected-email::before {&lt;br /&gt; font-size: 14px;&lt;br /&gt; content: attr(data-email-user) &quot;@&quot; attr(data-email-domain);&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le choix de &lt;code class='spip_code' dir='ltr'&gt;font-size: 0&lt;/code&gt; masque le texte sans modifier la structure du DOM ni provoquer de recalcul de layout.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;B&#233;n&#233;fices en termes de performance et de r&#233;f&#233;rencement&lt;/h2&gt;
&lt;p&gt;Cette solution pr&#233;sente plusieurs avantages du point de vue SEO et performance.&lt;/p&gt; &lt;p&gt;Il n'y a aucun JavaScript &#224; charger ou ex&#233;cuter, l'impact est donc nul sur le LCP et le CLS, le rendu est imm&#233;diat sans recalcul.&lt;/p&gt; &lt;p&gt;La compatibilit&#233; est maximale avec les navigateurs et la lecture reste possible par les moteurs de recherche.&lt;/p&gt; &lt;p&gt;Enfin, elle continue d'offrir une protection suffisante contre les collectes automatis&#233;es basiques des robots et s'inscrit dans une logique de sobri&#233;t&#233; et d'optimisation structurelle du front-end.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Limite fonctionnelle : l'exp&#233;rience utilisateur sur mobile&lt;/h2&gt;
&lt;p&gt;Cette approche purement CSS pr&#233;sente toutefois une limite : l'adresse email affich&#233;e n'est pas cliquable.&lt;/p&gt; &lt;p&gt;Sur desktop, cela peut &#234;tre acceptable. Sur mobile, l'utilisateur s'attend &#224; ce qu'un email soit interactif et ouvre son client de messagerie.&lt;/p&gt; &lt;p&gt;Une optimisation technique ne doit pas se faire au d&#233;triment de l'exp&#233;rience utilisateur.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;R&#233;tablir l'UX sans JavaScript : redirection c&#244;t&#233; serveur&lt;/h2&gt;
&lt;p&gt;Pour concilier performance, UX et protection minimale contre les bots, une solution consiste &#224; utiliser une redirection c&#244;t&#233; serveur vers un lien &lt;code class='spip_code' dir='ltr'&gt;mailto:&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;L'email n'est jamais expos&#233; sous forme de lien dans le HTML, et aucune logique JavaScript n'est ajout&#233;e.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Script de redirection contact.php&lt;/h2&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;?php&lt;br /&gt; // D&#233;sactivation explicite du cache HTTP&lt;br /&gt; header('Cache-Control: no-cache, no-store, must-revalidate');&lt;br /&gt; header('Pragma: no-cache');&lt;br /&gt; header('Expires: 0');&lt;br /&gt; &lt;br /&gt; // Redirection vers le mailto&lt;br /&gt; header('Location: mailto:email@example.com?subject=contact');&lt;br /&gt; exit;&lt;br /&gt; ?&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Les en-t&#234;tes HTTP d&#233;sactivant le cache sont essentiels. Une redirection mise en cache par un navigateur, un proxy ou un CDN pourrait conserver un comportement obsol&#232;te, ignorer une &#233;volution future ou introduire des effets de bord difficiles &#224; diagnostiquer.&lt;/p&gt; &lt;p&gt;Le script ne prend volontairement aucun param&#232;tre utilisateur afin de limiter les risques d'abus, de d&#233;tournement, ou d'envoi involontaire vers un point d'entr&#233;e exploitable.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Utilisation c&#244;t&#233; HTML&lt;/h2&gt;
&lt;p&gt;L'email masqu&#233; est ensuite encapsul&#233; dans un lien pointant vers le script de redirection.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;a href=&quot;/contact.php&quot; title=&quot;Me contacter par email&quot; rel=&quot;nofollow&quot;&gt;&lt;br /&gt; &lt;span class=&quot;protected-email&quot; data-email-user=&quot;guillaume&quot; data-email-domain=&quot;orsal.net&quot;&gt;&lt;br /&gt; [email protected]&lt;br /&gt; &lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le lien est marqu&#233; en &lt;code class='spip_code' dir='ltr'&gt;nofollow&lt;/code&gt; car l'objectif est uniquement l'action utilisateur, pas le r&#233;f&#233;rencement du script.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Cette approche supprime une d&#233;pendance JavaScript inutile, ce qui contribue &#224; pr&#233;server des indicateurs tels que le LCP et le CLS. L'interactivit&#233; attendue sur mobile est &#233;galement pr&#233;serv&#233;e, tout comme la limitation de l'exposition de l'adresse email. Le code obtenu est simple, maintenable et &#233;l&#233;gant.&lt;/p&gt; &lt;p&gt;L'optimisation des performances web et du r&#233;f&#233;rencement repose parfois sur des choix simples et structurants.&lt;/p&gt; &lt;p&gt;R&#233;duire le JavaScript non essentiel en exploitant les capacit&#233;s du CSS aura permis ici d'am&#233;liorer &#224; la fois le SEO technique et la performance per&#231;ue, sans modifier l'exp&#233;rience utilisateur.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Installer et utiliser Ollama : l'intelligence artificielle locale sous Linux</title>
		<link>https://www.orsal.fr/Installer-et-utiliser-Ollama-l</link>
		<guid isPermaLink="true">https://www.orsal.fr/Installer-et-utiliser-Ollama-l</guid>
		<dc:date>2025-11-02T20:21:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Dans cet article, je vous guide pas &#224; pas : installation d'Ollama sous Linux, choix et t&#233;l&#233;chargement de mod&#232;les open source comme Mistral ou Phi-3, tests de l'API REST et int&#233;gration dans Laravel pour b&#233;n&#233;ficier d'une IA locale rapide, &#233;conomique et respectueuse de vos donn&#233;es.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Data-Mining-IA-Decisionnel" rel="directory"&gt;Data Mining, IA, D&#233;cisionnel&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton70-c33a4.png' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff70-25ae0.png'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton70-c33a4.png'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dipl&#244;m&#233; d'un &lt;a href='https://www.orsal.fr/Ingenieur-Informatique-Freelance' class='spip_in'&gt;master en Intelligence Artificielle&lt;/a&gt;, je suis aujourd'hui &lt;strong&gt;d&#233;veloppeur web fullstack&lt;/strong&gt; sp&#233;cialis&#233; en &lt;strong&gt;Laravel, Livewire, React&lt;/strong&gt;. J'int&#232;gre l'&lt;strong&gt;IA g&#233;n&#233;rative&lt;/strong&gt; dans les projets web modernes pour cr&#233;er des solutions intelligentes, sans d&#233;pendance aux API propri&#233;taires.&lt;/p&gt; &lt;p&gt;Dans cet article, je vous guide pas &#224; pas : &lt;strong&gt;installation d'Ollama sous Linux&lt;/strong&gt;, choix et t&#233;l&#233;chargement de &lt;strong&gt;mod&#232;les open source&lt;/strong&gt; comme Mistral ou Phi-3, tests de l'API REST et int&#233;gration dans &lt;strong&gt;Laravel&lt;/strong&gt; pour b&#233;n&#233;ficier d'une &lt;strong&gt;IA locale&lt;/strong&gt; rapide, &#233;conomique et respectueuse de vos donn&#233;es.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Installation d'Ollama sous Linux&lt;/h2&gt;
&lt;p&gt;L'installation d'Ollama sous Linux (Debian/Ubuntu) est tr&#232;s simple gr&#226;ce au script officiel fourni par l'&#233;quipe Ollama :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl -fsSL https://ollama.com/install.sh | sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Une fois install&#233;, la commande &lt;strong&gt;ollama&lt;/strong&gt; devient disponible et le service syst&#232;me d&#233;marre automatiquement. Par d&#233;faut, &lt;strong&gt;Ollama &#233;coute uniquement en local&lt;/strong&gt; sur 127.0.0.1:11434, ce qui garantit qu'aucune requ&#234;te externe ne peut atteindre votre instance tant que vous ne modifiez pas la config r&#233;seau.&lt;/p&gt; &lt;p&gt;Pour v&#233;rifier le statut du service :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;systemctl status ollama&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le service doit afficher &lt;strong&gt;active (running)&lt;/strong&gt;.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;V&#233;rifier l'&#233;coute du service&lt;/h2&gt;
&lt;p&gt;V&#233;rifier que le serveur Ollama &#233;coute bien sur son port par d&#233;faut avec :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ss -tulpen | grep 11434&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Vous devez obtenir une ligne similaire :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;tcp LISTEN 0 4096 127.0.0.1:11434 ...&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cette configuration emp&#234;che toute exposition r&#233;seau accidentelle.&lt;/p&gt; &lt;p&gt;Si le port n'est pas visible, le service n'est probablement pas d&#233;marr&#233; ou le firewall local bloque l'acc&#232;s.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;T&#233;l&#233;charger les mod&#232;les d'IA&lt;/h2&gt;
&lt;p&gt;Voici une &lt;a href=&quot;https://skywork.ai/blog/llm/ollama-models-list-2025-100-models-compared/&quot; class='spip_out' rel='external'&gt;s&#233;lection de mod&#232;les open-source adapt&#233;s &#224; diff&#233;rents usages&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ces mod&#232;les sont quantifi&#233;s (Q4/Q8), c'est-&#224;-dire que leur pr&#233;cision num&#233;rique interne est r&#233;duite pour occuper moins de VRAM et calculer plus vite, tout en gardant une qualit&#233; de g&#233;n&#233;ration tr&#232;s proche du mod&#232;le d'origine.&lt;/p&gt; &lt;p&gt;Ollama n'embarque aucun mod&#232;le par d&#233;faut : vous devrez donc t&#233;l&#233;charger ceux dont vous avez besoin via &lt;code class='spip_code' dir='ltr'&gt;{{ollama pull}}&lt;/code&gt;.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama pull mistral&lt;br /&gt; ollama pull phi3&lt;br /&gt; ollama pull neural-chat&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Mistral&lt;/strong&gt; : excellentes performances en g&#233;n&#233;ration de texte
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Phi 3&lt;/strong&gt; : l&#233;ger et performant
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;NeuralChat&lt;/strong&gt; : ton conversationnel naturel&lt;/p&gt; &lt;p&gt;Pour lister les mod&#232;les install&#233;s :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama list&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Premier test de g&#233;n&#233;ration&lt;/h2&gt;
&lt;p&gt;Vous pouvez interroger Ollama directement via son &lt;strong&gt;API REST locale&lt;/strong&gt;. Par exemple, pour tester la g&#233;n&#233;ration avec Mistral :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl http://127.0.0.1:11434/api/generate -d '{&quot;model&quot;:&quot;mistral&quot;,&quot;prompt&quot;:&quot;Dis bonjour&quot;}'&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ollama renvoie la r&#233;ponse sous forme de tokens JSON en streaming, comme une API OpenAI.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Obtenir uniquement le texte final&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;jq&lt;/strong&gt; est indispensable si vous souhaitez parser proprement les r&#233;ponses JSON en ligne de commande ou dans vos scripts Bash.&lt;/p&gt; &lt;p&gt;L'outil s'installe avec la commande :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo apt-get install jq -y&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Puis, un nouvel appel &#224; l'API d'Ollama, cha&#238;n&#233; &#224; jq :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;curl -sN http://127.0.0.1:11434/api/generate -d '{&quot;model&quot;:&quot;mistral&quot;,&quot;prompt&quot;:&quot;Dis bonjour&quot;}' | jq -rj --unbuffered 'select(.response) | .response';echo&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le texte s'affiche sans formatage JSON.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Une fonction Bash pour simplifier l'usage&lt;/h2&gt;
&lt;p&gt;Pour simplifier vos tests sans r&#233;&#233;crire la commande curl, voici une fonction shell utilitaire &#224; ajouter &#224; vos alias dans &lt;strong&gt;.bash_aliases&lt;/strong&gt; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama-say() {&lt;br /&gt; if [ -z &quot;$1&quot; ]; then&lt;br /&gt; echo &quot;Usage: ollama-say \&quot;prompt\&quot; [model]&quot;&lt;br /&gt; return 1&lt;br /&gt; fi&lt;br /&gt; local PROMPT=&quot;$1&quot;&lt;br /&gt; local MODEL=&quot;${2:-mistral}&quot;&lt;br /&gt; curl -sN http://127.0.0.1:11434/api/generate \&lt;br /&gt; -d &quot;{\&quot;model\&quot;:\&quot;$MODEL\&quot;,\&quot;prompt\&quot;:\&quot;$PROMPT\&quot;}&quot; \&lt;br /&gt; | jq -rj --unbuffered 'select(.response) | .response'&lt;br /&gt; echo&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Recharger les alias :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;source ~/.bash_aliases&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez maintenant appeler Ollama comme une mini-API locale directement depuis le terminal, en pr&#233;cisant dans la ligne de commande le prompt suivi du mod&#232;le :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ollama-say &quot;Dis bonjour!&quot; mistral&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Apr&#232;s quelques secondes, vous obtiendrez la r&#233;ponse sans formatage.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Acc&#232;s distant via tunnel SSH&lt;/h2&gt;
&lt;p&gt;Ollama n'&#233;coute par d&#233;faut que l'IP &lt;strong&gt;127.0.0.1&lt;/strong&gt; pour des raisons de s&#233;curit&#233;. &lt;strong&gt;Evitez absolument d'exposer le port 11434 directement sur Internet.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Si le service tourne sur une autre machine, par exemple un serveur disposant de meilleures capacit&#233;s de calcul, vous pourrez cr&#233;er un tunnel SSH.&lt;/p&gt; &lt;p&gt;Remplacez &lt;i&gt;user&lt;/i&gt; par le login et &lt;i&gt;serveur&lt;/i&gt; par l'IP ou le nom du serveur.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ssh -L 11434:localhost:11434 user@serveur&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le mod&#232;le devient alors accessible sur votre poste via &lt;strong&gt;http://localhost:11434&lt;/strong&gt;. Le port local 11434 &#233;tant d&#233;sormais redirig&#233; vers le m&#234;me port sur le serveur.&lt;/p&gt; &lt;p&gt;Pour lancer le tunnel SSH en arri&#232;re-plan :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;ssh -N -f -L 11434:localhost:11434 user@serveur&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Pour fermer le tunnel, il faudra s'attaquer directement au processus :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;pkill -f &quot;ssh -L 11434&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cette approche permet un acc&#232;s distant tout en conservant le niveau de s&#233;curit&#233; d'un service local.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Int&#233;gration d'Ollama dans Laravel : cas d'usage concrets&lt;/h2&gt;
&lt;p&gt;L'API d'Ollama est compatible avec n'importe quel framework backend.&lt;/p&gt; &lt;p&gt;Ollama devient puissant lorsqu'il est int&#233;gr&#233; dans une architecture web moderne. Quelques applications concr&#232;tes :&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;G&#233;n&#233;ration de contenu&lt;/strong&gt; : Articles, descriptions produit, r&#233;sum&#233;s
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Analyse de texte&lt;/strong&gt; : Cat&#233;gorisation de commentaires, d&#233;tection de spam
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Suggestions intelligentes&lt;/strong&gt; : Recommandations, auto-compl&#233;tion
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Recherche s&#233;mantique&lt;/strong&gt; : Au-del&#224; des mots-cl&#233;s, recherche contextuelle via embeddings&lt;/p&gt; &lt;p&gt;Voici comment l'utiliser facilement dans Laravel via Http ::post() :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;php&lt;br /&gt; $response = Http::post('http://localhost:11434/api/generate', [&lt;br /&gt; 'model' =&gt; 'mistral',&lt;br /&gt; 'prompt' =&gt; 'G&#233;n&#232;re une description produit concise pour : ' . $product-&gt;name,&lt;br /&gt; 'stream' =&gt; false,&lt;br /&gt; ]);&lt;br /&gt; &lt;br /&gt; $description = $response-&gt;json()['response'];&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cela r&#233;duit drastiquement vos co&#251;ts API (OpenAI, Gemini) en gardant le contr&#244;le total de vos donn&#233;es.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Performances et optimisation GPU&lt;/h2&gt;
&lt;p&gt;Bien que Ollama fonctionne sans GPU, les performances augmentent significativement avec une carte graphique support&#233;e.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Sans GPU&lt;/strong&gt; : 5-30 secondes par r&#233;ponse selon le mod&#232;le
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Avec GPU NVIDIA&lt;/strong&gt; : Acc&#233;l&#233;ration de &lt;strong&gt;5 &#224; 20x&lt;/strong&gt;, r&#233;ponses en 1-5 secondes
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;VRAM n&#233;cessaire&lt;/strong&gt; : Mistral ( 4GB), Phi 3 ( 2GB), Llama 2 ( 7GB)&lt;/p&gt; &lt;p&gt;Benchmark simple :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;time ollama-say &quot;&#201;cris un email pour remercier un client&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;En production avec une application Laravel, placer Ollama sur un serveur distinct, id&#233;alement avec GPU, afin d'&#233;viter de saturer votre serveur web.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Alternatives : Ollama vs llama.cpp vs LocalAI&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt; : Installation simple, gestion facile des mod&#232;les, API REST standard. Meilleur pour d&#233;buter.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;llama.cpp&lt;/strong&gt; : Plus l&#233;ger, excellente performance CPU. Id&#233;al pour machines peu puissantes, mais installation plus complexe.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;LocalAI&lt;/strong&gt; : Interface web compl&#232;te, compatible avec OpenAI API. Meilleur si vous migrez depuis OpenAI.&lt;/p&gt; &lt;p&gt;Pour un d&#233;veloppeur fullstack Laravel cherchant du &lt;strong&gt;plug &amp; play&lt;/strong&gt; sans complexit&#233;, Ollama me semble le meilleur choix.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Erreurs courantes et d&#233;pannage&lt;/h2&gt;
&lt;p&gt;Ces erreurs sont les plus fr&#233;quentes lors d'un premier d&#233;ploiement d'Ollama sur un serveur Linux.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Erreur &#171; connection refused &#187;&lt;/strong&gt; : Ollama &#233;coute uniquement sur localhost par d&#233;faut. V&#233;rifier : `systemctl status ollama`. Pour l'acc&#232;s distant, utiliser obligatoirement un tunnel SSH.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Mod&#232;le qui ne r&#233;pond pas&lt;/strong&gt; : Il calcule toujours. Attendre plus longtemps la premi&#232;re fois. Pour des timeouts, augmenter : `curl &#8212;max-time 300`.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;VRAM satur&#233;e&lt;/strong&gt; : Un mod&#232;le trop gros pour votre GPU. V&#233;rifier : `nvidia-smi`. R&#233;duire la taille du prompt ou utiliser un mod&#232;le plus l&#233;ger.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Quantization confusion&lt;/strong&gt; : Ollama g&#232;re automatiquement. Q4 = rapide mais moins pr&#233;cis, Q8 = plus lent mais meilleur. Aucune action requise sauf pour tirage manuel.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ollama permet d'ex&#233;cuter des mod&#232;les d'IA directement sur un serveur Linux, &lt;strong&gt;sans GPU obligatoire&lt;/strong&gt;, sans d&#233;pendance tierce ni co&#251;ts r&#233;currents.&lt;/p&gt; &lt;p&gt;L'installation est rapide, la configuration s&#251;re, et la flexibilit&#233; excellente pour le d&#233;veloppement, les tests et et la g&#233;n&#233;ration de contenu automatis&#233;e.&lt;/p&gt; &lt;p&gt;Une solution robuste et respectueuse des donn&#233;es, id&#233;ale pour d&#233;veloppeurs et passionn&#233;s d'IA locale.&lt;/p&gt; &lt;p&gt;Ollama s'int&#232;gre parfaitement dans un workflow moderne Laravel/Livewire/React, que ce soit pour prototyper en local, automatiser des t&#226;ches &#233;ditoriales ou alimenter une plateforme SaaS interne.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Int&#233;grer Ollama &#224; votre stack full-stack : expertise et services&lt;/h2&gt;
&lt;p&gt;Int&#233;grer Ollama dans une architecture web (Laravel, React, Livewire, Tailwind) demande une bonne compr&#233;hension du code m&#233;tier, du traitement de texte g&#233;n&#233;ratif et des flux applicatifs.&lt;/p&gt; &lt;p&gt;Si vous envisagez d'&lt;strong&gt;ajouter de l'IA g&#233;n&#233;rative locale&lt;/strong&gt; &#224; votre application, je peux vous accompagner sur :&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Int&#233;gration Laravel / API&lt;/strong&gt; : prompts, streaming, validation, performances
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Automatisation &amp; file de jobs&lt;/strong&gt; : t&#226;ches lourdes, ex&#233;cution asynchrone
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;Choix et gestion des mod&#232;les&lt;/strong&gt; : Mistral, Phi-3, formats d'entr&#233;e/sortie
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;strong&gt;D&#233;ploiement sur serveur Linux&lt;/strong&gt; : installation, configuration et supervision de base&lt;/p&gt; &lt;p&gt;Je suis &lt;strong&gt;d&#233;veloppeur web fullstack sp&#233;cialis&#233; Laravel et IA g&#233;n&#233;rative locale&lt;/strong&gt;, avec une solide pratique Linux. Mon objectif : livrer des solutions &lt;strong&gt;fonctionnelles, maintenables et utilement assist&#233;es par l'IA&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href='https://www.orsal.fr/Ingenieur-Informatique-Freelance' class='spip_in'&gt;Parlons de votre projet&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Audit SEO : d&#233;tecter les pages avec une balise noindex via script automatis&#233;</title>
		<link>https://www.orsal.fr/Audit-SEO-detecter-les-pages-avec</link>
		<guid isPermaLink="true">https://www.orsal.fr/Audit-SEO-detecter-les-pages-avec</guid>
		<dc:date>2024-12-08T14:05:07Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;En examinant la Google Search Console d'un site r&#233;cemment, j'ai remarqu&#233; que certaines pages &#233;taient non index&#233;es &#224; cause d'une balise noindex. Ces balises sont des balises meta . Comme je ne savais pas exactement quelles pages &#233;taient concern&#233;es, j'ai d&#233;cid&#233; de cr&#233;er un script simple pour parcourir le site et identifier toutes les pages contenant cette balise. Dans cet article, je partage avec vous ce script et explique comment l'utiliser pour d&#233;tecter les pages avec une balise noindex. Cela peut vous (...)&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Referencement-SEO-GEO" rel="directory"&gt;R&#233;f&#233;rencement SEO/GEO&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton69-81cfa.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff69-e4df4.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton69-81cfa.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;En examinant la Google Search Console d'un site r&#233;cemment, j'ai remarqu&#233; que certaines pages &#233;taient non index&#233;es &#224; cause d'une balise noindex. Ces balises sont des balises meta &lt;meta name=&quot;robots&quot; content=&quot;noindex&quot;&gt;. Comme je ne savais pas exactement quelles pages &#233;taient concern&#233;es, j'ai d&#233;cid&#233; de cr&#233;er un script simple pour parcourir le site et identifier toutes les pages contenant cette balise.&lt;/p&gt; &lt;p&gt;Dans cet article, je partage avec vous ce script et explique comment l'utiliser pour d&#233;tecter les pages avec une balise noindex. Cela peut vous &#234;tre utile si, comme moi, vous souhaitez corriger ce type de probl&#232;me pour am&#233;liorer l'indexation de votre site par les moteurs de recherche.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Introduction : identifier les barri&#232;res d'indexation&lt;/h2&gt;
&lt;p&gt;La balise &lt;strong&gt;noindex&lt;/strong&gt; est un &#233;l&#233;ment cl&#233; de la gestion du SEO. Elle signale aux moteurs de recherche que certaines pages ne doivent pas &#234;tre index&#233;es, ce qui peut impacter significativement votre visibilit&#233; organique si utilis&#233;e &#224; mauvais escient. Lors d'audits SEO, il est courant de d&#233;couvrir des balises noindex involontaires ou mal configur&#233;es qui nuisent &#224; l'indexation de pages strat&#233;giques.&lt;/p&gt; &lt;p&gt;Cet article pr&#233;sente une approche automatis&#233;e pour parcourir un site et identifier toutes les pages contenant une balise noindex. Cette technique est indispensable pour diagnostiquer les probl&#232;mes d'indexation signal&#233;s dans la Google Search Console et &#233;valuer si chaque balise noindex est justifi&#233;e.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Comprendre la balise noindex et ses impacts&lt;/h2&gt;
&lt;p&gt;La balise noindex est une directive du protocole &lt;strong&gt;robots&lt;/strong&gt; plac&#233;e dans la section &lt;strong&gt;&lt;head&gt;&lt;/strong&gt; d'une page HTML. Elle se pr&#233;sente sous la forme :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;meta name=&quot;robots&quot; content=&quot;noindex&quot; /&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ou de mani&#232;re plus compl&#232;te :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;meta name=&quot;robots&quot; content=&quot;noindex, nofollow&quot; /&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Impact sur l'indexation&lt;/strong&gt; : Une page avec noindex est index&#233;e &lt;strong&gt;temporairement&lt;/strong&gt; par Google (pour v&#233;rifier la balise), puis &lt;strong&gt;supprim&#233;e des r&#233;sultats de recherche&lt;/strong&gt; apr&#232;s quelques semaines. Ce processus peut causer des fluctuations dans votre classement et votre couverture index&#233;e.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Quand noindex est justifi&#233;e&lt;/strong&gt; :
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Pages de test ou d&#233;veloppement
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Contenus en double (variantes de filtre, param&#232;tres d'URL)
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Pages archiv&#233;es ou d&#233;pr&#233;ci&#233;es intentionnellement
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Pages avec contenu sensible non destin&#233; au public&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Quand noindex pose probl&#232;me&lt;/strong&gt; :
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Appliqu&#233;e accidentellement &#224; des pages strat&#233;giques
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Pr&#233;-configur&#233;e sur un th&#232;me ou un CMS
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; R&#233;sultant de migrations mal g&#233;r&#233;es
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Pr&#233;sente dans une feuille de style CSS appliqu&#233;e globalement&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Diagnostic : automatiser la d&#233;tection noindex&lt;/h2&gt;
&lt;p&gt;Plut&#244;t que d'inspecter manuellement chaque page, un script d'audit permet un diagnostic rapide et complet. Voici un script shell Linux qui t&#233;l&#233;charge votre site et identifie toutes les pages avec noindex.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Script de d&#233;tection noindex complet&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt; &lt;br /&gt; # ============================================&lt;br /&gt; # Script d'audit SEO : d&#233;tection des balises noindex&lt;br /&gt; # Utilisation : ./script.sh https://www.exemple.com [PROFONDEUR]&lt;br /&gt; # ============================================&lt;br /&gt; &lt;br /&gt; # V&#233;rifier si une URL a &#233;t&#233; fournie&lt;br /&gt; if [ -z &quot;$1&quot; ]; then&lt;br /&gt; echo &quot;Usage: $0 &lt;URL&gt; [PROFONDEUR]&quot;&lt;br /&gt; echo &quot;Exemple : $0 https://www.exemple.com 3&quot;&lt;br /&gt; exit 1&lt;br /&gt; fi&lt;br /&gt; &lt;br /&gt; SITE_URL=&quot;$1&quot;&lt;br /&gt; DEPTH=${2:-2} # Profondeur par d&#233;faut : 2&lt;br /&gt; OUTPUT_DIR=&quot;site_scan_$(date +%s)&quot;&lt;br /&gt; NOINDEX_FILE=&quot;noindex_pages_$(date +%Y%m%d_%H%M%S).txt&quot;&lt;br /&gt; &lt;br /&gt; # Cr&#233;er un r&#233;pertoire temporaire pour stocker les pages&lt;br /&gt; mkdir -p &quot;$OUTPUT_DIR&quot;&lt;br /&gt; echo &quot;[*] Cr&#233;ation du r&#233;pertoire : $OUTPUT_DIR&quot;&lt;br /&gt; echo &quot;[*] Profondeur de parcours : $DEPTH&quot;&lt;br /&gt; &lt;br /&gt; # T&#233;l&#233;charger le site avec wget&lt;br /&gt; # --mirror : mode miroir (t&#233;l&#233;charge r&#233;cursivement)&lt;br /&gt; # --convert-links : convertit les liens pour navigation locale&lt;br /&gt; # --adjust-extension : ajoute .html si n&#233;cessaire&lt;br /&gt; # --page-requisites : t&#233;l&#233;charge les ressources (CSS, JS, images)&lt;br /&gt; # --no-parent : n'explore pas les r&#233;pertoires parents&lt;br /&gt; # --level : limite la profondeur de r&#233;cursion&lt;br /&gt; echo &quot;[*] T&#233;l&#233;chargement du site en cours...&quot;&lt;br /&gt; wget --mirror \&lt;br /&gt; --convert-links \&lt;br /&gt; --adjust-extension \&lt;br /&gt; --page-requisites \&lt;br /&gt; --no-parent \&lt;br /&gt; --level=&quot;$DEPTH&quot; \&lt;br /&gt; &quot;$SITE_URL&quot; \&lt;br /&gt; -P &quot;$OUTPUT_DIR&quot; \&lt;br /&gt; --quiet&lt;br /&gt; &lt;br /&gt; # Rechercher les pages contenant la balise noindex&lt;br /&gt; echo &quot;[*] Analyse des pages pour d&#233;tecter noindex...&quot;&lt;br /&gt; find &quot;$OUTPUT_DIR&quot; -type f -name &quot;*.html&quot; | while read -r file; do&lt;br /&gt; # Regex expliqu&#233;e :&lt;br /&gt; # &lt;meta[^&gt;]* : ouverture de la balise meta (accepte tous les attributs)&lt;br /&gt; # name=&quot;robots&quot; : recherche l'attribut name avec la valeur robots&lt;br /&gt; # [^&gt;]* : accepte d'autres attributs (ex: http-equiv)&lt;br /&gt; # content=&quot;[^&quot;]*noindex : v&#233;rifie que noindex est dans l'attribut content&lt;br /&gt; &lt;br /&gt; if grep -qi '&lt;meta[^&gt;]*name=&quot;robots&quot;[^&gt;]*content=&quot;[^&quot;]*noindex' &quot;$file&quot;; then&lt;br /&gt; echo &quot;Page avec noindex trouv&#233;e : $file&quot;&lt;br /&gt; echo &quot;$file&quot; &gt;&gt; &quot;$NOINDEX_FILE&quot;&lt;br /&gt; fi&lt;br /&gt; done&lt;br /&gt; &lt;br /&gt; # Afficher les r&#233;sultats&lt;br /&gt; echo &quot;&quot;&lt;br /&gt; echo &quot;[*] R&#233;sultats :&quot;&lt;br /&gt; if [ -f &quot;$NOINDEX_FILE&quot; ]; then&lt;br /&gt; count=$(wc -l &lt; &quot;$NOINDEX_FILE&quot;)&lt;br /&gt; echo &quot;&#9888;&#65039; $count page(s) contenant une balise noindex d&#233;tect&#233;e(s)&quot;&lt;br /&gt; echo &quot;&#128196; Fichier de r&#233;sultats : $NOINDEX_FILE&quot;&lt;br /&gt; echo &quot;&quot;&lt;br /&gt; echo &quot;=== PAGES AVEC NOINDEX ===&quot;&lt;br /&gt; cat &quot;$NOINDEX_FILE&quot;&lt;br /&gt; else&lt;br /&gt; echo &quot;&#10003; Aucune balise noindex n'a &#233;t&#233; trouv&#233;e.&quot;&lt;br /&gt; fi&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Utilisation du script&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. Rendre le script ex&#233;cutable&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;chmod +x script_noindex.sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Lancer l'audit&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Avec une profondeur par d&#233;faut (2 niveaux) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;./script_noindex.sh https://www.exemple.com&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Avec une profondeur personnalis&#233;e (ex : 4 niveaux pour un gros site) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;./script_noindex.sh https://www.exemple.com 4&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. Consulter les r&#233;sultats&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Le script g&#233;n&#232;re un fichier &lt;strong&gt;noindex_pages_YYYYMMDD_HHMMSS.txt&lt;/strong&gt; contenant la liste des pages affect&#233;es. Ouvrez ce fichier pour identifier les probl&#232;mes.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Interpr&#233;tation des r&#233;sultats et diagnostic&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Cas 1 : Pages intentionnellement en noindex&lt;/strong&gt;
Si vous trouvez des pages avec noindex que vous aviez volontairement marqu&#233;es, c'est normal. V&#233;rifiez simplement que chacune de ces pages m&#233;rite r&#233;ellement cette balise.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Cas 2 : Pages strat&#233;giques affect&#233;es&lt;/strong&gt;
Si le script d&#233;tecte noindex sur des pages que vous souhaitez indexer :
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; V&#233;rifiez la source du probl&#232;me : CMS, th&#232;me, configuration serveur, ou erreur humaine
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Supprimez ou modifiez la balise en &lt;strong&gt;noindex, nofollow&lt;/strong&gt; vers &lt;strong&gt;index, follow&lt;/strong&gt; ou supprimez-la compl&#232;tement
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Forcez une exploration Google en soumettant l'URL via la Search Console&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Cas 3 : Aucune balise noindex d&#233;tect&#233;e&lt;/strong&gt;
Excellent ! Mais assurez-vous que le site &#233;tait complet. V&#233;rifiez la profondeur utilis&#233;e et augmentez-la si certaines sections ne sont pas explor&#233;es.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Limitations et consid&#233;rations importantes&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Respect de robots.txt&lt;/strong&gt; : Le script wget respecte le fichier &lt;strong&gt;robots.txt&lt;/strong&gt; de votre site. Si des pages sont bloqu&#233;es par robots.txt, elles ne seront pas t&#233;l&#233;charg&#233;es. Modifiez la commande wget avec &lt;strong&gt;&#8212;execute robots=off&lt;/strong&gt; si vous voulez ignorer robots.txt (&#224; utiliser avec prudence).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Sites tr&#232;s volumineux&lt;/strong&gt; : Pour les sites avec des milliers de pages, augmenter la profondeur peut &#234;tre tr&#232;s long. Envisagez de limiter le domaine ou d'utiliser des crawleurs SEO professionnels comme Screaming Frog pour les audits complets.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Pages dynamiques&lt;/strong&gt; : Ce script capture le HTML statique. Les pages g&#233;n&#233;r&#233;es en JavaScript c&#244;t&#233; client ne seront pas correctement analys&#233;es. Pour les sites single-page application (SPA), utilisez des outils comme Puppeteer ou Playwright.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Authentification requise&lt;/strong&gt; : Si votre site demande une authentification, le script ne peut pas y acc&#233;der. Vous devrez ajuster wget pour fournir des identifiants ou tester manuellement.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Bonnes pratiques pour la gestion de noindex&lt;/h2&gt;
&lt;p&gt;1. &lt;strong&gt;Documentez vos d&#233;cisions&lt;/strong&gt; : Maintenez un registre des pages intentionnellement en noindex et des raisons sous-jacentes
2. &lt;strong&gt;Auditez r&#233;guli&#232;rement&lt;/strong&gt; : Relancez ce script trimestriellement pour d&#233;tecter toute d&#233;gradation
3. &lt;strong&gt;Validez en Search Console&lt;/strong&gt; : Utilisez l'onglet &#171; Couverture &#187; pour croiser les r&#233;sultats et identifier les pages non index&#233;es pour d'autres raisons
4. &lt;strong&gt;Privil&#233;giez disallow dans robots.txt&lt;/strong&gt; : Pour les pages vraiment priv&#233;es, &lt;strong&gt;robots.txt&lt;/strong&gt; est plus appropri&#233; que noindex
5. &lt;strong&gt;Testez avant d&#233;ploiement&lt;/strong&gt; : Utilisez une branche de staging pour valider vos changements avant production&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;La d&#233;tection automatis&#233;e des balises noindex est une &#233;tape critique d'un audit SEO complet. Ce script vous permet d'identifier rapidement les probl&#232;mes d'indexation et de prendre les mesures correctives n&#233;cessaires. En combinant cet outil avec la Search Console et une bonne compr&#233;hension des impacts, vous pouvez optimiser consid&#233;rablement votre couverture index&#233;e et votre visibilit&#233; organique.&lt;/p&gt; &lt;p&gt;L'important est de maintenir un &#233;quilibre : bloquer intentionnellement ce qui doit l'&#234;tre, tout en assurant que vos pages strat&#233;giques restent pleinement accessibles aux moteurs de recherche.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Automatisation de la reconnexion du clavier apr&#232;s la veille sous Linux</title>
		<link>https://www.orsal.fr/Automatisation-de-la-reconnexion</link>
		<guid isPermaLink="true">https://www.orsal.fr/Automatisation-de-la-reconnexion</guid>
		<dc:date>2024-06-23T13:27:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Sur mon laptop, sous Ubuntu, parfois apr&#232;s la sortie de veille je rencontre des probl&#232;mes avec mon clavier qui ne r&#233;pond plus. Impossible de le d&#233;brancher / rebrancher &#233;videmment et je suis oblig&#233; de passer par un clavier externe pour le relancer. Voici la solution d'automatisation mise en place pour la reconnexion. Une analyse longue et minutieuse des logs syst&#232;me m'a permis d'identifier le message d'erreur suivant lorsque mon clavier cessait de fonctionner : Failed to enable keyboard on (...)&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Ubuntu-Debian-Linux" rel="directory"&gt;Ubuntu, Debian, Linux&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton68-a7855.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff68-83989.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton68-a7855.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Sur mon laptop, sous Ubuntu, parfois apr&#232;s la sortie de veille je rencontre des probl&#232;mes avec mon clavier qui ne r&#233;pond plus. Impossible de le d&#233;brancher / rebrancher &#233;videmment et je suis oblig&#233; de passer par un clavier externe pour le relancer. Voici la solution d'automatisation mise en place pour la reconnexion.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une analyse longue et minutieuse des logs syst&#232;me m'a permis d'identifier le message d'erreur suivant lorsque mon clavier cessait de fonctionner :
&lt;strong&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;Failed to enable keyboard on isa0060/serio0&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Si je ne veux plus me retrouver bloqu&#233; au r&#233;veil de l'appareil, il va falloir mettre en place un script qui va d&#233;tecter et corriger l'erreur automatiquement.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Cr&#233;er un script de surveillance et de reconnexion&lt;/h2&gt;
&lt;p&gt;La premi&#232;re &#233;tape consiste &#224; cr&#233;er un script qui v&#233;rifiera les erreurs de clavier dans les logs du noyau (dmesg) et reconnectera le clavier si n&#233;cessaire.&lt;/p&gt; &lt;p&gt;Pour &#233;viter de relancer le clavier ind&#233;finiment, il faut v&#233;rifier que la d&#233;connexion est intervenue apr&#232;s la derni&#232;re relance du clavier, d'o&#249; le stockage de la date de derni&#232;re relance dans &lt;code class='spip_code' dir='ltr'&gt;/var/log/last_keyboard_reconnect&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Cr&#233;er le script avec la commande :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo vi /usr/local/bin/check_keyboard.sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Puis y ins&#233;rer le code suivant :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt; &lt;br /&gt; # Chemin du fichier de log&lt;br /&gt; LOGFILE=&quot;/var/log/keyboard_monitor.log&quot;&lt;br /&gt; &lt;br /&gt; # Fichier pour stocker l'heure de la derni&#232;re reconnexion&lt;br /&gt; LAST_RECONNECT_FILE=&quot;/var/log/last_keyboard_reconnect&quot;&lt;br /&gt; &lt;br /&gt; # Initialisation de la date de derni&#232;re reconnexion&lt;br /&gt; last_reconnect=0&lt;br /&gt; &lt;br /&gt; # Test s'il y a d&#233;j&#224; eu des d&#233;connexions du clavier dans la session courante&lt;br /&gt; if sudo dmesg | grep -q &quot;atkbd serio0: Failed to enable keyboard on isa0060/serio0&quot;;&lt;br /&gt; then&lt;br /&gt; # Oui, alors on r&#233;cup&#232;re la date de derni&#232;re connexion depuis le fichier&lt;br /&gt; if [ -f $LAST_RECONNECT_FILE ]; then&lt;br /&gt; last_reconnect=$(cat $LAST_RECONNECT_FILE)&lt;br /&gt; fi&lt;br /&gt; else&lt;br /&gt; # Non, alors on initialise le fichier contenant la date de derni&#232;re reconnexion&lt;br /&gt; echo 0 &gt; $LAST_RECONNECT_FILE&lt;br /&gt; fi&lt;br /&gt; &lt;br /&gt; # V&#233;rifier les erreurs de clavier dans dmesg depuis la derni&#232;re reconnexion&lt;br /&gt; if sudo dmesg | awk -v ref=&quot;$last_reconnect&quot; '{&lt;br /&gt; # Extraire le timestamp en enlevant les crochets&lt;br /&gt; match($0, /^\[([0-9]+\.[0-9]+)\]/, arr)&lt;br /&gt; timestamp = arr[1]&lt;br /&gt; &lt;br /&gt; # Comparer le timestamp avec la r&#233;f&#233;rence&lt;br /&gt; if (timestamp &gt; ref) {&lt;br /&gt; print $0&lt;br /&gt; }&lt;br /&gt; }' | grep -q &quot;atkbd serio0: Failed to enable keyboard on isa0060/serio0&quot; ; then&lt;br /&gt; &lt;br /&gt; # Reconnexion du clavier&lt;br /&gt; sudo sh -c 'echo -n &quot;reconnect&quot; &gt; /sys/bus/serio/devices/serio0/drvctl'&lt;br /&gt; &lt;br /&gt; # Mise &#224; jour de la date de derni&#232;re reconnexion&lt;br /&gt; last_error_time=$(sudo dmesg | grep &quot;atkbd serio0: Failed to enable keyboard on isa0060/serio0&quot; | tail -1 | awk '{print substr($1, 2, length($1) - 2)}')&lt;br /&gt; echo $last_error_time &gt; $LAST_RECONNECT_FILE&lt;br /&gt; &lt;br /&gt; # Log&lt;br /&gt; echo &quot;$(date +%Y%m%d-%T);$last_error_time;Clavier reconnect&#233;&quot; &gt;&gt; $LOGFILE&lt;br /&gt; else&lt;br /&gt; echo &quot;$(date +%Y%m%d-%T);$last_reconnect;Pas de probl&#232;me d&#233;tect&#233;&quot; &gt;&gt; $LOGFILE&lt;br /&gt; fi&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;La reconnexion logiciel du clavier s'effectue dans le script par la commande :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo sh -c 'echo -n &quot;reconnect&quot; &gt; /sys/bus/serio/devices/serio0/drvctl'&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;N'oubliez pas de rendre le script ex&#233;cutable :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/check_keyboard.sh&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Cr&#233;er un hook systemd-sleep pour la sortie de veille&lt;/h2&gt;
&lt;p&gt;Pour moi le probl&#232;me se pr&#233;sente en sortie de veille de l'ordinateur. Je vais donc utiliser le hook de systemd adapt&#233; : systemd-sleep&lt;/p&gt; &lt;p&gt;Pour cela, je vais placer un script dans le r&#233;pertoire &lt;code class='spip_code' dir='ltr'&gt;/lib/systemd/system-sleep/&lt;/code&gt;. Assurez-vous qu'il existe et sinon vous pouvez le cr&#233;er par la commande :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo mkdir -p /lib/systemd/system-sleep/&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;L'ensemble des scripts dans ce r&#233;pertoire sont ex&#233;cut&#233;s &#224; chaque mise en veille et sorte de veille. Je vais donc y cr&#233;er un script :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo vi /lib/systemd/system-sleep/keyboard_resume.sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Lors de l'appel de ce script, il re&#231;oit plusieurs param&#232;tre. Le premier param&#232;tre &lt;code class='spip_code' dir='ltr'&gt;$1&lt;/code&gt; contient soit la valeur &lt;code class='spip_code' dir='ltr'&gt;pre&lt;/code&gt; indiquant la mise en veille, soit la valeur &lt;code class='spip_code' dir='ltr'&gt;post&lt;/code&gt; indiquant la sortie de la veille. Voici donc le script pour jouer le script de relancer du clavier au r&#233;veil de l'ordinateur :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt; &lt;br /&gt; case $1 in&lt;br /&gt; post)&lt;br /&gt; /usr/local/bin/check_keyboard.sh&lt;br /&gt; ;;&lt;br /&gt; esac&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ne pas oublier de rendre le script ex&#233;cutable.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo chmod +x /lib/systemd/system-sleep/keyboard_resume.sh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;L'analyse du fichier de log &lt;code class='spip_code' dir='ltr'&gt;/var/log/keyboard_monitor.log&lt;/code&gt; apr&#232;s un r&#233;veil de l'ordinateur permettra de v&#233;rifier que le script s'est bien ex&#233;cut&#233;, et au besoin a reconnect&#233; le clavier.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Gestion des disques sous Linux &#8211; m&#233;mo de commandes shell (Ubuntu &amp; Debian)</title>
		<link>https://www.orsal.fr/Gestion-des-disques-sous-Linux</link>
		<guid isPermaLink="true">https://www.orsal.fr/Gestion-des-disques-sous-Linux</guid>
		<dc:date>2022-12-27T20:32:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Une compilation de commandes shell Linux que j'utilise r&#233;guli&#232;rement pour la gestion de disques et partitions (Ubuntu/Debian).&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Ubuntu-Debian-Linux" rel="directory"&gt;Ubuntu, Debian, Linux&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton67-6785f.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff67-a1011.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton67-6785f.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Une compilation de commandes shell Linux que j'utilise r&#233;guli&#232;rement pour la gestion de disques et partitions (Ubuntu/Debian).&lt;/p&gt; &lt;p&gt;Elle ne se veut ni exhaustive, ni p&#233;dagogique, mais sert de m&#233;mo technique bas&#233; sur mon exp&#233;rience de terrain en d&#233;veloppement et administration de syst&#232;mes Linux.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Cette pratique s'inscrit dans un usage quotidien de Linux depuis Debian Slink, pour le d&#233;veloppement et la mise en production de projets web Laravel et de travaux en intelligence artificielle.&lt;/p&gt; &lt;p&gt;Elles sont regroup&#233;es par th&#233;matique :&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#find-disk-part&quot; class='spip_ancre'&gt;Identifier disques et partitions disponibles sur l'ordinateur&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#diskRepair&quot; class='spip_ancre'&gt;R&#233;parer un disque d&#233;fectueux&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#diskCheck&quot; class='spip_ancre'&gt;Automatiser les contr&#244;les&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#gptDisk&quot; class='spip_ancre'&gt;Fdisk pour disques GPT&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#diskFormat&quot; class='spip_ancre'&gt;Formatage d'un disque vierge&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#luksPartition&quot; class='spip_ancre'&gt;Partitions chiffr&#233;es avec LUKS&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#fat32repair&quot; class='spip_ancre'&gt;R&#233;parer une cl&#233; usb FAT32 en lecture seule sous Linux&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#diskspace&quot; class='spip_ancre'&gt;Voir l'espace disque utilis&#233;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#smart&quot; class='spip_ancre'&gt;V&#233;rifier l'&#233;tat SMART d'un disque&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#mount&quot; class='spip_ancre'&gt;Monter / d&#233;monter une partition&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#diag&quot; class='spip_ancre'&gt;Diagnostics bas niveau&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#inspect&quot; class='spip_ancre'&gt;Inspection ext* sans montage&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#dos&quot; class='spip_ancre'&gt;FAT32 r&#233;calcitrant&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#part&quot; class='spip_ancre'&gt;Quand la table de partitions ne veut rien savoir&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#dd&quot; class='spip_ancre'&gt;R&#233;cup&#233;ration de donn&#233;es&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#forensic&quot; class='spip_ancre'&gt;Forensic&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#header&quot; class='spip_ancre'&gt;Analyse du header GPT&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#carving&quot; class='spip_ancre'&gt;Carving manuel&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#debugfs&quot; class='spip_ancre'&gt;Analyse du journal ext4 avec debugfs&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#inode&quot; class='spip_ancre'&gt;R&#233;cup&#233;ration d'inodes supprim&#233;s&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#perf&quot; class='spip_ancre'&gt;Analyse des performances disque&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#malware&quot; class='spip_ancre'&gt;Recherche de malware au niveau boot (MBR / GPT)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#mbr&quot; class='spip_ancre'&gt;R&#233;initialisation du code d'amor&#231;age (MBR)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#sshfs&quot; class='spip_ancre'&gt;Monter un syst&#232;me de fichiers distant via SSH&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;#dvd&quot; class='spip_ancre'&gt;G&#233;rer le chariot du lecteur DVD&lt;/a&gt;&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;find-disk-part&quot;&gt;&lt;/a&gt;Identifier disques et partitions disponibles sur l'ordinateur&lt;/h2&gt;
&lt;p&gt;Avant toute op&#233;ration sur un disque ou une partition, il est utile de conna&#238;tre leur disposition exacte et leurs caract&#233;ristiques.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Liste des disque physiques :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo lshw -class disk&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Informations d&#233;taill&#233;es sur les partitions :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo fdisk -l&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Liste des partitions, types et points de montage :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo blkid -o list -c /dev/null&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;ou, plus lisible dans la plupart des cas :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;lsblk -o NAME,SIZE,FSTYPE,TYPE,PTTYPE,LABEL,PARTLABEL,MOUNTPOINT,UUID&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ces commandes permettent d'identifier pr&#233;cis&#233;ment :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; les disques physiques&lt;/li&gt;&lt;li&gt; les partitions&lt;/li&gt;&lt;li&gt; leur type de syst&#232;me de fichiers&lt;/li&gt;&lt;li&gt; leur point de montage&lt;/li&gt;&lt;li&gt; leur UUID&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Ces informations sont n&#233;cessaires pour cibler correctement un disque ou une partition dans les op&#233;rations suivantes.&lt;/p&gt; &lt;p&gt;Dans la suite, j'utiliserai les notations suivantes :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; /dev/sd&lt;strong&gt;X&lt;/strong&gt; pour un disque&lt;/li&gt;&lt;li&gt; /dev/sd&lt;strong&gt;XN&lt;/strong&gt; pour une partition&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;o&#249; &lt;strong&gt;X&lt;/strong&gt; est la lettre du disque et &lt;strong&gt;N&lt;/strong&gt; le num&#233;ro de partition.&lt;/p&gt; &lt;p&gt;Exemple : /dev/sda1&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;diskRepair&quot;&gt;&lt;/a&gt;R&#233;parer un disque d&#233;fectueux&lt;/h2&gt;
&lt;p&gt;Il existe de nombreuses approches face &#224; un disque d&#233;fectueux. Voici celles que j'utilise ponctuellement.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Trouver des secteurs d&#233;fectueux sur un disque.&lt;/p&gt; &lt;p&gt;&#9888;&#65039; Cette op&#233;ration est tr&#232;s longue : la commande parcourt l'ensemble des secteurs du disque et &#233;crit la liste des secteurs d&#233;fectueux dans un fichier &lt;code class='spip_code' dir='ltr'&gt;badsectors.txt&lt;/code&gt;.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo badblocks -v /dev/sdXN &gt; badsectors.txt&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Marquer les secteurs erron&#233;s d'un disque afin qu'ils ne soient plus utilis&#233;s&lt;/p&gt; &lt;p&gt;Les secteurs d&#233;fectueux sont alors exclus, ce qui limite les risques de corruption ou de perte de donn&#233;es.&lt;/p&gt; &lt;p&gt;NB : la partition doit &#234;tre d&#233;mont&#233;e au pr&#233;alable via la commande :&lt;code class='spip_code' dir='ltr'&gt;sudo umount /dev/sdXN&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Le fichier &lt;code class='spip_code' dir='ltr'&gt;badsectors.txt&lt;/code&gt; est le fichier g&#233;n&#233;r&#233; par la commande &lt;strong&gt;badblocks&lt;/strong&gt;.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo e2fsck -l badsectors.txt /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;fsck&lt;/strong&gt; est l'utilitaire de v&#233;rification des syst&#232;mes de fichiers sous Linux.
&lt;strong&gt;e2fsck&lt;/strong&gt; en est la version d&#233;di&#233;e aux syst&#232;mes de fichiers de type &lt;i&gt;ext2/ext3/ext4&lt;/i&gt;.&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; R&#233;cup&#233;rer les informations du dernier contr&#244;le &lt;strong&gt;fsck&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo tune2fs -l /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Pour extraire uniquement les informations li&#233;es &#224; la fr&#233;quence d'analyse des disques et &#224; l'historique des contr&#244;les :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo tune2fs -l /dev/sdXN | grep -E &quot;Last\ c|Max|Mount&quot;&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;diskCheck&quot;&gt;&lt;/a&gt;Automatiser les contr&#244;les&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;fsck&lt;/strong&gt; peut &#234;tre lanc&#233; manuellement, mais il est &#233;galement possible de planifier des contr&#244;les automatiques apr&#232;s un certain nombre de red&#233;marrages.&lt;/p&gt; &lt;p&gt;La commande suivante force un contr&#244;le &lt;strong&gt;fsck&lt;/strong&gt; de la partition &lt;strong&gt;/dev/sdXN&lt;/strong&gt; tous les 10 red&#233;marrages :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo tune2fs -c 10 /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Une valeur de &lt;strong&gt;-1&lt;/strong&gt; d&#233;sactive fsck et ses contr&#244;les automatiques.
&lt;br /&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Une valeur de &lt;strong&gt;1&lt;/strong&gt; force un contr&#244;le &#224; chaque d&#233;marrage.&lt;/p&gt; &lt;p&gt;Si la partition est mont&#233;e via le fichier &lt;code class='spip_code' dir='ltr'&gt;/etc/fstab&lt;/code&gt;, il convient &#233;galement de v&#233;rifier la ligne correspondante &#224; la partition. Un dernier champ positionn&#233; &#224; &lt;strong&gt;0&lt;/strong&gt; d&#233;sactive le contr&#244;le au d&#233;marrage.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://linuxconfig.org/how-to-force-fsck-to-check-filesystem-after-system-reboot-on-linux&quot; class='spip_out' rel='external'&gt;En savoir plus...&lt;/a&gt;&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;gptDisk&quot;&gt;&lt;/a&gt;Fdisk pour disques GPT&lt;/h2&gt;
&lt;p&gt;Les disques modernes utilisent souvent une table de partitions &lt;strong&gt;GPT&lt;/strong&gt;, incompatible avec &lt;i&gt;fdisk&lt;/i&gt; : on utilise alors &lt;i&gt;gdisk&lt;/i&gt; pour manipuler correctement les partitions.&lt;/p&gt; &lt;p&gt;Installation de l'outil :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo apt-get update&lt;br /&gt; sudo apt-get install gdisk&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;diskFormat&quot;&gt;&lt;/a&gt;Formatage d'un disque vierge&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Cr&#233;ation de la partition :&lt;/p&gt; &lt;p&gt;&#8212; Lancer l'outil de gestion des partitions :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo parted /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Dans &lt;strong&gt;parted&lt;/strong&gt;, ex&#233;cuter les commandes suivantes.&lt;/p&gt; &lt;p&gt;&#8212; Cr&#233;ation de la table de partition &lt;strong&gt;GPT&lt;/strong&gt; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;mklabel gpt&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&#8212; Cr&#233;ation d'une partition primaire &lt;strong&gt;ext4&lt;/strong&gt; occupant l'ensemble du disque :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;mkpart primary ext4 2048s 100%&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&#8212; V&#233;rifier la table de partitions :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;print&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&#8212; Quitter &lt;strong&gt;parted&lt;/strong&gt; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;quit&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Cr&#233;ation du syst&#232;me de fichier &lt;strong&gt;ext4&lt;/strong&gt; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo mkfs.ext4 /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Attribution d'un label &#224; la partition :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo e2label /dev/sdXN &lt;nom&gt;&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;luksPartition&quot;&gt;&lt;/a&gt;Partitions chiffr&#233;es avec LUKS&lt;/h2&gt;
&lt;p&gt;Lorsqu'un disque ou une partition est chiffr&#233; (par exemple pour des donn&#233;es sensibles), il n'appara&#238;t pas comme un FS classique et n&#233;cessite une &#233;tape d'identification distincte.&lt;/p&gt; &lt;p&gt;Certaines partitions peuvent &#234;tre chiffr&#233;es avec &lt;strong&gt;LUKS&lt;/strong&gt; afin de prot&#233;ger les donn&#233;es.&lt;/p&gt; &lt;p&gt;Voici comment identifier les volumes chiffr&#233;s actuellement pr&#233;sents sur le syst&#232;me :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dmsetup ls --target crypt&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;fat32repair&quot;&gt;&lt;/a&gt;R&#233;parer une cl&#233; usb FAT32 en lecture seule sous linux&lt;/h2&gt;
&lt;p&gt;Une cl&#233; USB mont&#233;e en lecture seule emp&#234;che toute modification ou suppression de fichiers. Ce comportement est fr&#233;quent sur des supports &lt;strong&gt;FAT32&lt;/strong&gt; pr&#233;sentant des erreurs.&lt;/p&gt; &lt;p&gt;Ce cas se rencontre souvent lorsque le syst&#232;me de fichiers &lt;i&gt;FAT32&lt;/i&gt; devient incoh&#233;rent apr&#232;s une suppression ou un retrait non propre de la cl&#233; USB.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; V&#233;rifier le type de syst&#232;me de fichiers et identifier la partition&lt;/p&gt; &lt;p&gt;Lister les p&#233;riph&#233;riques &lt;strong&gt;FAT32&lt;/strong&gt; afin d'identifier la partition concern&#233;e :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;lsblk -f |grep FAT32&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ou, si l'identifiant est d&#233;j&#224; connu :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;lsblk -f /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; D&#233;monter la cl&#233; USB&lt;/p&gt; &lt;p&gt;La partition doit &#234;tre d&#233;mont&#233;e avant toute tentative de r&#233;paration :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo umount /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lancer la r&#233;paration du syst&#232;me de fichiers &lt;strong&gt;FAT32&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dosfsck -w -r -l -a -v -t /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;avec les param&#232;tres suivants :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;strong&gt;-w&lt;/strong&gt; : &#233;crit les corrections sur le disque&lt;/li&gt;&lt;li&gt; &lt;strong&gt;-r&lt;/strong&gt; : interaction lors de la r&#233;paration&lt;/li&gt;&lt;li&gt; &lt;strong&gt;-l&lt;/strong&gt; : liste les fichiers pr&#233;sentant des erreurs&lt;/li&gt;&lt;li&gt; &lt;strong&gt;-a&lt;/strong&gt; : corrige automatiquement les erreurs&lt;/li&gt;&lt;li&gt; &lt;strong&gt;-v&lt;/strong&gt; : mode verbeux&lt;/li&gt;&lt;li&gt; &lt;strong&gt;-t&lt;/strong&gt; : marque les clusters d&#233;fectueux dans la FAT&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une fois la r&#233;paration termin&#233;e, d&#233;brancher puis rebrancher physiquement la cl&#233; USB.&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;diskspace&quot;&gt;&lt;/a&gt;Voir l'espace disque utilis&#233;&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Espace utilis&#233; / disponible par syst&#232;me de fichiers :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Espace occup&#233; par r&#233;pertoire (taille) :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;du -sh /chemin&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Afficher les points de montage :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;findmnt&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;p&gt;&lt;a id=&quot;smart&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2 class='h3 spip'&gt;V&#233;rifier l'&#233;tat SMART d'un disque&lt;/h2&gt;
&lt;p&gt;La plupart des disques supportent SMART : on peut obtenir les donn&#233;es d'&#233;tat :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo smartctl -a /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;(Il faut installer : smartmontools)&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;mount&quot;&gt;&lt;/a&gt;Monter / d&#233;monter une partition&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Monter une partition :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo mount /dev/sdXN /point/de/montage&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; D&#233;monter :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo umount /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;diag&quot;&gt;&lt;/a&gt;Diagnostics bas niveau (quand &#231;a commence &#224; sentir mauvais)&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire l'ensemble d'un disque sans le monter (d&#233;tection de lenteurs ou d'erreurs E/S) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX of=/dev/null bs=1M status=progress&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Rechercher les erreurs disque c&#244;t&#233; noyau :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;dmesg | grep -i -E &quot;error|fail|ata|i/o&quot;&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;inspect&quot;&gt;&lt;/a&gt;Inspection ext* sans montage&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Afficher les m&#233;tadonn&#233;es compl&#232;tes d'un syst&#232;me de fichiers ext* :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dumpe2fs /dev/sdXN | less&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lister les superblocks disponibles :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dumpe2fs /dev/sdXN | grep -i superblock&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; R&#233;parer un syst&#232;me de fichiers &#224; partir d'un superblock alternatif :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo e2fsck -b 32768 /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Les syst&#232;mes de fichiers &lt;i&gt;ext*&lt;/i&gt; disposent de superblocks alternatifs utilisables en cas de corruption.&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;p&gt;&lt;a id=&quot;dos&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2 class='h3 spip'&gt;FAT32 r&#233;calcitrant (cas d&#233;sesp&#233;r&#233;s)&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; R&#233;paration automatique non interactive :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dosfsck -a -w -v /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; R&#233;&#233;criture du boot sector FAT :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dosfsck -b /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;part&quot;&gt;&lt;/a&gt;Quand la table de partitions ne veut rien savoir&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Forcer la relecture de la table de partitions :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo partprobe /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo blockdev --rereadpt /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;dd&quot;&gt;&lt;/a&gt;R&#233;cup&#233;ration de donn&#233;es (old school)&lt;/h2&gt;
&lt;p&gt;Attention la commande &lt;strong&gt;dd&lt;/strong&gt; ne v&#233;rifie rien et n'avertit pas. Une erreur de p&#233;riph&#233;rique (&lt;i&gt;if=&lt;/i&gt; / &lt;i&gt;of=&lt;/i&gt;) entra&#238;ne une perte de donn&#233;es imm&#233;diate et irr&#233;versible.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Copier un disque en ignorant les erreurs :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX of=/dev/sdY conv=noerror,sync status=progress&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Variante plus robuste avec journal de r&#233;cup&#233;ration :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo ddrescue /dev/sdX /dev/sdY rescue.log&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;p&gt;&lt;a id=&quot;forensic&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Forensic&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Cloner un disque vers une image brute :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX of=image.raw bs=4M status=progress&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Examiner une image disque sans la monter :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo file image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Associer une image disque &#224; un p&#233;riph&#233;rique loop :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo losetup -fP image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Note :&lt;/i&gt; un &lt;strong&gt;p&#233;riph&#233;rique loop&lt;/strong&gt; permet de traiter un fichier image comme un p&#233;riph&#233;rique bloc.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lister les p&#233;riph&#233;riques loop actifs :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;losetup -a&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Examiner les partitions d&#233;tect&#233;es dans l'image :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;lsblk /dev/loopX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire un secteur pr&#233;cis (ex. MBR / GPT header) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire un secteur &#224; un offset donn&#233; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 skip=2048 count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Monter une partition d'image disque via offset :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo mount -o loop,ro,offset=1048576 image.raw /mnt/forensic&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;(offset = d&#233;but de partition en octets)&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Monter en lecture seule (forensic safe) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo mount -o ro,noload /dev/loopXpY /mnt/forensic&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Identifier le type de donn&#233;es pr&#233;sentes :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;file image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Extraire les cha&#238;nes lisibles (recherche d'artefacts) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;strings image.raw | less&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Recherche cibl&#233;e (ex. mots-cl&#233;s) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;strings image.raw | grep -i &quot;password&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Analyse et r&#233;cup&#233;ration de tables de partitions :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo testdisk image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Extraction de fichiers sans table de partitions :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo photorec image.raw&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;header&quot;&gt;&lt;/a&gt;Analyse du header GPT (primaire / secondaire)&lt;/h2&gt;
&lt;p&gt;Cette analyse est utile lorsque la table de partitions GPT est corrompue ou incoh&#233;rente, mais que le disque contient encore des donn&#233;es exploitables. L'objectif est de v&#233;rifier l'&#233;tat du header GPT principal et de son backup, et de d&#233;terminer lequel peut servir de r&#233;f&#233;rence pour une restauration.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire le header GPT primaire (LBA 1) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 skip=1 count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire le header GPT secondaire (dernier secteur du disque) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 skip=$(($(blockdev --getsz /dev/sdX)-1)) count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Sauvegarder et comparer les deux headers :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 skip=1 count=1 of=gpt_primary.bin&lt;br /&gt; sudo dd if=/dev/sdX bs=512 skip=$(($(blockdev --getsz /dev/sdX)-1)) count=1 of=gpt_backup.bin&lt;br /&gt; cmp gpt_primary.bin gpt_backup.bin&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Inspecter les informations GPT lisibles :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo sgdisk -i 1 /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; V&#233;rifier la coh&#233;rence globale de la table GPT :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo sgdisk -v /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;carving&quot;&gt;&lt;/a&gt;Carving manuel (extraction sans table de partitions ni syst&#232;me de fichiers)&lt;/h2&gt;
&lt;p&gt;Le carving manuel intervient lorsque la table de partitions et le syst&#232;me de fichiers sont irr&#233;cup&#233;rables. L'objectif est d'extraire directement des fichiers ou des donn&#233;es brutes &#224; partir de signatures connues, sans s'appuyer sur aucune m&#233;tadonn&#233;e.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Identifier le type g&#233;n&#233;ral de donn&#233;es pr&#233;sentes dans une image disque :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;file image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Rechercher des signatures de fichiers connues :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;grep -a -b &quot;JFIF&quot; image.raw&lt;br /&gt; grep -a -b &quot;%PDF&quot; image.raw&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Extraire un fichier &#224; partir d'un offset connu :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;dd if=image.raw of=fichier.bin bs=1 skip=OFFSET count=TAILLE&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Examiner le contenu extrait :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;file fichier.bin&lt;br /&gt; hexdump -C fichier.bin | less&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;debugfs&quot;&gt;&lt;/a&gt;Analyse du journal ext4 avec debugfs&lt;/h2&gt;
&lt;p&gt;Cette analyse est utile lorsque des fichiers ont disparu r&#233;cemment ou apr&#232;s un crash, mais que le syst&#232;me de fichiers &lt;strong&gt;ext4&lt;/strong&gt; est encore montable ou partiellement coh&#233;rent. L'objectif est d'examiner les structures internes (journal, inodes, blocs) afin d'identifier des donn&#233;es encore r&#233;cup&#233;rables.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Ouvrir une partition ext4 avec &lt;strong&gt;debugfs&lt;/strong&gt; (sans montage) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo debugfs /dev/sdXN&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;puis dans debugfs les commandes d'analyse ci-dessous.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Afficher les informations g&#233;n&#233;rales du syst&#232;me de fichiers :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;stats&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Examiner l'&#233;tat du journal :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;logdump&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lister les inodes r&#233;cemment modifi&#233;s (selon le journal) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;lsdel&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;(Quitter &lt;i&gt;debugfs&lt;/i&gt; avec &lt;i&gt;quit&lt;/i&gt;)&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;inode&quot;&gt;&lt;/a&gt;R&#233;cup&#233;ration d'inodes supprim&#233;s (ext4)&lt;/h2&gt;
&lt;p&gt;Cette m&#233;thode s'applique lorsque des fichiers ont &#233;t&#233; supprim&#233;s mais que leurs blocs n'ont pas encore &#233;t&#233; r&#233;utilis&#233;s. L'objectif est de restaurer directement les donn&#233;es &#224; partir des inodes supprim&#233;s, sans passer par le nom de fichier original.&lt;/p&gt; &lt;p&gt;Un &lt;strong&gt;inode&lt;/strong&gt; est la structure centrale d'un syst&#232;me de fichiers Linux (&lt;i&gt;ext2/ext3/ext4&lt;/i&gt;). Il ne contient pas le nom du fichier, mais l'ensemble de ses m&#233;tadonn&#233;es et les pointeurs vers les donn&#233;es.&lt;/p&gt; &lt;p&gt;Un inode contient notamment :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; le type (fichier, r&#233;pertoire, lien, etc.)&lt;/li&gt;&lt;li&gt; les permissions&lt;/li&gt;&lt;li&gt; l'UID et le GID&lt;/li&gt;&lt;li&gt; la taille&lt;/li&gt;&lt;li&gt; les horodatages (&lt;i&gt;atime&lt;/i&gt;, &lt;i&gt;mtime&lt;/i&gt;, &lt;i&gt;ctime&lt;/i&gt;, &lt;i&gt;crtime&lt;/i&gt; selon le syst&#232;me de fichiers)&lt;/li&gt;&lt;li&gt; les pointeurs vers les blocs de donn&#233;es :
&lt;br /&gt;&#8212; directs
&lt;br /&gt;&#8212; indirects
&lt;br /&gt;&#8212; double et triple indirects&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le nom du fichier n'est pas stock&#233; dans l'inode, mais dans le r&#233;pertoire. Un r&#233;pertoire est une simple table associant un nom &#224; un num&#233;ro d'inode :
&lt;strong&gt;nom &#8594; inode&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Cons&#233;quence :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; supprimer un fichier supprime le lien &lt;i&gt;nom &#8594; inode&lt;/i&gt;&lt;/li&gt;&lt;li&gt; l'inode peut encore exister&lt;/li&gt;&lt;li&gt; les blocs de donn&#233;es peuvent rester intacts&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lister les inodes supprim&#233;s :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo debugfs /dev/sdXN&lt;br /&gt; lsdel&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Examiner un inode supprim&#233; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;stat &lt;inode&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Extraire le contenu d'un inode vers un fichier :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;dump &lt;inode&gt; fichier_recupere.bin&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Analyser le fichier extrait :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;file fichier_recupere.bin&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;perf&quot;&gt;&lt;/a&gt;Analyse des performances disque (diagnostic bas niveau)&lt;/h2&gt;
&lt;p&gt;Cette analyse est utile pour identifier des lenteurs anormales, des timeouts E/S ou des comportements d&#233;grad&#233;s li&#233;s au mat&#233;riel. L'objectif est de distinguer un probl&#232;me logiciel d'un probl&#232;me physique ou firmware.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Mesurer les performances brutes en lecture s&#233;quentielle :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo hdparm -tT /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Tester la latence de lecture sans cache :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX of=/dev/null bs=4K count=100000 iflag=direct status=progress&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Surveiller les erreurs E/S et timeouts :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;dmesg | grep -i -E &quot;i/o error|timeout|ata&quot;&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;malware&quot;&gt;&lt;/a&gt;Recherche de malware au niveau boot (MBR / GPT)&lt;/h2&gt;
&lt;p&gt;Cette v&#233;rification est pertinente en cas de comportement anormal persistant, y compris apr&#232;s r&#233;installation du syst&#232;me. L'objectif est d'identifier une modification du code d'amor&#231;age (bootsector, MBR ou GPT).&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire le secteur d'amor&#231;age MBR (512 octets) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Lire le header GPT primaire :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/sdX bs=512 skip=1 count=1 | hexdump -C&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Comparer avec un disque sain ou une sauvegarde :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;cmp mbr_suspect.bin mbr_sain.bin&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Rechercher des cha&#238;nes suspectes :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;strings mbr_suspect.bin&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;mbr&quot;&gt;&lt;/a&gt;R&#233;initialisation du code d'amor&#231;age (MBR)&lt;/h2&gt;
&lt;p&gt;Le &lt;strong&gt;MBR&lt;/strong&gt; (Master Boot Record) correspond aux 512 premiers octets d'un disque en sch&#233;ma de partition de type &lt;strong&gt;MBR&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Il contient le code d'amor&#231;age primaire ainsi que la table de partitions. Une corruption ou une modification malveillante de ce code peut emp&#234;cher le d&#233;marrage du syst&#232;me ou persister malgr&#233; une r&#233;installation.&lt;/p&gt; &lt;p&gt;Cette op&#233;ration consiste &#224; neutraliser le code d'amor&#231;age existant afin de repartir sur une base saine.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &#201;craser le code MBR (sans toucher aux partitions) :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo dd if=/dev/zero of=/dev/sdX bs=440 count=1&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Supprimer compl&#232;tement la table GPT et les m&#233;tadonn&#233;es associ&#233;es :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo sgdisk --zap-all /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; R&#233;installer un chargeur d'amor&#231;age l&#233;gitime :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;grub-install /dev/sdX&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;En cas de doute de compromission du boot secteur, l'id&#233;e est de supprimer le secteur d'amor&#231;age douteux (MBR ou GPT selon le type), puis d'en r&#233;installer un propre avec grub.&lt;/p&gt; &lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;sshfs&quot;&gt;&lt;/a&gt;Monter un syst&#232;me de fichiers distant via SSH (SSHFS)&lt;/h2&gt;
&lt;p&gt;Le montage via &lt;strong&gt;SSHFS&lt;/strong&gt; permet d'acc&#233;der &#224; un syst&#232;me de fichiers distant comme s'il &#233;tait local, en s'appuyant uniquement sur une connexion &lt;i&gt;SSH&lt;/i&gt;. C'est particuli&#232;rement utile pour l'analyse, la r&#233;cup&#233;ration de donn&#233;es ou l'acc&#232;s ponctuel &#224; des fichiers distants sans exposer de services suppl&#233;mentaires.&lt;/p&gt; &lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Installer &lt;i&gt;sshfs&lt;/i&gt; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo apt-get install sshfs&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Monter un r&#233;pertoire distant :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sshfs user@serveur:/chemin/distant /mnt/ssh&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; D&#233;monter proprement :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;fusermount -u /mnt/ssh&lt;/code&gt;&lt;/div&gt;
&lt;hr class=&quot;spip&quot; /&gt;
&lt;h2 class='h3 spip'&gt;&lt;a id=&quot;dvd&quot;&gt;&lt;/a&gt;G&#233;rer le chariot du lecteur DVD&lt;/h2&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Ejecter le disque :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;eject&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L8xH11/puce-32883.gif' width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; Rentrer le chariot du disque, si le lecteur le permet :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;eject -t&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>SERP, SPIP, breadcrumb et SEO</title>
		<link>https://www.orsal.fr/SERP-SPIP-breadcrumb-et-SEO</link>
		<guid isPermaLink="true">https://www.orsal.fr/SERP-SPIP-breadcrumb-et-SEO</guid>
		<dc:date>2018-04-24T12:48:43Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Vous avez peut-&#234;tre d&#233;j&#224; remarqu&#233; que les SERP de Google ont souvent un affichage diff&#233;rent. Les SERP, pour Search Engine Result Page, ce sont les pages r&#233;sultats d'un moteur de recherche. La variation qui m'int&#233;resse ici est la ligne qui contient traditionnellement l'url de la page, la petite ligne verte. Parfois, elle se pr&#233;sente sous la forme d'un fil d'ariane, qui reprend le fil d'ariane pr&#233;sent sur la page. Je trouve cela plus parlant pour la personne qui fait une recherche, alors voyons comment (...)&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Referencement-SEO-GEO" rel="directory"&gt;R&#233;f&#233;rencement SEO/GEO&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH150/arton65-eac66.jpg' width='150' height='150' onmouseover=&quot;this.src='local/cache-vignettes/L150xH150/artoff65-8ed12.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH150/arton65-eac66.jpg'&quot; style='height:150px;width:150px;' /&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Vous avez peut-&#234;tre d&#233;j&#224; remarqu&#233; que les &lt;strong&gt;SERP de Google&lt;/strong&gt; ont souvent un affichage diff&#233;rent. Les SERP, pour Search Engine Result Page, ce sont les pages r&#233;sultats d'un moteur de recherche.&lt;/p&gt; &lt;p&gt;La variation qui m'int&#233;resse ici est la ligne qui contient traditionnellement l'url de la page, la petite ligne verte. Parfois, elle se pr&#233;sente &lt;strong&gt;sous la forme d'un fil d'ariane&lt;/strong&gt;, qui reprend le fil d'ariane pr&#233;sent sur la page. Je trouve cela plus parlant pour la personne qui fait une recherche, alors voyons comment mettre &#231;a en place.
[sommaire]&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Web s&#233;mantique &amp; schema.org&lt;/h2&gt;
&lt;p&gt;Bon, aujourd'hui il y a des &lt;a href=&quot;https://www.youtube.com/watch?time_continue=1&amp;v=aaOB-ErYq6Y&quot; class='spip_out' rel='external'&gt;projets de voiture autonome&lt;/a&gt; sans pilote plut&#244;t bien avanc&#233;s. Mais voil&#224;, &lt;strong&gt;un moteur de recherche n'arrive pas encore &#224; d&#233;tecter et lire tout seul le fil d'ariane&lt;/strong&gt; et il va falloir l'aider. Pour cela on va utiliser le &lt;strong&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique&quot; class='spip_glossaire' rel='external'&gt;Web s&#233;mantique&lt;/a&gt;&lt;/strong&gt;. Nous allons ajouter des balises dans les pages Web qui vont &lt;strong&gt;donner du sens au contenu&lt;/strong&gt; en ajoutant des meta informations qui permettent aux moteurs de recherche de mieux comprendre le contenu des pages Web.&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_40 spip_documents spip_documents_center'&gt;
&lt;img src='https://www.orsal.fr/local/cache-vignettes/L500xH191/serp-google-breadcrumb-seo-64888.jpg' width='500' height='191' alt=&quot;&quot; style='height:191px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Il existe plusieurs syst&#232;mes de balises comme &lt;a href=&quot;http://microformats.org/wiki/Main_Page&quot; class='spip_out' rel='external'&gt;microformats&lt;/a&gt; ou &lt;a href=&quot;http://dublincore.org/&quot; class='spip_out' rel='external'&gt;Dublin core&lt;/a&gt;, mais je vais utiliser &lt;strong&gt;&lt;a href=&quot;http://schema.org/&quot; class='spip_out' rel='external'&gt;schema.org&lt;/a&gt;&lt;/strong&gt; car il me semble &#234;tre mieux reconnu par Google. D'ailleurs c'est celui qu'ils utilisent dans &lt;a href=&quot;https://developers.google.com/search/docs/data-types/breadcrumb&quot; class='spip_out' rel='external'&gt;leurs exemples&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ces diff&#233;rents syst&#232;mes ne sont pas incompatibles entre eux, bien au contraire, je vous invite &#224; tous &lt;strong&gt;les utiliser sur vos pages Web pour am&#233;liorer votre r&#233;f&#233;rencement&lt;/strong&gt;. Ils permettent de repr&#233;senter de mani&#232;re structur&#233;e plein de types d'information. Cela d&#233;passe le cadre de cet article, et nous allons nous focaliser sur les &lt;a href=&quot;http://schema.org/BreadcrumbList&quot; class='spip_out' rel='external'&gt;BreadcrumbList&lt;/a&gt;. &#171; Breadcrumb trail &#187; c'est le terme anglais pour d&#233;signer le fil d'Ariane sur les pages Web.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Prenons un exemple&lt;/h2&gt;
&lt;p&gt;Voici un exemple de fil d'ariane :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;Accueil &gt; SEO &gt; Web s&#233;mantique &gt; SERP, SPIP et breadcrumb&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Schema.org d&#233;finit donc une &lt;strong&gt;&lt;a href=&quot;http://schema.org/BreadcrumbList&quot; class='spip_out' rel='external'&gt;structure pour les breadcrumb&lt;/a&gt;&lt;/strong&gt;, c'est &#224; dire une liste et une hi&#233;rarchie d'information qui permet de d&#233;finir un fil d'Ariane et ses &#233;l&#233;ments. Pour faire simple, je vais me limiter ici aux champs obligatoires ou les plus pertinents : &lt;strong&gt;le nom, l'url et la position&lt;/strong&gt;. En explorant le site de &lt;a href=&quot;http://schema.org/BreadcrumbList&quot; class='spip_out' rel='external'&gt;schema.org&lt;/a&gt;, vous pourrez d&#233;couvrir tout ce qu'il est possible de param&#233;trer.&lt;/p&gt; &lt;p&gt;Les &#233;l&#233;ments de mon exemple se d&#233;finissent alors ainsi :&lt;/p&gt; &lt;table class=&quot;spip&quot;&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; nom &lt;/td&gt;
&lt;td&gt; url &lt;/td&gt;
&lt;td&gt; position &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd'&gt;
&lt;td&gt; Accueil &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;https://www.orsal.fr/&quot; class='spip_url spip_out' rel='nofollow'&gt;https://www.orsal.fr/&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; 1 &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; SEO &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;https://www.orsal.fr/seo/&quot; class='spip_url spip_out' rel='nofollow'&gt;https://www.orsal.fr/seo/&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; 2 &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd'&gt;
&lt;td&gt; Web s&#233;mantique &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;https://www.orsal.fr/seo/web-semantique/&quot; class='spip_url spip_out' rel='nofollow'&gt;https://www.orsal.fr/seo/web-semantique/&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; 3 &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; SERP, SPIP et breadcrumb &lt;/td&gt;
&lt;td&gt; &lt;a href=&quot;https://www.orsal.fr/seo/web-semantique/serp-spip-breadcrumb&quot; class='spip_url spip_out' rel='nofollow'&gt;https://www.orsal.fr/seo/web-semant...&lt;/a&gt; &lt;/td&gt;
&lt;td&gt; 4 &lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Il va falloir transformer la gestion du fil d'Ariane en place sur un site SPIP pour obtenir une liste avec les informations ajout&#233;es. Initialement le code HTML pour mon fil d'Ariane ressemble &#224; cela :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;p id=&quot;hierarchie&quot;&gt;&lt;br /&gt; &lt;a href=&quot;https://www.orsal.fr/&quot;&gt;Accueil&lt;/a&gt; &gt;&lt;br /&gt; &lt;a href=&quot;/seo/&quot;&gt;SEO&lt;/a&gt; &gt;&lt;br /&gt; &lt;a href=&quot;/seo/web-semantique/&quot;&gt;Web s&#233;mantique&lt;/a&gt; &gt;&lt;br /&gt; &lt;strong class=&quot;on&quot;&gt;SERP, SPIP et breadcrumb&lt;/strong&gt;&lt;br /&gt; &lt;/p&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;L'objectif est de transformer la g&#233;n&#233;ration du bloc dans le squelette SPIP pour obtenir ce type de bloc :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;ol itemscope itemtype=&quot;http://schema.org/BreadcrumbList&quot; id=&quot;hierarchie&quot;&gt;&lt;br /&gt; &lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt;&lt;br /&gt; &lt;a href=&quot;https://www.orsal.fr/&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;Accueil&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;1&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt; &gt; &lt;br /&gt; &lt;a href=&quot;/seo/&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;SEO&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;2&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt; &gt; &lt;br /&gt; &lt;a href=&quot;/seo/web-semantique&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;Web s&#233;mantique&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;3&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt; &gt; &lt;br /&gt; &lt;strong class=&quot;on&quot;&gt;&lt;br /&gt; &lt;a href=&quot;/seo/web-semantique/serp-spip-breadcrumb&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;SERP, SPIP et breadcrumb&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;/strong&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;4&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;br /&gt; &lt;/ol&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Il s'agit d'une liste de liens. Voici comment la lire.&lt;/p&gt; &lt;p&gt;Les &lt;strong&gt;donn&#233;es structur&#233;es&lt;/strong&gt; schema.org sont les propri&#233;t&#233;s &lt;i&gt;itemprop&lt;/i&gt;, &lt;i&gt;itemscope&lt;/i&gt; et &lt;i&gt;itemtype&lt;/i&gt; :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;strong&gt;itemscope&lt;/strong&gt; indique que le bloc html courant correspond &#224; un bloc schema.org&lt;/li&gt;&lt;li&gt; &lt;strong&gt;itemtype&lt;/strong&gt; permet de pr&#233;ciser le type du bloc schema.org courant&lt;/li&gt;&lt;li&gt; &lt;strong&gt;itemprop&lt;/strong&gt; d&#233;finit une propri&#233;t&#233; du bloc courant&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;C'est r&#233;cursif, un bloc peut se retrouver l'enfant d'un autre.&lt;/p&gt; &lt;p&gt;Ainsi le bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;ol/&gt;&lt;/code&gt; correspond &#224; une &lt;i&gt;BreadcrumbList&lt;/i&gt;, et chaque &lt;code class='spip_code' dir='ltr'&gt;&lt;li/&gt;&lt;/code&gt; &#224; un &lt;i&gt;itemListElement&lt;/i&gt; enfant de la &lt;i&gt;BreadcrumbList&lt;/i&gt;, de type &lt;i&gt;ListItem&lt;/i&gt;. C'est pas clair ? Relisez doucement le source HTML, &#231;a va venir.&lt;/p&gt; &lt;p&gt;En pla&#231;ant la propri&#233;t&#233; &lt;i&gt;item&lt;/i&gt; sur la balise &lt;code class='spip_code' dir='ltr'&gt;&lt;a/&gt;&lt;/code&gt;, cela permet de d&#233;finir une propri&#233;t&#233; de type &lt;i&gt;url&lt;/i&gt;. J'ai ajout&#233; un bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;span/&gt;&lt;/code&gt;, juste pour porter la propri&#233;t&#233; &lt;i&gt;name&lt;/i&gt;. Enfin pour la position, comme je n'avais pas d'&#233;l&#233;ment o&#249; l'ins&#233;rer, j'ai directement ajout&#233; un bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;meta&gt;&lt;/code&gt;, qui ne s'affichera donc pas, mais sera bien pr&#233;sent dans le code.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Google et les donn&#233;es structur&#233;es&lt;/h2&gt;
&lt;p&gt;La liste des champs/propri&#233;t&#233;s possibles sont disponibles sur le site de schema.org.&lt;/p&gt; &lt;p&gt;Une liste plus synth&#233;tique des champs recommand&#233;s ou obligatoires, sont disponibles dans les &lt;a href=&quot;https://developers.google.com/search/docs/data-types/breadcrumb&quot; class='spip_out' rel='external'&gt;directives pour les donn&#233;es structur&#233;es d&#233;finies par Google&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;En utilisant des &lt;strong&gt;donn&#233;es structur&#233;es&lt;/strong&gt; sur votre site, vous am&#233;liorez la compr&#233;hension de votre site par les moteurs de recherche, donc vous en &lt;strong&gt;am&#233;liorez le r&#233;f&#233;rencement&lt;/strong&gt;, et vous b&#233;n&#233;ficiez parfois d'un affichage optimis&#233; (rich snippet) dans les r&#233;sultats de recherche, comme l'affichage des notes sur des produits, ou les &#233;l&#233;ments d'&lt;a href=&quot;https://www.google.fr/search?q=recette+cr%C3%A8pes&quot; class='spip_out' rel='external'&gt;une recette&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Outil indispensable&lt;/strong&gt; lorsque vous travaillez les donn&#233;es structur&#233;es, Google propose un analyseur de code source qui vous montre le r&#233;sultat de la d&#233;tection par le moteur de recherche des balises s&#233;mantiques, pour &lt;a href=&quot;https://search.google.com/structured-data/testing-tool?hl=fr&quot; class='spip_out' rel='external'&gt;tester vos donn&#233;es structur&#233;es&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Il vous indiquera &#233;galement les erreurs que vous auriez pu commettre dans l'encha&#238;nement des blocs. Utilisez-le pour d&#233;bugger vos balises.&lt;/p&gt; &lt;p&gt;Pas de jaloux, les donn&#233;es structur&#233;es fonctionnent &#233;galement chez &lt;a href=&quot;https://www.bing.com/toolbox/markup-validator&quot; class='spip_out' rel='external'&gt;Microsoft Bing&lt;/a&gt; et &lt;a href=&quot;https://webmaster.yandex.com/tools/microtest/&quot; class='spip_out' rel='external'&gt;Yandex&lt;/a&gt;, entre autres.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;SPIP et les donn&#233;es structur&#233;es&lt;/h2&gt;
&lt;p&gt;L'objectif est d'int&#233;grer ceci &#224; un site SPIP. J'ai fait la modification sur les pages &lt;i&gt;article&lt;/i&gt; et &lt;i&gt;rubrique&lt;/i&gt; pour lesquelles je voyais un int&#233;r&#234;t &#224; avoir un fil d'Ariane.&lt;/p&gt; &lt;p&gt;Pour cela, j'ai copi&#233; les fichiers &lt;i&gt;article.html&lt;/i&gt; et &lt;i&gt;rubrique.html&lt;/i&gt; que j'ai trouv&#233;s dans le r&#233;pertoire de mon th&#232;me actuel, vers le r&#233;pertoire &lt;code class='spip_code' dir='ltr'&gt;squelette/contenu/&lt;/code&gt; du site, pour &lt;strong&gt;surcharger les squelettes&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;J'ai ensuite rechercher et &lt;strong&gt;remplacer le bloc hi&#233;rarchie&lt;/strong&gt; pr&#233;sent dans les fichiers. Voici le morceau de squelette qui permet de g&#233;n&#233;rer le fil d'Ariane avec les m&#233;ta donn&#233;es.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;[(#REM) Fil d'Ariane ]&lt;br /&gt; &lt;ol itemscope itemtype=&quot;http://schema.org/BreadcrumbList&quot; id=&quot;hierarchie&quot;&gt;&lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt;&lt;br /&gt; &lt;a href=&quot;#URL_SITE_SPIP/&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;&lt;:accueil_site:&gt;&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;1&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;BOUCLE_ariane(HIERARCHIE){id_article}&gt;&lt;br /&gt; &lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt; &gt; &lt;br /&gt; &lt;a href=&quot;#URL_RUBRIQUE&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;[(#TITRE|couper{80})]&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;[(#COMPTEUR_BOUCLE|plus{1})]&quot; /&gt;&lt;br /&gt; &lt;/li&gt;&lt;br /&gt; &lt;/BOUCLE_ariane&gt;&lt;br /&gt; [&lt;li itemprop=&quot;itemListElement&quot; itemscope itemtype=&quot;http://schema.org/ListItem&quot;&gt; &gt; &lt;br /&gt; &lt;a href=&quot;#URL_ARTICLE&quot; itemprop=&quot;item&quot;&gt;&lt;br /&gt; &lt;span itemprop=&quot;name&quot;&gt;(#TITRE|couper{80})&lt;/span&gt;&lt;br /&gt; &lt;/a&gt;&lt;br /&gt; &lt;meta itemprop=&quot;position&quot; content=&quot;[(#TOTAL_BOUCLE|plus{2})]&quot; /&gt;&lt;br /&gt; &lt;/li&gt;]&lt;br /&gt; &lt;/B_ariane&gt;&lt;br /&gt; &lt;/ol&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Le bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;ol/&gt;&lt;/code&gt; est cod&#233; en dur puisqu'il encapsulera toujours le fil d'Ariane. Chaque bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;li/&gt;&lt;/code&gt; qui le constitue correspond &#224; un niveau hi&#233;rarchique.&lt;/p&gt; &lt;p&gt;Le premier &#233;l&#233;ment &lt;code class='spip_code' dir='ltr'&gt;&lt;li/&gt;&lt;/code&gt; correspond &#224; la page d'accueil. La &lt;strong&gt;position du premier &#233;l&#233;ment doit &#234;tre &#233;gale &#224; 1&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Ensuite on entre dans une &lt;strong&gt;boucle sur la hi&#233;rarchie des rubriques entre l'accueil du site et la page courante&lt;/strong&gt;. Pour chaque niveau, on retrouve un bloc &lt;code class='spip_code' dir='ltr'&gt;&lt;li/&gt;&lt;/code&gt;. La position est calcul&#233;e sur la &lt;strong&gt;balise SPIP #COMPTEUR_BOUCLE&lt;/strong&gt; qui nous donne le num&#233;ro d'it&#233;ration. On ajoute 1, avec le filtre &lt;code class='spip_code' dir='ltr'&gt;plus {1}&lt;/code&gt; car le premier c'est la page d'accueil.&lt;/p&gt; &lt;p&gt;A partir de SPIP 3.0, il existe la &lt;strong&gt;balise #PROFONDEUR&lt;/strong&gt; qui indique la profondeur d'une rubrique, mais la num&#233;rotation commence &#224; 0, et la position attendue pour le premier &#233;l&#233;ment est 1. Donc je pr&#233;f&#232;re garder mon syst&#232;me de comptage sur la boucle qui fonctionne pour toutes les versions de SPIP.&lt;/p&gt; &lt;p&gt;Enfin, pour le &lt;strong&gt;dernier &#233;l&#233;ment du fil d'Ariane&lt;/strong&gt;, il s'agit de la page actuellement visit&#233;e, j'ai utilis&#233; un lien vers la page courante pour &lt;strong&gt;ajouter du maillage interne important en SEO&lt;/strong&gt;. J'ai plac&#233; le code dans le bloc optionnel, entre la balise fermante &lt;code class='spip_code' dir='ltr'&gt;&lt;/BOUCLE_ariane&gt;&lt;/code&gt; et la balise fermante &lt;code class='spip_code' dir='ltr'&gt;&lt;/B_ariane&gt;&lt;/code&gt;, pour que la &lt;strong&gt;balise #TOTAL_BOUCLE&lt;/strong&gt; contienne le nombre d'&#233;l&#233;ments trouv&#233;s dans la hi&#233;rarchie. Cela va permettre de calculer la position du dernier &#233;l&#233;ment, via le filtre &lt;code class='spip_code' dir='ltr'&gt;plus {2}&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;De plus ce bloc est entre crochet pour que les balises et filtres soient remplac&#233;s et calcul&#233;s lors de la g&#233;n&#233;ration de la page.&lt;/p&gt; &lt;p&gt;Une fois que vous avez apport&#233; la modification sur les deux squelettes, il n'y a plus qu'&#224; recalculer la page et vider le cache, et enfin attendre que les moteurs de recherche fassent la mise &#224; jour.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;CSS &amp; fil d'ariane&lt;/h2&gt;
&lt;p&gt;Si tout s'est bien pass&#233;, vous devez obtenir une liste ordonn&#233;e qui correspond &#224; votre fil d'Ariane. Mais pour l'instant les &#233;l&#233;ments sont les uns en dessous des autres, avec une num&#233;rotation.&lt;/p&gt; &lt;p&gt;Pour modifier cela, j'ai utilis&#233; un peu de CSS, dans le fichier &lt;code class='spip_code' dir='ltr'&gt;squelette/perso.css&lt;/code&gt; pour surcharger le style de mon th&#232;me.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;#hierarchie li {&lt;br /&gt; list-style-type: none;&lt;br /&gt; margin-left: 0;&lt;br /&gt; display: inline;&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cela correspond &#224; :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;strong&gt;list-style-type&lt;/strong&gt; permet de masquer la num&#233;rotation&lt;/li&gt;&lt;li&gt; &lt;strong&gt;margin-left&lt;/strong&gt; permet de supprimer le d&#233;calage de la num&#233;rotation&lt;/li&gt;&lt;li&gt; &lt;strong&gt;display&lt;/strong&gt; permet d'afficher chaque &#233;l&#233;ment du fil d'Ariane sur la m&#234;me ligne &#224; la suite&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pensez &#224; rafra&#238;chir le cache pour v&#233;rifier les modifications.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Pour aller plus loin&lt;/h2&gt;
&lt;p&gt;N'oubliez pas de tester le r&#233;sultats de vos modifications avec l'outil de Google, pour v&#233;rifier qu'il d&#233;tecte bien tous vos champs. Vous d&#233;couvrirez au passage peut-&#234;tre d'autres balises d&#233;j&#224; pr&#233;sentes sur la page.&lt;/p&gt; &lt;p&gt;Le champ des possibles avec les donn&#233;es structur&#233;es est immense et reconnu par tous les moteurs de recherche. N'h&#233;sitez pas &#224; en abuser sur vos pages.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Theme-color : personnaliser les couleurs du navigateur mobile pour votre marque</title>
		<link>https://www.orsal.fr/Theme-color-personnaliser-les</link>
		<guid isPermaLink="true">https://www.orsal.fr/Theme-color-personnaliser-les</guid>
		<dc:date>2016-03-11T16:50:33Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;La m&#233;ta theme-color permet de personnaliser l'interface de navigation mobile (barre d'adresse, onglets) aux couleurs de votre marque. D&#233;couvrez comment impl&#233;menter cette meta HTML simple mais efficace sur Chrome, Safari iOS, et Windows Phone pour am&#233;liorer l'exp&#233;rience utilisateur et votre coh&#233;rence visuelle sur tous les appareils. Pourquoi impl&#233;menter theme-color ? L'exp&#233;rience utilisateur sur mobile est cruciale pour votre branding et votre SEO. La m&#233;ta theme-color offre un avantage simple mais (...)&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Developpement-Web" rel="directory"&gt;D&#233;veloppement Web&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH146/arton59-27f8c.jpg' width='150' height='146' onmouseover=&quot;this.src='local/cache-vignettes/L150xH146/artoff59-60bef.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH146/arton59-27f8c.jpg'&quot; style='height:146px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;La m&#233;ta theme-color permet de personnaliser l'interface de navigation mobile (barre d'adresse, onglets) aux couleurs de votre marque. D&#233;couvrez comment impl&#233;menter cette meta HTML simple mais efficace sur Chrome, Safari iOS, et Windows Phone pour am&#233;liorer l'exp&#233;rience utilisateur et votre coh&#233;rence visuelle sur tous les appareils.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class='h3 spip'&gt;Pourquoi impl&#233;menter theme-color ?&lt;/h2&gt;
&lt;p&gt;L'exp&#233;rience utilisateur sur mobile est cruciale pour votre branding et votre SEO. La m&#233;ta theme-color offre un avantage simple mais efficace : aligner l'interface de navigation aux couleurs de votre marque. Cela cr&#233;e une exp&#233;rience coh&#233;rente et professionnelle sur tous les navigateurs mobiles.&lt;/p&gt; &lt;dl class='spip_document_39 spip_documents spip_documents_center' style=''&gt; &lt;dt&gt;&lt;img src='https://www.orsal.fr/local/cache-vignettes/L300xH533/color-theme-exemple-ef9ff.jpg' width='300' height='533' alt='JPEG - 56.6 ko' style='height:533px;width:300px;' /&gt;&lt;/dt&gt; &lt;dt class='spip_doc_titre' style='width:300px;'&gt;&lt;strong&gt;Utilisation de la balise meta theme-color&lt;/strong&gt;&lt;/dt&gt; &lt;/dl&gt;
&lt;h2 class='h3 spip'&gt;Impl&#233;mentation multiplateforme&lt;/h2&gt;
&lt;p&gt;L'astuce est assez simple, il suffit d'ajouter un meta theme-color dans l'ent&#234;te de votre page Web. Donc &#224; l'int&#233;rieur de la balise &lt;head&gt;&lt;/head&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Chrome et navigateurs standards&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;!-- Chrome --&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;meta name=&quot;theme-color&quot; content=&quot;#68cfd0&quot;&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Cette meta a int&#233;gr&#233; le standard HTML, mais n'est pas encore respect&#233;e de mani&#232;re identique par tous les navigateurs. Personnellement, j'ai pu constater le fonctionnement sur Android que sous Chrome et les navigateurs Chromium.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Windows Phone&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Pour Windows Phone, il faudra utiliser une autre meta que le standard...&lt;/p&gt; &lt;p&gt;&lt;!-- Windows Phone --&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;&lt;meta name=&quot;msapplication-navbutton-color&quot; content=&quot;#68cfd0&quot;&gt;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;iOS Safari&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Enfin sur iPhone, vous aurez en plus la possibilit&#233; de rendre translucide la barre de statut.&lt;/p&gt; &lt;p&gt;&lt;!-- iOS Safari --&gt;&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;f&lt;br /&gt; &lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot;&gt;&lt;br /&gt; &lt;meta name=&quot;apple-mobile-web-app-status-bar-style&quot; content=&quot;black-translucent&quot;&gt;&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Standards modernes en 2025&lt;/h2&gt;
&lt;p&gt;Le support de theme-color est maintenant largement g&#233;n&#233;ralis&#233; sur tous les navigateurs mobiles modernes. Chrome, Safari sur iOS, et Edge respectent cette meta comme standard. Elle fait partie des bonnes pratiques incontournables pour tout d&#233;veloppeur souhaitant optimiser l'exp&#233;rience mobile et offrir une coh&#233;rence visuelle professionnelle &#224; ses utilisateurs.&lt;/p&gt; &lt;p&gt;En cherchant un peu sur le net vous trouverez d'autres personnalisations comme transformer une page Web en Web App en quelques instructions.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Erreur logrotate avec mysql-server sur Debian</title>
		<link>https://www.orsal.fr/Erreur-logrotate-mysql-server</link>
		<guid isPermaLink="true">https://www.orsal.fr/Erreur-logrotate-mysql-server</guid>
		<dc:date>2015-11-05T10:47:15Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Orsal</dc:creator>



		<description>
&lt;p&gt;Lors de la rotation des logs MySQL, logrotate peut &#233;chouer sur Debian et g&#233;n&#233;rer des erreurs r&#233;p&#233;t&#233;es. Cet article explique la cause du probl&#232;me et pr&#233;sente une solution simple pour r&#233;tablir une rotation automatique fiable.&lt;/p&gt;


-
&lt;a href="https://www.orsal.fr/Ubuntu-Debian-Linux" rel="directory"&gt;Ubuntu, Debian, Linux&lt;/a&gt;


		</description>


 <content:encoded>&lt;img class='spip_logos' alt=&quot;&quot; align=&quot;right&quot; src='https://www.orsal.fr/local/cache-vignettes/L150xH146/arton58-16fd8.jpg' width='150' height='146' onmouseover=&quot;this.src='local/cache-vignettes/L150xH146/artoff58-39133.jpg'&quot; onmouseout=&quot;this.src='local/cache-vignettes/L150xH146/arton58-16fd8.jpg'&quot; style='height:146px;width:150px;' /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Lors de la rotation des logs MySQL, logrotate peut &#233;chouer sur Debian et g&#233;n&#233;rer des erreurs r&#233;p&#233;t&#233;es. Cet article explique la cause du probl&#232;me et pr&#233;sente une solution simple pour r&#233;tablir une rotation automatique fiable.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;strong&gt;Note historique :&lt;/strong&gt; Cet article date de novembre 2015 (Debian Jessie). Bien que les principes restent valides, certains d&#233;tails concernant logrotate et MySQL ont pu &#233;voluer. L'approche de diagnostic d&#233;crite conserve sa pertinence pour les syst&#232;mes Debian et Ubuntu modernes.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Contexte du probl&#232;me&lt;/h2&gt;
&lt;p&gt;Sur les serveurs Debian/Linux, logrotate ex&#233;cute quotidiennement la rotation des fichiers journaux via un script situ&#233; dans &lt;strong&gt;/etc/cron.daily&lt;/strong&gt;. Lorsque MySQL est install&#233;, logrotate cr&#233;e une configuration d&#233;di&#233;e qui, apr&#232;s archivage des logs, ex&#233;cute un script de post-rotation.&lt;/p&gt; &lt;p&gt;Ce script &#233;choue r&#233;guli&#232;rement avec une erreur de permissions, ce qui g&#233;n&#232;re des rapports envoy&#233;s par mail via cron.&lt;/p&gt; &lt;p&gt;Le message d'erreur type re&#231;u est le suivant :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;/etc/cron.daily/logrotate: error: error running shared postrotate script for '/var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/error.log'&lt;br /&gt; run-parts: /etc/cron.daily/logrotate exited with return code 1&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Diagnostic : comprendre le r&#244;le de logrotate et debian-sys-maint&lt;/h2&gt;
&lt;p&gt;Logrotate est l'utilitaire syst&#232;me charg&#233; de limiter la croissance des fichiers journaux. Il archive et compresse les anciens logs en parcourant les fichiers de configuration du r&#233;pertoire &lt;strong&gt;/etc/logrotate.d/&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Pour la gestion de MySQL, il s'appuie sur un compte utilisateur syst&#232;me d&#233;di&#233; : &lt;strong&gt;debian-sys-maint&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Ce compte poss&#232;de les permissions minimales n&#233;cessaires &#224; la maintenance automatique du service MySQL. Ces permissions sont r&#233;f&#233;renc&#233;es dans deux fichiers cl&#233;s.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1. Configuration logrotate pour MySQL :&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo cat /etc/logrotate.d/mysql-server&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ce fichier d&#233;finit une variable &lt;strong&gt;MYADMIN&lt;/strong&gt; qui utilise les identifiants du compte de maintenance :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;MYADMIN=&quot;/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf&quot;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Fichier de configuration MySQL du compte de maintenance :&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo cat /etc/mysql/debian.cnf&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Ce fichier contient les identifiants du compte &lt;strong&gt;debian-sys-maint&lt;/strong&gt; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;# Automatically generated for Debian scripts. DO NOT TOUCH!&lt;br /&gt; [client]&lt;br /&gt; host = localhost&lt;br /&gt; user = debian-sys-maint&lt;br /&gt; password = xxxxxxxxxxxxxxx&lt;br /&gt; socket = /var/run/mysqld/mysqld.sock&lt;br /&gt; &lt;br /&gt; [mysql_upgrade]&lt;br /&gt; host = localhost&lt;br /&gt; user = debian-sys-maint&lt;br /&gt; password = xxxxxxxxxxxxxxx&lt;br /&gt; socket = /var/run/mysqld/mysqld.sock&lt;br /&gt; basedir = /usr&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;Cause racine : insuffisance de privil&#232;ges&lt;/h2&gt;
&lt;p&gt;L'erreur de post-rotation survient lorsque le compte &lt;strong&gt;debian-sys-maint&lt;/strong&gt; ne dispose pas des permissions MySQL suffisantes pour ex&#233;cuter les commandes d'administration n&#233;cessaires (rechargement des tables, interrogation de l'&#233;tat du serveur, etc.).&lt;/p&gt; &lt;p&gt;Le compte syst&#232;me existe bien et acc&#232;de au fichier de configuration, mais ses droits au niveau MySQL sont incomplets ou corrompus.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Solution : restaurer les permissions du compte debian-sys-maint&lt;/h2&gt;
&lt;p&gt;La r&#233;solution consiste &#224; accorder au compte &lt;strong&gt;debian-sys-maint&lt;/strong&gt; l'ensemble des permissions administratives requises. Cette op&#233;ration doit &#234;tre effectu&#233;e avec un compte disposant des droits administrateur MySQL.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&#201;tape 1 : connexion en tant qu'administrateur MySQL&lt;/strong&gt;&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Saisissez le mot de passe root MySQL.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&#201;tape 2 : attribution des permissions&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ex&#233;cutez les commandes SQL suivantes en rempla&#231;ant le mot de passe par celui figurant dans le fichier &lt;strong&gt;/etc/mysql/debian.cnf&lt;/strong&gt; :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES&lt;br /&gt; ON *.* TO 'debian-sys-maint'@'localhost'&lt;br /&gt; IDENTIFIED BY 'xxxxxxxxxxxxxxx';&lt;br /&gt; FLUSH PRIVILEGES;&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Les permissions accord&#233;es correspondent &#224; :&lt;/p&gt; &lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; &lt;strong&gt;RELOAD&lt;/strong&gt; : recharger les tables et caches&lt;/li&gt;&lt;li&gt; &lt;strong&gt;SHUTDOWN&lt;/strong&gt; : arr&#234;ter le serveur MySQL&lt;/li&gt;&lt;li&gt; &lt;strong&gt;PROCESS&lt;/strong&gt; : afficher les processus serveur&lt;/li&gt;&lt;li&gt; &lt;strong&gt;SHOW DATABASES&lt;/strong&gt; : lister les bases de donn&#233;es&lt;/li&gt;&lt;li&gt; &lt;strong&gt;SUPER&lt;/strong&gt; : ex&#233;cuter les op&#233;rations de maintenance&lt;/li&gt;&lt;li&gt; &lt;strong&gt;LOCK TABLES&lt;/strong&gt; : verrouiller les tables lors des op&#233;rations de sauvegarde&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&#201;tape 3 : application imm&#233;diate des permissions&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La commande &lt;strong&gt;FLUSH PRIVILEGES&lt;/strong&gt; recharge les droits en m&#233;moire et rend les changements effectifs imm&#233;diatement, sans red&#233;marrage du serveur.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;FLUSH PRIVILEGES;&lt;/code&gt;&lt;/div&gt;
&lt;h2 class='h3 spip'&gt;V&#233;rification&lt;/h2&gt;
&lt;p&gt;Apr&#232;s ces modifications, la prochaine ex&#233;cution de logrotate (lors du cron quotidien) fonctionnera sans erreur.&lt;/p&gt; &lt;p&gt;Pour tester imm&#233;diatement sans attendre l'ex&#233;cution automatique :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;sudo /etc/cron.daily/logrotate&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Si aucune erreur n'est affich&#233;e, le probl&#232;me est r&#233;solu.&lt;/p&gt; &lt;h2 class='h3 spip'&gt;Pr&#233;vention et bonnes pratiques&lt;/h2&gt;
&lt;ul class=&quot;spip&quot;&gt;&lt;li&gt; Maintenir &#224; jour le compte &lt;strong&gt;debian-sys-maint&lt;/strong&gt; via les mises &#224; jour du paquet &lt;strong&gt;mysql-server&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; Surveiller les erreurs logrotate dans les logs cron : &lt;strong&gt;grep logrotate /var/log/syslog&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; Adapter les permissions sur les installations personnalis&#233;es ou durcies&lt;/li&gt;&lt;li&gt; Pr&#233;server le fichier &lt;strong&gt;/etc/mysql/debian.cnf&lt;/strong&gt;, &#233;l&#233;ment cl&#233; du bon fonctionnement de la maintenance automatis&#233;e&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
