English version

Page Unix de Vincent Lefèvre

Quelques-uns de mes utilitaires pour Unix

Ces utilitaires sont libres. Vérifiez la licence dans chacun d'eux. Il n'y a aucune garantie, et utilisez-les à vos propres risques.

check-eth-speed

Script shell pour obtenir et/ou vérifier la vitesse Ethernet, en particulier utile pour vérifier par cron que la vitesse Ethernet n'a pas été réduite (par exemple à cause de la poussière ou d'un mauvais câble).

dlogin

Script Zsh permettant de se connecter sur une machine distante par le protocole rlogin et de positionner la variable DISPLAY correctement. Le .zshenv, .cshrc ou fichier équivalent sur la machine distante doit être modifié en conséquence. Ce script peut maintenant être utilisé comme fonction autoloadée.

Note: pour des raisons de sécurité, le protocole SSH (commande ssh ou slogin) doit maintenant être utilisé à la place de rlogin; je laisse tout de même le lien, car dlogin peut servir d'exemple simple de script Zsh.

dobatches

Script Perl exécutant des batches dans répertoire partagé. J'ai écrit ce programme comme remplacement très simple et limité de la commande qsub. Exemple d'utilisation:

$ dobatches 'batch-.*' arg1 arg2 arg3

Comme vous pouvez le voir, le premier argument de dobatches est une expression rationnelle, pas un motif de fichier (i.e., écrivez .* à la place de *).

eet

Script Perl permettant un filtrage avancé de flux et des redirections vers plusieurs fichiers. Fournis dans l'archive: un filtre pour coloriser la sortie de make, et des scripts shell pour envoyer les warnings dans une fenêtre xterm ou zenity.

efing

Script Perl donnant des informations sur des utilisateurs locaux. Je l'ai écrit parce que la commande finger (sous Solaris) était trop lente et buggée; j'en ai profité pour donner quelques informations supplémentaires. Ce script a d'abord été écrit pour Solaris et NIS+, puis modifié pour fonctionner sous certaines versions de Linux et OSF1; il ne marchera pas sur certains systèmes. Page man pour efing (au format nroff).

fwdmail

Script Perl faisant suivre des messages e-mail par SMTP à une adresse donnée. Il n'utilise pas le client SMTP local (généralement invoqué comme sendmail), de manière à ne pas passer par la queue locale (ceci est utile lorsqu'elle est pleine de mailer-daemons dûs à certaines attaques de spam). Une documentation au format POD est incluse dans le script.

[Mise à jour du 2012-07-17] Les fichiers de mail plus gros qu'une certaine taille peuvent être ignorés (et gardés dans la queue). Cette option est utile quand le courrier est reçu sur un portable temporairement connecté par RTC ou GPRS/3G.

gccheaders

Fonction/script Zsh qui affiche tous les fichiers d'en-tête inclus par gcc. Voir la page dédiée à gccheaders.

idle

Script Perl affichant les temps d'inactivité pour kbd, mouse, les tty et les pts (pseudo-ttys). Ce programme peut ne pas fonctionner correctement sur tous les systèmes. Il a cependant été testé sur certaines versions de Solaris, Linux, OSF et Mac OS X. Page man pour idle (au format nroff).

Mis à jour le 23 avril 2006.

idlexec

Script Perl permettant d'arrêter temporairement et automatiquement des processus de calcul tournant sur des machines de bureau, lorsque quelqu'un utilise une machine. En effet, certaines machines font énormément de bruit lorsque leur processeur est actif. Cet utilitaire est capable de prendre en compte le fait qu'il peut y avoir plusieurs machines par pièce. Voir la page dédiée à idlexec.

Script Perl pour créer ou mettre à jour des liens symboliques vers des bibliothèques statiques. Ce script peut être utile pour compiler et linker des programmes qui ne fournissent pas de script configure, seulement un fichier Makefile, et doivent linker avec des bibliothèques statiques (pour des raisons d'efficacité), e.g. BaCSeL. La raison est que pour la compilation et une édition de liens conventionnelle, on peut utiliser des variables d'environnement, comme C_INCLUDE_PATH, LIBRARY_PATH et LD_LIBRARY_PATH, mais quand on veut linker avec une bibliothèque statique, on doit soit fournir le chemin complet du fichier bibliothèque, soit utiliser des options du compilateur non standard dans le Makefile, i.e. qui peuvent ne pas fonctionner sur certaines plateformes. Ce script rend la première méthode (celle recommandée) un peu plus facile.

Exemple avec BaCSeL:

$ ./liblinks lib libgmp.a libmpfr.a
$ make GMP=. DEFS="-DUSE_DPE -DZUSE_MPZ -DVBSE -DAUTOMATIC"
makefilter

Script Perl colorisant la sortie de la commande make. Si votre shell est zsh, vous pouvez l'utiliser automatiquement en ajoutant la ligne suivante à votre .zshrc:

make()
{
  local -a pstatus
  command make "$@" |& makefilter
  pstatus=($pipestatus)
  # If make has failed, return its exit status.
  [[ $pstatus[1] -eq 0 ]] || return $pstatus[1]
  # If eet has failed, return 125; otherwise return 0.
  [[ $pstatus[2] -eq 0 ]] || return 125
}

Attention si vous voulez compiler un noyau Linux! Ceci fera échouer make menuconfig avec un message d'erreur étrange (le makefile est mal conçu, AMHA).

pdfcrush

Script shell pour recompresser un fichier PDF file avec l'utilitaire ps2pdf: les fontes recompressées peuvent parfois rendre le PDF beaucoup plus petit, mais les images bitmap sont aussi recompressées, avec perte. S'il est disponible, l'utilitaire pdftk est utilisé pour restaurer les méta-informations (perdues par ps2pdf), mais attention! La version officielle pdftk 1.41 est foireuse; Debian a un patch (handle_utf8_data_in_update_info). De plus, comme le PDF est généralement un fichier généré, pdfcrush l'écrase avec la version recompressée, mais notez que dans certains cas, la version recompressée est plus grosse et/ou peut ne pas être rendue de la même façon; assurez-vous d'avoir une version de sauvegarde si besoin est. Note: idéalement, ps2pdf devrait fournir ces fonctionnalités, si bien que pdfcrush ne devrait pas exister.

pdfwdiff

Petit script Zsh pour afficher les différences à base de mots de deux fichiers PDF pour un terminal texte (avec couleurs). Il dépend des utilitaires pdftotext et wdiff

pmchecker

Script Perl vérifiant qu'un fichier procmailrc (fourni en argument ou sur l'entrée standard) est correctement formaté et ne contient pas de constructions suspectes. En cas d'échec, pmchecker termine avec un code de retour non nul et écrit un message sur le flux d'erreur standard. Ceci ne signifie pas qu'il y a réellement une erreur dans le fichier, mais on doit être un peu paranoïaque pour éviter de perdre du mail (cela m'est arrivé deux fois, avant que je n'écrive ce script). Bien sûr, pmchecker ne peut pas détecter toutes les erreurs, mais un backslash de continuation manquant ou une mauvaise utilisation d'un < ou > avant une expression rationnelle devrait être détecté en général.

Les utilisateurs qui gèrent leurs fichiers procmailrc avec Subversion devraient être intéressés par l'utilisation de ce script dans un pre-commit hook, e.g.

for i in `$SVNLOOK changed -t "$TXN" "$REPOS" | \
          sed -n 's/.* \(.*procmailrc.*\)/\1/p'`
do
  $SVNLOOK cat -t "$TXN" "$REPOS" "$i" | pmchecker || exit 1
done
ReadEncoding.pm

Module Perl permettant au serveur web Apache de lire l'encodage de documents XML, en particulier de documents XHTML, et de générer le charset associé dans les en-têtes HTTP. Testé avec Apache 1.3.26 à 1.3.29 et mod_perl 1.26 à 1.29 sous Debian GNU/Linux.

Pour utiliser ce module, vous devez modifier la configuration d'Apache (dans mon cas, le fichier /etc/apache/httpd.conf). Si ce n'est pas déjà fait, vous devez activer mod_perl en ajoutant quelque chose du style:

LoadModule perl_module /usr/lib/apache/1.3/mod_perl.so

Avec Debian, ceci est maintenant configuré avec le paquet apache. Ensuite, pour le module lui-même:

<IfModule mod_perl.c>
  PerlTaintCheck On
  <Location />
    PerlFixupHandler ReadEncoding
  </Location>
</IfModule>

Merci à Patrick pour son aide très précieuse.

rpnews

Script Perl permettant de poster des articles de news et de récupérer les nouveaux articles par Suck, pour les utilisateurs de INN. Pour utiliser ce script, il vous faut:

  • positionner la variable d'environnement ISP_NNTPSERVER au serveur de news distant (nouveau: ou donner le serveur en argument);

  • modifier les valeurs de certaines variables dans le script (les valeurs à utiliser dépendent de votre système);

  • mettre ce script en setuid et setgid news.

Note: la version actuelle a été écrite pour la distribution Debian GNU/Linux et INN 2.3.2. Les versions plus anciennes que 2006-03-10 ont des problèmes de sécurité (sur machines multi-utilisateur).

ssh-forward

Script shell qui met en place un tunnel de la machine locale A vers une machine distante B et réécrit le fichier .ssh/config sur B pour pouvoir accéder à A depuis B. Ceci est utile si, par exemple, A est un portable hébergeant certains services via SSH. Ces services seront accessibles via le même nom de machine, même si A est déplacée d'un endroit à un autre (pas besoin de modifier les URL en svn+ssh de Subversion, etc.).

Si $HOST est hostname.tld, le .ssh/config de B doit avoir:

  Host hostname.tld
    HostKeyAlias hostname.tld
    Hostname anything
    Port any-number

Lancer le script sur A avec comme arguments le nom de la machine distante (B) et le numéro du port sur B à utiliser pour le tunnel (n'importe quel port libre peut faire l'affaire). Les lignes Hostname et Port seront réécrites par le script.

sxw2txt

Convertisseur de documents texte OpenOffice / OpenDocument en texte simple, basé sur celui de Liam Morland (voir le source de ce script Perl pour les changements que j'ai faits). Le texte généré est encodé en UTF-8. Noter que ce convertisseur est très basic; de nombreuses fonctionnalités sont toujours manquantes. Pour pouvoir utiliser ce programme, vous devez avoir soit le module Perl Archive::Zip, soit la commande unzip.

Note: bien que je mentionne ce programme sur cette page, il n'est pas spécifique aux Unix (mais je ne l'ai testé sur aucun autre système).

Ce script est aussi distribué avec lesspipe de Wolfgang Friebel.

tdiff

Script Perl traitant la sortie de la commande diff, en particulier quand elle sera envoyée dans un terminal: cet utilitaire peut la coloriser et la convertir en UTF-8. Je l'ai écrit comme remplacement de colordiff de Dave Ewart. En plus de la conversion en UTF-8, le principal avantage sur colordiff (actuellement 1.0.10) est que tdiff commence à traiter le flux immédiatement (alors que colordiff a d'abord besoin que le flux soit fermé).

tps

Script Perl affichant la liste des processus sous forme d'arbre. Ce script utilise l'utilitaire ps; les options de tps commencent par le caractère :, les autres arguments étant passés à ps. Pas de fichier d'aide (tps est un vieux script qui devrait être réécrit), mais vous pouvez voir le source et des snapshots: snapshot 1, snapshot 2.

Zsh SSH Utilities

Le but de ces scripts est de ne taper la phrase de passe que lors de la première connexion SSH depuis la machine concernée. La phrase de passe ne sera pas demandée juste après votre connexion (login) sur cette machine; ainsi, si vous n'utilisez pas SSH pour cette session, vous n'aurez pas à taper votre phrase de passe. La phrase de passe sera oubliée seulement lorsque le dernier login shell zsh terminera.

Utilitaires pour svn

Voici mes utilitaires spécifiquement écrits en relation avec le client Subversion svn.

ext-diff

Script Zsh à utiliser comme commande diff externe pour svn diff. Le but de ce script est de transformer des fichiers binaires de certains types (PDF, bases de données SQLite, etc.) en fichiers texte pour qu'ils puissent être diff'és. Pour cette raison, l'option --force pour svn diff doit être utilisée, et un usage typique est: svn diff --force --diff-cmd ext-diff autres arguments.

svncdiff

Wrapper pour svn diff utilisant mes utilitaires ext-diff et tdiff. On peut aussi demander n lignes de contexte avec une option -n (voir le fichier source pour les détails).

svneditor

Wrapper pour l'éditeur du client Subversion svn, dont le but est de supprimer les espaces en fin de ligne et les fins de ligne à la fin des messages de log.

svnwrapper.zsh / ancien svnwrapper.sh

Wrapper pour la commande svn. Vous pouvez utiliser ce wrapper avec un alias shell, comme:

alias svn='svnwrapper'

La version zsh du wrapper fournit deux fonctionnalités:

  • Avec Subversion 1.6 et versions antérieures, on évite les messages d'erreur Broken pipe quand la sortie de svn est passée par pipe à une autre commande (comme less). Si votre système est dans une autre langue que l'anglais, il vous faudra changer la détection du message d'erreur dans ce script.

  • Avec Subversion 1.7 et versions ultérieures, on effectue une résolution standard de chemins sur les arguments qui ressemblent à des chemins réels (le piquet de révision doit être vide). Simplement, si l'un des composants (sauf le dernier) d'un chemin est un lien symbolique vers un répertoire (non racine) de la copie de travail, la commande suivra ce lien, contrairement à la commande officielle. C'est ce que faisaient Subversion 1.6 et versions antérieures, mais de manière incohérente.

L'ancienne version fournit seulement la première fonctionnalité. Elle est écrite en shell POSIX, si bien qu'elle ne nécessite pas que zsh soit installé, mais elle n'affiche pas les prompts à cause du bug des prompts de svn. De plus, pour obtenir un code de sortie correct, elle suppose que la partie droite d'un pipe est le processus parent.

swdiff

Simple wrapper de GNU wdiff pour utilisation avec la commande svn (client Subversion), e.g.

svn diff --diff-cmd swdiff autres-arguments

ou avec un alias shell:

alias swd='svn diff --diff-cmd swdiff'

Note: alternativement, la sortie de svn diff peut être envoyée par pipe dans wdiff -d, sans avoir besoin de ce wrapper.



webmaster@vinc17.org