Trucs et astuces Gnu/Linux



Charles-Antoine Guillat-Guignard
xarli@xarli.net
http://www.xarli.net

Copyright 2003 - 2004 Charles-Antoine Guillat-Guignard


La dernière version de ce document est disponible sur ce site : http://contrib.xarli.net/trucsetastuces/




Copyright (c) 2003 - 2004 Charles-Antoine Guillat-Guignard.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

Interfacer FetchYahoo avec SpamAssassin


Je considère ici que vous avez installé et configuré FetchYahoo ainsi que SpamAssassin.


Pour interfacer FetchYahoo et SpamAssassin, on va créer un script qui va prendre les courriels en entrée, les passer par Spamc (le client qui fonctionne avec Spamd, la version démonisée de SpamAssassin). Voilà le contenu de ce script, que l'on va placer dans le répertoire /usr/local/bin, et appeller sendmail_spamc, mais vous pouvez bien sûr lui donner le nom que vous désirez.


#!/bin/sh
cat=`which cat`
spamc=`which spamc`
sendmail=`which sendmail`
$cat /dev/stdin | $spamc | $sendmail $1
exit 0

L'étape suivante consiste à indiquer à FetchYahoo comment délivrer correctement les courriels au serveur, en les passant par le filtre en passant. On va ajouter les trois lignes suivantes ay fichier de configuration de FetchYaoo, et commenter ces variables ailleurs dans le même fichier, si elles étaient déjà existantes.


use-spool = 1
spool = /usr/local/bin/sendmail_spamc votreadressemail@domaine.tld
spool-mode = pipe

Bien sûr, il faut remplacer 'votreadressemail@domaine.tld' par l'adresse mail destinataire des courriels arrivant dans votre boîte Yahoo™.


Interfacer GetMail avec SpamAssassin


Je considère ici que vous avez installé et configuré GetMail ainsi que SpamAssassin.


Pour interfacer GetMail et SpamAssassin, on va créer un script qui va prendre les courriels en entrée, les passer par Spamc (le client qui fonctionne avec Spamd, la version démonisée de SpamAssassin). Voilà le contenu de ce script, que l'on va placer dans le répertoire /usr/local/bin, et appeller sendmail_spamc, mais vous pouvez bien sûr lui donner le nom que vous désirez.


#!/bin/sh
cat=`which cat`
spamc=`which spamc`
sendmail=`which sendmail`
$cat /dev/stdin | $spamc | $sendmail $1
exit 0

On va ensuite indiquer dans le fichier de configuration de Getmail, placé dans '$HOME/.getmail/getmailrc', qu'il faut passer les mails récupérés à ce script. La ligne à insérer, et ce pour chaque compte configuré. On va donner à la variable "postmaster" en paramètre le script que l'on vient de créer, à travers un pipe, et on va rediriger les éventuelles erreurs vers /dev/null pour qu'elles ne perturbent pas GetMail. L'adresse mail est bien sûr à remplacer par votre adresse mail.


# On passe les mails à l'antispam, et on les délivre avec sendmail
postmaster = '| /usr/local/bin/sendmail_spamc votreadressemail@domaine.tld 2> /dev/null'

A noter que GetMail ne doit pas être exécuter par le super-utilisateur (root), sinon il refusera d'appeller le script externe.


Ajouter la commande CAPA au démon POP de Qmail pour pouvoir récupérer la liste des fonctionnalités implémentées dans ce démon


Certains clients mails, une commande POP décrite dans les RFCs permet de voir les protocoles supportés par le serveur (authentification APOP par exemple). Le serveur POP de Qmail ne supporte pas cette commande. Pour ajouter la commande CAPA permettant de récupérer les capacités de POPd fourni avec Qmail, il suffit d'appliquer deux petits patchs (un pour pouvoir appeller cette fonction avant et après l'authentification. Voilà ces deux patchs.


--- qmail-pop3d.c.orig	Mon Jun 15 03:53:16 1998
+++ qmail-pop3d.c	Thu Nov 14 16:54:03 2002
@@ -273,8 +273,21 @@
   close(fd);
 }

+void pop3_capa(arg) char *arg;
+{
+  puts("+OK Capability list follows\r\n"
+       "TOP\r\n"
+       "UIDL\r\n"
+       "LAST\r\n"
+       "USER\r\n"
+       "APOP\r\n"
+       ".\r\n");
+  flush();
+}
+
 struct commands pop3commands[] = {
   { "quit", pop3_quit, 0 }
+, { "capa", pop3_capa, 0 }
 , { "stat", pop3_stat, 0 }
 , { "list", pop3_list, 0 }
 , { "uidl", pop3_uidl, 0 }

--- qmail-popup.c.orig	Mon Jun 15 03:53:16 1998
+++ qmail-popup.c	Thu Nov 14 16:38:41 2002
@@ -155,11 +155,23 @@
   *space++ = 0;
   doanddie(arg,space - arg,space);
 }
+void pop3_capa(arg) char *arg;
+{
+  puts("+OK Capability list follows\r\n"
+       "TOP\r\n"
+       "UIDL\r\n"
+       "LAST\r\n"
+       "USER\r\n"
+       "APOP\r\n"
+       ".\r\n");
+  flush();
+}

 struct commands pop3commands[] = {
   { "user", pop3_user, 0 }
 , { "pass", pop3_pass, 0 }
 , { "apop", pop3_apop, 0 }
+, { "capa", pop3_capa, 0 }
 , { "quit", pop3_quit, 0 }
 , { "noop", okay, 0 }
 , { 0, err_authoriz, 0 }

On copie-colle ces deux patchs dans deux fichiers dans le répertoire source de Qmail (add_capa-1.patch et add_capa-2.patch par exemple). Puis on applique ces patchs :

# patch < add_capa-1.patch
# patch < add_capa-2.patch

On recompile Qmail, on réinstalle, et c'est bon. Vous pouvez tester le résultat en vous connectant avec telnet sur le port 110 et en entrant la commande 'CAPA'. Vous verrez alors la liste des capacités de votre serveur POP.


Pouvoir utiliser des wildcards dans le fichier de contrôle badmailfrom de Qmail


Le fichier badmailfrom de Qmail, contenu dans le sous répertoire control, qui contient les fichiers de configuration, permet de définir des expéditeurs dont on rejette tous les mails. Le problème est que l'on ne peut, dans la version 1.03 de Qmail, spécifier de wildcard (on ne peut pas dire tous les sous-domaines de example.com, on doit les déclarer un par un, et odnc obligatoirement faire une liste incomplète du coup). Un patch existe pour pouvoir le faire, il est ci-dessous (copiez-collez les lignes ci-dessous dans un fichier 'qmail-badmailfrom-wildcard.patch', à la racine du répertoire contenant les sources de Qmail):

If badmailfrom contains "*.example.com" then reject mail from
"anything@any.thing.example.com"

http://tomclegg.net/qmail/qmail-badmailfrom-wildcard.patch

--- qmail-smtpd.c~	Thu Apr 17 16:08:41 2003
+++ qmail-smtpd.c	Thu Apr 17 20:04:16 2003
@@ -212,11 +212,18 @@
 int bmfcheck()
 {
   int j;
+  int bad;
+  char c;
   if (!bmfok) return 0;
   if (constmap(&mapbmf,addr.s,addr.len - 1)) return 1;
   j = byte_rchr(addr.s,addr.len,'@');
-  if (j < addr.len)
+  if (j < addr.len) {
     if (constmap(&mapbmf,addr.s + j,addr.len - j - 1)) return 1;
+    for (j++; j < addr.len; j++)
+      if (addr.s[j] == '.') {
+	if(constmap(&mapbmf,addr.s + j,addr.len - j - 1)) return 1;
+      }
+  }
   return 0;
 }

Puis, patchez les sources de Qmail avec la commande :

# patch < qmail-badmailfrom-wildcard.patch

Si vous n'avez pas d'insultes, c'est bon. Compilez les sources de Qmail, installez les, et c'est bon. Vous pouvez maintenant utiliser des wildcards dans votre fichier badmailfrom, en utilisant un point suivi de la fin du domaine. Par exemple, pour rejeter les mails venant de *@*.toto.ca (possible seulement avec le patch) et ceux venant de *@toto.com (possible de base, pour vous rappeller la syntaxe), rajoutez les lignes suivantes dans votre fichier badmailfrom :

.toto.ca
@toto.com

Trouver des patchs pour Qmail 1.03


Vous voulez améliorer quelque peu le comportement de votre Qmail? Vous vous sentez dévalorisés par rapport aux utilisateurs de PostFix qui ont le plaisir de recompiler leur MTA régulièrement? Et bien oui, c'est vrai, ou en trouver? Bah ici par exemple : http://d-srv.com/sw/patches/.


Trouver des patchs pour QmailScanner 1.20


QmailScanner est un très bon content scanner, que je vous conseille d'interfacer avec SpamAssassin et ClamAV. Vous pouvez rajouter des fonctionnalités intéressantes avec ce patch : http://d-srv.com/sw/patches/qmail-scanner-1.20st/.


Récupérer la main sur une base MySql dont on a perdu le mot de passe root


Pas de panique! La solution est dans l'aide ou le manuel du démon MySQLD (si vous arrivez ici suite à une recherche sur un moteur, sachez qu'un simple "mysqld --help" vous aurait fait économiser du temps et de la bande passante).

Une option très utile du démon MySql permet de le lancer sans qu'il utilise le système de privilège, donnant accès totalement libre à n'importe qui : --skip-grant-tables. Après avoir lancé mysqld avec cette option, il suffit de se connecter à la base 'mysql', et de changer le mot de passe du super utilisateur, puis de terminer le démon, et de le relancer en mode normal. Aller, une petite démonstration.


23:06 root@iguzki ~# /etc/init.d/mysql stop
Stopping MySQL database server: mysqld.
23:07 root@iguzki ~# /usr/sbin/mysqld --skip-grant-tables &
[1] 22479
/usr/sbin/mysqld: ready for connections.
Version: '4.0.18-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 0

23:07 root@iguzki ~# mysql mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> update user set password=PASSWORD("monnouveaumotdepasse") where user='root';
Query OK, 0 rows affected (0.04 sec)
Rows matched: 2  Changed: 0  Warnings: 0

mysql> quit
Bye
23:08 root@iguzki ~# killall mysqld
040313  2:08:21  /usr/sbin/mysqld: Normal shutdown
040313  2:08:21  /usr/sbin/mysqld: Shutdown Complete
[1]  + done       /usr/sbin/mysqld --skip-grant-tables
23:08 root@iguzki ~# etc/init.d/mysql start
Starting MySQL database server: mysqld.
23:09 root@iguzki ~#

Faire écouter un démon SMTP PostFix sur un port différent de celui par défaut


Utiliser un autre port que le port par défaut du protocole SMTP, soit le port TCP 25? Mais pourquoi donc me demanderez vous avec une moue exprimant l'incompréhension? Et bien cela peut être, comme dans mon cas, pour utiliser le port 25 pour un serveur SMTP distant, en tunnelant les connexions par SSH. Enfin bref, si vous avez besoin de le faire, nous allons commencer par créer un service SMTP2 dans votre fichier de service (dans l'exemple, je vais utiliser le port 2525, mais n'hésitez pas à faire jouer votre imagination, et à utiliser n'importe quel port non utilisé sur votre babasse), en rajoutant la ligne suivante dans votre fichier de configuration des services (/etc/services):

smtp2  2525/tcp

Quand nous faisons référence au service SMTP2, désormais votre système comprend qu'il doit utiliser le port 2525. Nous allons donc dire à PostFix d'écouter sur ce port, en modifiant la ligne contenant le type de service inet et le démon smtpd (si vous ne voyez pas ce que je veux dire c'est la même ligne que ci dessous mais avec au début "smtp" à la place de "smtp2") :

smtp2     inet  n       -       -       -       -       smtpd

Une petite prise en compte de la nouvelle configuration :

20:16 root@iguzki ~#postfix reload

Et voilà, vous disposez désormais comme moi de deux services SMTP différents en écoute sur votre machine, celui forwardé depuis une autre machine sur le port 25, et le local sur le port 2525 :

20:21 root@iguzki ~# telnet localhost 25
Trying 127.0.0.1...
Connected to iguzki.
Escape character is '^]'.
220 kartxila.xarli.net ESMTP
quit
221 kartxila.xarli.net
Connection closed by foreign host.
20:22 root@iguzki ~# telnet 127.0.0.1 2525
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 iguzki ESMTP Postfix (Debian/GNU)
quit
221 Bye
Connection closed by foreign host.
20:22 root@iguzki ~#

Debian Unstable, Galeon et Java


Comment installer Java pour vos navigateurs sous Debian SID? L'extension Java de FireFox marche mal (chez moi en tout cas). C'est facile, d'abord vérifiez avec quelle version de GCC votre navigateur a été compilé, en rentrant about:buildconfig dans votre barre d'URL. Puis, sur cette page [EN], téléchargez la version du JRE BlackDown correspondant au compilateur qui a été utilisé pour compiler votre fureteur (si c'est GCC 3.3, la version de BlackDown Java pour GCC 3.2 fonctionne très bien). Installez là, créez un lien vers le répertoire de plugins comme cela (vous pouvez répéter l'opération pour vos différents navigateurs, en changeant de répertoire de création du lien symbolique):

ln -s /usr/local/j2re1.4.2/plugin/i386/mozilla/libjavaplugin_oji.so /usr/lib/mozilla/plugins/

C'est bon, vous pouvez profiter du plugin Java pour aller (par exemple), visionner les vagues sur vos spots favoris sur ViewSurf [FR].


Reconfiguration CPAN


Si vous utilisez le CPAN pour installer vos modules Perl, et que vous avez répondu "non" à la question de savoir si vous vouliez procéder à la configuration manuelle du module, vous êtes bien embêtés maintenant. En effet, votre liste de miroirs CPAN est vide, ce qui vous empêche d'installer de nouveaux modules. Et bien voilà la syntaxe de configuration de votre liste de miroir, avec enregistrement de celle-ci de manière à ne pas avoir à recommencer à chaque nouvelle installation.


23:46 root@iguzki ~# perl -MCPAN -e shell
cpan> o conf urllist pop
cpan> o conf urllist push ftp://mir1.ovh.net/ftp.cpan.org/
cpan> o conf urllist push http://www.enstimac.fr/Perl/CPAN/
cpan> o conf urllist push ftp://ftp.pasteur.fr/pub/computing/CPAN/
cpan> o conf commit
cpan> reload cpan
cpan> o conf urllist
    urllist
        ftp://ftp.pasteur.fr/pub/computing/CPAN/
        http://www.enstimac.fr/Perl/CPAN/
        ftp://mir1.ovh.net/ftp.cpan.org/
Type 'o conf' to view configuration edit options
cpan> quit
Lockfile removed.
23:46 root@iguzki ~#

Petites explications :

"o conf urllist pop" sert à effacer les miroirs déjà présents.

"o conf urllist <mon-url>" sert à ajouter un miroir (on peut appeller cette commande plusieurs fois pour rajouter plusieurs miroirs).

"o conf commit" sert à enregistrer la nouvelle configuration.

"reload cpan" sert à recharger le module CPAN.

"o conf urllist" sert à afficher le contenu de la variable urllist, et donc à voir ce que venez de rentrer.


Comment monter automatiquement un partage réseau Windows©


Dans les environnment hétérogènes, un des moyens les plus simples de partager des données est le système de fichier CIFS (plus connu sous les noms de NetBios ou SmbFS). Pour partager de *Nix vers Windows, il y a Samba, projets désormais très fiable, solide et performant. L'opération inverse peut se faire en ayant un noyau compilé pour cela, et en montant les partages réseaux. On a alors le choix d'utiliser la commande mount, ou bien de rajouter une entrée dans le fichier /etc/fstab. Voilà les syntaxes correspondant à ces deux méthodes :

Montage en ligne de commande :

#!/bin/sh
mount -t smbfs //machine_windows/data /mnt/data -o username=toto,password=tutu,workgroup=EUSKADI

Montage via /etc/fstab (remplacer "user" par "users" pour autoriser n'importe quel utilisateur à le monter/démonter, noauto permet de ne pas monter automatiquement cette partition au démarrage) :

//172.16.69.2/data /mnt/win/data smbfs rw,user,noauto,passwd=tutu,username=toto 0 0

Puis, pour le monter, on fait en ligne de commande (remplacez "/mnt/win/data" par votre point de montage):

20:50 root@iguzki ~# mount /mnt/win/data

Une méthode beaucoup plus propre et sécurisée (à savoir que plutot de mettre le login/pass dans le fstab), on peut mettre tout ca dans /etc/samba/credentials sous la forme :

username=toto
password=tutu

Et mettre dans le fstab :

//172.16.69.2/data /mnt/win/data smbfs rw,user,noauto,credentials=/etc/samba/credentials 0 0

Pensez bien à restreindre les droits sur /etc/samba/credentials !

Merci à Romain Joly [FR] et Mathieu Lesniak [FR]


Comment savoir quel utilisateur et processus utilise une ressource précise


Il est possible d'utiliser la commande lsof [EN], mais c'est loin d'être évident, le nombre de descripteurs ouverts sur un système est très important, voyons la sortie juste pour voir les fichiers liés à l'exécution de cette commande elle même (lsof crée une sortie vers STDERR donc pour pouvoir greper la sortie sur STDOUT, il faut rediriger la sortie d'erreur, soit 2, vers la sortie standard, soit 1) :

0:08 root@iguzki ~# lsof 2>&1 | grep lsof
lsof      20119    root  cwd    DIR       3,13      3784          3 /home/xarli
lsof      20119    root  rtd    DIR        3,6       664          2 /
lsof      20119    root  txt    REG        3,9    115192     160173 /usr/bin/lsof
lsof      20119    root  mem    REG        3,9   2259040       1670 /usr/lib/locale/locale-archive
lsof      20119    root  mem    REG        3,6     91000       9135 /lib/ld-2.3.2.so
lsof      20119    root  mem    REG        3,6   1273980       9158 /lib/tls/i686/cmov/libc-2.3.2.so
lsof      20119    root    0u   CHR     136,12                  270 /dev/pts/268
lsof      20119    root    1w  FIFO        0,7             28337995 pipe
lsof      20119    root    2w  FIFO        0,7             28337995 pipe
lsof      20119    root    3r   DIR        0,3         0          1 /proc
lsof      20119    root    4r   DIR        0,3         0 1318518793 /proc/20119/fd
lsof      20119    root    5w  FIFO        0,7             28338001 pipe
lsof      20119    root    6r  FIFO        0,7             28338002 pipe
lsof      20120    root  cwd    DIR       3,13      3784          3 /home/xarli
lsof      20120    root  rtd    DIR        3,6       664          2 /
lsof      20120    root  txt    REG        3,9    115192     160173 /usr/bin/lsof
lsof      20120    root  mem    REG        3,9   2259040       1670 /usr/lib/locale/locale-archive
lsof      20120    root  mem    REG        3,6     91000       9135 /lib/ld-2.3.2.so
lsof      20120    root  mem    REG        3,6   1273980       9158 /lib/tls/i686/cmov/libc-2.3.2.so
lsof      20120    root    4r  FIFO        0,7             28338001 pipe
lsof      20120    root    7w  FIFO        0,7             28338002 pipe
0:08 root@iguzki ~#

C'est vraiment loin d'être pratique, mais heureusement j'ai une autre commande beaucoup plus adaptée à vous proposer. La commande fuser [EN] vous permet de savoir quel processus et donc quel utilisateur utilise une ressource à un moment donné. Cette ressource peut être un socket, un fichier, un point de montage, bref à peu près tout. C'est très utile, lorsqu'on n'arrive pas à démonter un point de montage, quand on ne peut pas effacer un répertoire, et dans beaucoup d'autres cas où une situation bloquante peut arriver.

Par exemple, déterminons qui utilise la console 13 et ce qu'il y fait :

0:12 root@iguzki ~# fuser -v /dev/pts/13
                     USER        PID ACCESS COMMAND
/dev/pts/13          root       2592 f....  zsh
                     root       2600 f....  fuser
0:12 root@iguzki ~#

Et maintenant qui utilise le port TCP 22 :

0:15 root@iguzki ~# fuser -v -n tcp 22
here: 22
                     USER        PID ACCESS COMMAND
22/tcp               root        958 f....  sshd
0:15 root@iguzki ~#

On voit que c'est SSH, lancé par root, avec le PID 958.

Bref, une commande très utile et trop méconnue.


Permettre à une audience de suivre ce que vous faites dans votre Shell


Pour permettre à un public de suivre ce que vous faîtes en shell, on peut utiliser la comande tee, qui crée une flux vers le fichier spécifié et laisse malgré tout les sorties standard. On va donc invoquer un shell interactif (option "-i" pour bash), en mode verbeux (option bash "-v"), rediriger le flux d'erreur vers le flux standard (sortie STDERR, soit 2, vers la sortie STDOUT, soit 1).

Donc le démonstrateur fera :

23:11 xarli@iguzki ~% bash -iv 2>&1 | tee /tmp/session_shell
xarli@iguzki:~$

Et l'auditoire devra afficher en continue ce fichier, qui contiendra les entrées et les sorties du fichier /tmp/session_shell :

23:12 operator@iguzki ~% tail -f /tmp/session_shell

Chaque personne de l'auditoire verra alors en temps réel tout ce que tape le démonstrateur, ainsi que toutes les sorties d'erreur comme normales.

Vous pouvez aussi systématiser cette écoute, en remplaçant les shell de vos utilisateurs par cette commande, en dirigeant le tee dans un fichier un $USER$$, de manière à avoir un fichier par utilisateur et par session.


Recupérer la main sur un serveur PostGreSQL


On va encore outrepasser les droits, en faisant en sorte que la base n'effectue aucune authentification des utilisateurs. On va pour cela éditer fichier de configuration das listes d'accès : pg_hba.conf. On va rajouter la ligne suivante (ou modifier une ligne déjà existante pour "local") :

# On autorise l'accès à n'importe quel utilisateur sur n'importe quelle base via les sockets Unix, sans mot de passe
local    all    trust

/!\ ATTENTION : n'importe qui avec un accès local va pouvoir prendre possession de vos bases de données, et faire n'importe quoi avec, je vous conseille d'arrêter vos services Web, de faire se déconnecter tous les utilisateurs locaux, et d'empêcher ces derniers de se reconnecter le temps de faire vos manipulations.


On fait prendre en compte la modification effectuée, en envoyant un signal HUP au démon PostGreSQL. (killall -HUP pgsql). Dès lors, il est parfaitement possible de se connecter à la base avec le super utilisateur de celle-ci (postgres) sans qu'aucun mot de passe ne vous soit demandé, et de changer son propre mot de passe :

00:02 xarli@iguzki % psql -U postgres template1

Welcome to the POSTGRESQL interactive sql monitor:
  Please read the file COPYRIGHT for copyright terms of POSTGRESQL

   type \? for help on slash commands
   type \q to quit
   type \g or terminate with semicolon to execute query
 You are currently connected to the database: template1

template1=> ALTER USER postgres WITH PASSWORD 'mon_nouveau_mot_de_passe_que_je_vais_bien_noter';

Remplacez bien sûr mon_nouveau_mot_de_passe_que_je_vais_bien_noter par le mot de passe que vous désirez affecter à votre super-utilisateur, et que vous allez bien retenir cette fois ci. ;)


Il ne vous reste alors plus qu'à remettre votre fichier de configuration des autorisations d'accès comme il était à l'origine, et de renvoyer un signal HUP à votre démon PostGreSQL.


Désinstaller un paquet RPM en recréant le paquet


Je travaille régulièrement sous Red Hat GNU/Linux, ce qui m'amène à utiliser les paquets RPM (ce que je déplore, mais bon). Et quand on supprime un paquet, il peut être utile de se garder un moyen d'annuler cette suppression. C'est possible, grâce à l'option "--repackage" de l'outil RPM. Cela va vous recréer un paquet à partir des fichiers supprimés du système de fichiers. Par contre, il ne va pas reprendre les éventuelsscripts d'installation, donc ne pensez surtout pas à cette commande pour déployer un paquet, mieux vaut vous procurer le paquet initial. Par contre son intérêt vient de son utilisation pour avoir une copie de sauvegarde d'un logiciel sur une machine déjà installée en recréant un paquet de manière partielle mais suffisante pour assurer la bonne cohésion du logiciel, qui pourra être redéployé sur cette même machine, pour revenir d'une désinstallation qui s'est mal passée ou avec des effets de bord facheux.

Bref, une fonctionnalité intéressante pour tout administrateur système subissant le système RPM.

Son utilité est discutée ici [EN].


Recréer un paquet .deb que l'on n'a plus


Il peut être utile de recréer un paquet installé sur une machine Debian GNU/Linux [AUTO], quand on ne l'a plus. Par exemple, lors de l'upgrade d'un paquet sensible, il peut être utile de se laisser une porte de sortie pour réinstaller la version précédente en cas de problème avec la nouvelle version du logiciel. Attention toutefois, les fichiers de configuration mis dans le paquet sont ceux en production, donc ils peuvent contenir des mots de passe, et autres information particulières, donc il ne faut pas les traiter comme des paquets d'origine, redistribuables à n'importe qui. La commande pour réaliser un re-packaging est :

23:45 root@iguzki ~# fakeroot -u dpkg-repack paquet

Par la suite, il est simple de réinstaller le paquetage avec la commande dpkg.


Vérifier l'intégrité d'une base de données MySQL


Il peut être utile de vérifier l'état d'une base MySQL, après un crash complet de la machine par exemple, sans arrêt propre du service ou même synchronisation des systèmes de fichiers par flush des journaux. Une commande fournie avec les clients MySQL sert justement à réparer, optimiser, et surtout détecter une incohérence ou un problème au niveau d'une des tables de la base de données. Ainsi, la commande suivante va chercher des incohérence sur toutes les tables, et automatiquement tenter de réparer les éventuelles erreurs :

22:03 root@iguzki ~# mysqlcheck --all-databases --auto-repair --verbose -p

Attention, il faut bien entendu rentrer son mot de passe.

Il est aussi possible d'intégrer cette commande au script de démarrage du démon MySQL, ce qui permet de vérifier automatiquement à chaque lancement l'intégrité de la base de données.


Retomber sur la ligne de la dernière fermeture d'un fichier sous VIM


Encore une astuce indispensable pour ceux qui utilisent VIM, cette fois ci honteusement repompée des astuces de DLFP [FR].

Quand on édite un fichier, combien de fois en réouvrant le même fichier ne s'est-on pas dit qu'il serait fort pratique de retomber sur la ligne à laquelle on se trouvait lors de la dernière fermeture, pour éviter d'avoir à rechercher (même en notant ou en mémorisant le numéro de la ligne, ce n'est pas forcément évident). Et bien, le simple fait de rajouter ces quelques lignes à votre vimrc vous permettront de réaliser cette opération fort simple (la première ligne est un commentaire, donc à zapper si vous le voulez):

" Pour retomber sur la même ligne que lors de la dernière fermeture d'un fichier
autocmd BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \   exe "normal g`\"" |
    \ endif

Vous pouvez soit les rajouter dans votre fichier vimrc personnel, soit demander à l'administrateur système de votre babasse de le rajouter au fichier global (dans /etc ou dans /etc/vim sous Debian [FR] par exemple).


Activer la version 1 du protocole SSH sous OpenSSH


Sous Debian [AUTO], Woody ou posttérieure, l'installeur vous pose une question à propos d'OpenSSH [EN], qui est de savoir si vous désirez seulement la version 2 du protocole SSH. Si vous répondez par l'afirmative, alors le fichier de configuration forcera la version 2 du protocole, et aucune clé SSHv1 ne sera générée. Si, pour une raison quelconque vous avez par la suite besoin d'activer la prise en charge de la vieille version du protocole, alors rajouter la version 1 dans le fichier de configuration (/etc/ssh/sshd_config) n'est pas suffisant, car il manque la clé correspondante.

Attention, cette manipulation n'est pas recommandée, et ne devrait etre réalisée qu'en cas de réelle nécessité (par exemple si des outils ne maitrisant pas la nouvelle version du protocole doivent se connecter, comme des outils de monitoring hors d'age par exemple).

Pour pouvoir le faire, il faut alors tout d'abord générer une clé :

2:31 xarli@tiki ~% sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key_v1 -N '' -t rsa1

Puis, on rajoute la définition de cette clé dans le fichier de configuration du démon SSH :

HostKey /etc/ssh/ssh_host_rsa_key_v1

On modifie la ligne suivante, qui défini quels protocoles doivent etre gérés, et dans quel ordre :

Protocol 2

On va rajouter le protocole 1, si le protocole v2 n'est pas géré par le client, pour obtenir la ligne suivante :

Protocol 2,1

Et enfin, on relance le démon SSH, qui sera dès lors disposé à utiliser le vieux protocole :

2:31 xarli@tiki ~% sudo /etc/init.d/ssh restart

Et voilà, c'est tout bon. Cette astuce devrait aussi marcher sous d'autres distributions, d'expérience au moins RedHat [EN], ne soyons pas sectaires.


Bloquer le Referers Spam dans Awstats


Si comme moi vous utilisez le formidable Awstats [EN] et vous trouvez confrontés aux problèmes très polluant des référants à la con (referers en anglais), alors vous pourrez tirer bénéfice d'un système de nettoyage de ceux-ci à la génération des statistiques. Ce patch est disponible sur GroovyMother.com [EN]. Très simple, il se contente de comparer vos référants avec une liste noire que vous pourrez maintenir à jour vous meme ou bien en automatiser la récupération sur ce site [EN]. Attention, il ne corrigera pas les statistiques déjà digérées par Awstats [EN]. Il est adapté aux versions 6.2, 6.3 (stable), et 6.4 (développement, version du 2005-02-10).

Attention, le temps de génération est logiquement démultiplié par cette modification.

Voilà un petit mode d'emploi :

  1. Récupérez le patch sur la page de téléchargement de celui ci sur SourceForge [EN]
  2. Placez le à la racine de votre répertoire Awstats [EN], ainsi que vous meme.
  3. Appliquez le :
    patch < lenomdevotrepatch
  4. Ajoutez la ligne suivante dans votre fichier /etc/crontab (remplacez www-data par l'utilisateur qui fait tourner Awstats [EN], et modifier l'horaire en fonction de vos besoins) :
    1 * * * * www-data      cd /tmp && rm -f /tmp/blacklist.txt && /usr/bin/wget --quiet http://www.jayallen.org/comment_spam/blacklist.txt
  5. Ajoutez la ligne suivante dans le ou les fichiers de configuration Awstats [EN] :
    RefererBlacklist="/tmp/blacklist.txt"
  6. Regénérez vos statistiques (encore une fois, cela n'aura d'effet que sur les requetes à venir).
  7. Appréciez d'enfin pouvoir analyser vos statistiques avec un niveau bruit/signal quasiment nul!




XHTML 1.0 transitionnel valide!
CSS valide!
Propulsé par Apache!
Propulsé par Debian Gnu/Linux!
Fait avec VI