Circum Blog

Circum Net – IT – Conseils pratiques

Apache et les fichiers htaccess

Systèmes

Le serveur web Apache permet d’ajouter des directives de configuration répertoire par répertoire en les précisant dans de simples fichiers textes nommés ‘.htaccess’. Ceux-ci auront pour effet de modifier localement le fonctionnement du serveur Web. Il est ainsi possible d’imposer au serveur des comportements spécifiques pour le répertoire (et les sous-répertoires) dans lequel se trouve le ‘.htaccess’ sans devoir toucher au fichier de configuration central d’Apache ‘httpd.conf’.

Le domaine d’application des fichiers ‘.htaccess’ est assez vaste. A travers eux et les directives qu’ils contiennent on va pouvoir par exemple pour un site web (une portion de site web, ou un répertoire isolé) ajuster plus finement les redirections, les réécritures d’URL, les restrictions d’accès ou encore la redéfinition des messages d’erreur.

Redéfinition des messages d’erreur via un fichier ‘.htaccess’

L’erreur “404 – pas trouvé” est un message souvent rencontré par les internautes. Il est généré par le serveur lorsqu’une page inexistante est demandée. Le message est alors envoyé au client qui est à l’origine de la requête et le navigateur Web se charge de l’habiller (très sommairement).

Afin de remplacer l’interprétation standard du message ‘404’ par une page que vous pouvez contrôler, il suffit de préciser une directive dans un fichier ‘.htaccess’. Elle tient en une seule ligne et présente la syntaxe suivante:

ErrorDocument error-code filepath

Le premier élément de cette commande donne le nom de la directive utilisée, le deuxième élément fournit le code d’erreur traité et le dernier élément précise le chemin d’accès du fichier qui sera envoyé.

Contenu d’un fichier.htaccess effectuant une redéfinition d’erreur:

ErrorDocument 404 /error.html

En conséquence, la page ‘error.html’ (situé à la racine du serveuer Web) sera systématiquement envoyée dès qu’un document inxesitant aura été demandé.



Cron et la gestion de tâches automatiques

Systèmes, Unix

Sous Unix/Linux le système “cron” permet de lancer périodiquement des commandes ou processus. On s’en sert par exemple pour automatiser des sauvegardes, des transferts de fichier, des extractions de bases de données, des envois de messages…

Le logiciel qui orchestre tout cela est communément appelé “cron” (en fait le démon “crond” chargé en mémoire). Il va lancer à intervalles réguliers ou à des moments bien déterminés différentes tâches.

Les commandes que cron devra exécuter (par exemple une sauvegarde) sont précisées dans une table de référence. Celle-ci contient les informations relatives aux moments auquels il faut exécuter certaines commandes et le nom des commandes ou les chemins d’accès des scripts à exécuter. Cette table peut-être éditée avec l’utilitaire “crontab” (passage automatique via l’éditeur déterminé par la variable d’environnement VISUAL ou EDITOR – le plus souvent “vi”).

Pour mettre à jour la table de référence de cron, vous pouvez exécuter la commande suivante:

> crontab -e

L’information présentée en réponse est formatée ligne par ligne, chaque ligne reprenant la définition du moment d’exécution suivie de la commande ou du script à exécuter. En voici la structure:

minute hour day month dayofweek task

Le premier champ représente les minutes (0-59).
Le second champ représente les heures (0-23).
Le troisième champ représente les jours du mois (1-31).
Le quatrième champ représente les mois de l’année (1-12).
Le cinquième champ représente les jours de la semaine (0-6 dimanche=0).
Le sixième champ représente la commande ou le script à exécuter.
Le septième champ représente l’instruction à exécuter.

Analysons cela à travers quelques exemples:

> 15 20 * * * echo “hello” >>/tmp/log_cr.txt

(lancement de la commande echo tous les hours à 20h15)

> 50 6 1 * * /home/scripts/bck.sh

(exécution de bck.sh le premier jour de chaque mois à 6h50)

> 00 10 1-5 * * /usr/bin/hello.sh >>/dev/null

(exécution de hello.rb du 1er au 5 de chaque mois à 10h00)



Passage en minuscules des noms de fichiers

Systèmes, Unix

Il se peut que dans certaines situations (par souci de cohérence, de compatibilité…) l’on doive s’assurer de la basse casse des noms de fichiers d’un répertoire. Dans ce cas, les possibilités de scripting offertes par le shell peuvent s’avérer très utiles afin d’obtenir rapidement un conversion.

Voici, à titre d’exemple, un script de base qui permet de convertir en minuscules le nom des fichiers se trouvant dans un répertoire.

for x in *
do
mv $x `echo $x |tr ‘[:upper:]’ ‘[:lower:]’`
done

Pour exécuter ce script, il suffit, à partir d’une fenêtre terminal, de se placer dans le répertoire à traiter (cd) et de taper les lignes de codes présentées ci-dessus. Après avoir fourni l’instruction ‘done’, la conversion sera opérée.

Description des composants du script

– Une boucle ‘for’ prenant en compte tous les fichiers (*) du répertoire courant. A chaque passage dans la boucle le nom d’un fichier est stocké dans la variable ‘x’.

– Une instruction ‘mv’ qui renomme les fichiers. Cette commande prend 2 arguments: le premier étant le nom initial du fichier en cours de traitement (représenté par l’appel à la variable ‘x’) et le second étant le nouveau nom en minuscules (`echo…`).

– Une instruction qui donne le nom en minuscules du fichier. Celle-ci est encadrée par des backquotes (`) qui donne lieu à son évaluation. Elle utilise la commande ‘echo’ qui envoie le nom du fichier (c’est-à-dire la variable ‘x’) via l’opérateur de redirection d’input ‘|’ à la commande ‘tr’ qui effectue elle la traduction en minuscules.



Le Shell Script

Unix

Un ‘shell script’ est un fichier contenant une séquence de commandes destinées à être exécutées par le shell de la machine hôte (c’est-à-dire l’interpréteur de commandes standard de votre machine Unix/Linux).
Si les interfaces graphiques sont de plus en plus utilisées pour dialoguer avec des systèmes Unix/Linux, le travail en mode commandes est incontournable. En effet, celui-ci reste pour l’utilisateur de tels systèmes un outil puissant et d’une grande souplesse.

Dans ce cadre, le Shell peut, lorqu’il est utilisé dans le sens d’un langage de programmation, vous permettre d’automatiser de nombreuses tâches, d’optimiser l’administration du système et d’écrire de petits utilitaires souvent précieux en termes de gestion et de maintenance.

Les scripts shell sont parfois comparés aux fichiers ‘batch’ du système MS-DOS, même si ces derniers sont nettement moins puissants.

En pratique

Un simple éditeur de texte permet de créer, d’éditer et de sauvegarder les scripts. L’essentiel du travail consiste en effet à écrire les lignes de codes à l’aide d’un outil du style ‘vi’ ou ‘gedit’ et d’enregistrer le tout sur disque.

Exemple: ‘test.sh’

#! /bin/sh
echo “Ceci est un test”
# la commande qui suit va lister le contenu du répertoire
ls -la

La première ligne de ce script précise quel sera le type de shell utilisé pour l’interprétation des commandes (dans ce cas-ci ce sera ‘sh’).
La commande ‘echo’ envoi une chaîne de caractères sur la sortie standard et la commande ‘ls’ liste le contenu d’un répertoire.

Contenu d’un script
———————-
Un ‘shell script’ peut être vu comme une suite de commandes rassemblées dans un fichier texte. Chaque ligne de ce fichier équivaut à une commande qui aurait pu être lancée “interactivement” par un utilisateur.

Lors de son exécution, le script va être lu par un interpréteur; ce dernier va analyser et exécuter les commandes que contient le fichier. L’interpréteur sollicité sera un des shells Unix (sh, csh, ksh, bash et tcsh).

Enregistrement d’un script
——————————
Le nom d’un shell-script lors de la sauvegarde sur disque peut être quelconque mais le choix se porte généralement sur soit “mon_script” (sans extension), pour que son nom s’apparente à celui d’une commande Unix classique, soit “mon_script.sh” (ou “mon_script.csh” s’il était écrit en C-shell), pour indiquer clairement qu’il s’agit d’un shell script.

Exécution d’un script
————————
Un ‘shell script’ peut être exécuté de la même façon que l’on lance un programme.
Il y a pour cela deux possibilités:

– soit en exécutant la commande ‘bash’ (sh, csh ou tcsh en fonction du type de shell que vous voulez utiliser) avec pour argument le nom du fichier ‘shell script’:
bash test.sh

– soit en rendant le fichier ‘shell script’ exécutable (x) et en utilisant son nom comme commande:
chmod u+x test.sh
./test.sh



Afficher le contenu de fichiers

Systèmes, Unix

Que l’on soit débutant, simple uitilisateur, administrateur ou développeur sous Unix/Linux, il arrivera immanquablement que l’on ait besoin d’obtenir (à partir du Shell) un aperçu du contenu d’un fichier. Heureusement, différentes instructions de base permettent de rapidement visualiser le contenu d’un fichier.

Lancés dans une fenêtre ‘terminal’, les outils ‘cat’, ‘more’, ‘tail’ et ‘head’ donneront en effet une idée du contenu d’un ou plusieurs fichiers:

– ‘cat’ affiche le contenu d’un fichier;
– ‘more’ affiche le contenu d’un fichier page par page;
– ‘head’ affiche les 10 premières lignes d’un fichier;
– ‘tail’ affiche les 10 dernières lignes d’un fichier.

Voici quelques exemples d’utilisation:

cat security.txt

Le contenu du fichier ‘security’ est affiché à l’écran.

cat security.txt virus.txt

Le contenu des fichiers ‘security’ et ‘virus.txt’ est concaténé et affiché à l’écran.

more security.txt

Le contenu du fichier ‘security’ est affiché page par page à l’écran. Pour passer d’une page à l’autre, il suffit de taper sur la barre d’espacement.

header security.txt

Par défaut, les 10 premières lignes du fichier ‘security’ sont affichées à l’écran.

header -n 20 security.txt

L’option ‘n’ permet de préciser un nombre particulier de lignes à afficher à l’écran.

tail security.txt

Par défaut, les 10 dernières lignes du fichier ‘security’ sont affichées à l’écran.

tail -n 20 security.txt

L’option ‘n’ permet de préciser un nombre particulier de lignes à afficher à l’écran.

tail -f security.txt

L’option ‘f’ fait en sorte que l’affichage des dernières lignes soit rafraîchi à chaque mise à jour du fichier. Cel revient à voir en temps réel toutes les modifications qui sont effectuées sur le fichier.



Transformation XSLT avec Python sous MacOSX

MacOSX, Programmation, Python, XML, XSLT

Pour obtenir une transformation d’un document XML source via une feuille de style XSLT, nous aurons ici recours aux librairies libxml et libxslt. Celle-ci ont en effet été déclinées pour pouvoir travailler avec Python.

Prérequis :
– MacOSX 10.3 ou supérieur
– Python préinstallé ou MacPython

Première étape : installation de libxml

La bibliothèque libxml fournit aux programmes les fonctions permettant le décodage/parcours des fichiers au format XML. Après l’avoir téléchargée, on l’installe en lançant les commandes suivantes:

Version de la bibliothèque utilisée : 2.7.0

./configure –prefix=/usr/local/libxml2-2.7.0
make
sudo make install

Deuxième étape : installation de libxslt

La bibliothèque libxslt étend la bibliothèque libxml en lui ajoutant le support des feuilles de styles XSLT. Après l’avoir téléchargée, on l’installe en lançant les commandes suivantes:

Version de la bibliothèque utilisée : 1.1.24

./configure –prefix=/usr/local/libxslt-1.1.24 –with-libxml-prefix=/usr/local/libxml2-2.7.0
make
sudo make install

Troisième étape : liaison python/libxml/libxslt

Pour lier Python aux deux bibliothèques XML précédemment installées, on va utiliser des liens symboliques à partir du répertoire de gestion d’extensions de Python : site-packages. Ce répertoire est en effet destiné à recevoir les modules supplémentaires installés par l’utilisateur.

Version de Pyhton utilisée : 2.5

Il faut d’abord repérer le chemin d’accès du répertoire “site-packages”. Si vous utilisez le moteur Python préinstallé de MacOSX, vous le trouverez à l’endroit suivant :

/Library/Python/2.5/site-packages/

Si vous avez installé MacPython, vous le trouverez à l’endroit suivant :

/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages

Une fois repéré, vous vous placer dans le répertoire site-packages:

cd /Library/Python/2.5/site-packages/
 
ou
 
cd /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/
site-packages

Puis vous créez les liens symboliques vers les bibliothèques libxml et libxslt:

sudo ln -s /usr/local/libxml2-2.7.0/lib/python2.5/site-packages/* .
 
et
 
sudo ln -s /usr/local/libxslt-1.1.24/lib/python2.5/site-packages/* .

Quatrième étape : tester une transformation XSLT

Pour boucler la procédure, il nous reste à tester un script Python exécutant une transformation d’un document XML via une feuille de style XSLT. En voici un exemple.

#!/usr/bin/python
import libxml2
import libxslt
 
xsltdoc = libxml2.parseFile("test.xsl")
style = libxslt.parseStylesheetDoc(xsltdoc)
xmldoc = libxml2.parseFile("test.xml")
result = style.applyStylesheet(xmldoc, None)
style.saveResultToFilename("dump.txt", result, 0)
style.freeStylesheet()
xmldoc.freeDoc()
result.freeDoc()


Find ou le Sherlock Unix

Systèmes, Unix

La commande find permet de retrouver des fichiers à partir de certains critères.

Concrètement, la commande ‘find’ scane un répertoire donné (et les elements qu’il contient) à la recherche de fichiers qui satisfont certains critères. Parmi ceux-ci, le nom, la taille, le propriétaire, le mode ou encore la date de dernière modification peuvent être testés. Lorsqu’un fichier cadre avec les critères précisés ‘find’ peut lui associer une action.

La commande ‘find’ à la structure suivante:

> find [directory] [search expression] [actions]

L’instruction ci-dessous aura par exemple pour effet de chercher un fichier dont le nom correspond à la chaîne de caractères ‘project’ à partir du répertoire ‘/usr’ et, si le résultat est positif, d’imprimer sur la sortie standard le chemin d’accès du fichier concerné.

> find /usr -name project -print

L’instruction ci-dessous recherchera, elle, les fichiers dont le nom se termine par la chaîne de caractères ‘.jpg’ à partir du répertoire courant et, si le résultat est positif, affichera sur la sortie standard le chemin d’accès des fichiers concernés.

> find. -name ‘*.jpg’ -print

Les principaux critères de recherche possibles pour la commande ‘find’:

-name [filename]
recherche sur le nom du fichier

-perm [mode]
recherche sur les droits d’accès

-user [username]
recherche sur le propriétaire

-group [groupname]
recherche sur le groupe

-size [value][c]
recherche sur la taille en nombre de blocs (un bloc représentant 512 bytes ou 1/2 kb – si la lettre c est précisée, le calcul se fait sur le nombre de caractères)

-atime [value]
recherche par date de dernier accès (value représentant ici le nombre de jours depuis le dernier accès)

-mtime [value]
recherche par date de dernière modification (value représentant le nombre de jours depuis là denière modification)

-ctime [value]
recherche par date de création (value représentant le nombre de jours depuis la création)

Ces critères de recherche peuvent être combinés entre eux grâce aux opérateurs -a (ET) et -o (OU inclusif).

Exemples d’instructions de recherche

> find / -name Article1 -type f -print
Cette instruction recherche, à partir de la racine du système, le fichier nommé ‘Article1’. Si ce fichier est trouvé, son chemin d’accès sera affiché sur la sortie standard.

> find / -name Article1 -type f -exec chmod 755 {} ;
Cette instruction recherche, à partir de la racine du système, le fichier nommé ‘Article1’. Si ce fichier est trouvé, ses permissions sont modifiées (mode 755 c’est-à-dire: rwxr-xr-x). La paire d’accolade ‘{}’ implique une substitution du nom du fichier en traitement et la suite de caractères ‘;’ indique que la commande exec est clôturée.

> find. -name ‘[A-Z]*[0-9]’ -type f -print
Cette instruction recherche, à partir du répertoire courant, tous les fichiers dont le nom commence par une lettre majuscule et se termine par un chiffre.

> find /users -size +100000c -atime +7
Cette instruction recherche, à partir du répertoire ‘/users’, tous les fichiers dont la taille est supérieur à 100.000 caractères et qui n’ont pas été modifiés depuis plus de 7 jours.

> find. ( -name ‘*.log’ -a -mtime +7 ) -exec rm -f {} ;
Cette instruction recherche, à partir du répertoire courant, tous les fichiers dont le nom se termine par ‘.log’ et qui n’ont pas été modifiés depuis plus de 7 jours. Les fichiers qui sont trouvés seront effacés tel que précisé dans la commande -exec.
Dans cette instruction, les paranthèses délimitent l’expression de recherche et l’opérateur ‘-a’ combine les deux critères fournis (-name et -mtime) selon un ‘ET’ logique.



History et ses raccourcis

Systèmes, Unix

Dans le shell (c’est-à-dire quand vous êtes en mode ligne de commande), l’instruction history permet d’afficher une liste des commandes shell précédemment exécutées.

La syntaxe de la commande ‘history’ est la suivante :

> history [-nb lines]

Le nombre de commandes affichées par défaut par history va dépendre du shell que vous utilisez (bash, tcsh, sh …). Ce nombre peut de toute façon être modifié en fournissant le paramètre du nombre de lignes en argument.

history 5
affichera les cinq dernières commandes comme présentées ci-dessous : 

507 ls
508 ls -la
509 top
510 df -k
511 history 5

history 20
affichera les vingt dernières commandes

history 30
affichera les trente dernières commandes

Si le nombre de commandes à lister est élevé, il sera préférable d’utiliser un pipe vers less pour en faciliter l’affichage et la lecture ( ex: history 200 | less).

 
Les commandes fournies en résultat sont préfixées d’un numéro qui correspond à la position de ces commandes dans l’history. Pour rappeler une commande particulière, il suffit de taper un point d’exclamation (‘!’) suivi du numéro approprié. Par contre, afin de relancer la toute dernière commande exécutée au prompt UNIX, il faut juste taper deux points d’exclamation (‘!!’). Exemples:

Par rapport à la liste suivante fournie par history
12 ls -la    

pour obtenir la commande indicée 12, on tapera :
> !12

pour obtenir la commande indicée 20, on tapera :
> !20

et pour lancer la dernière commande exécutée, on tapera :
> !!



Man à propos

Systèmes, Unix

Les sytsèmes d’exploitation à base Unix proposent pour la plupart un manuel d’aide électronique qui s’obtient en tapant la commande “man”.

Ce manuel reprend les principales commandes Unix et les explicite à travers différentes rubriques comme la description, le synopsis, l’environnement, les exemples, la compatibilité, les commentaires… La syntaxe de la commande ‘man’ est précisée ci-dessous:

man [options] command

En réponse à l’invocation de cette instruction vous obtiendrez une page d’information concernant le sujet souhaité. Attention, cette page ne doit pas être vue comme un tutoriel ou un cours mais bien plutôt comme une fiche de référence. D’ailleurs, vous le constaterez rapidement, les explications fournies via ce système, même si elles sont très complètes, sont également souvent obscures pour les utilisateurs débutants. De plus, il ne faut pas s’attendre à une mise en page sophistiquée, en effet les ‘manpages’ se présentent comme des fichiers textes sans images, sans couleurs, sans liens.

Par exemple, la commande: > man ls    

permet d’obtenir la documentation en ligne sur l’utilitaire ‘ls’. La réponse ressemblera à ce qui suit:

LS(1) BSD General Commands Manual LS(1)

NAME
ls – list directory contents

SYNOPSIS
ls [-ABCFGHLPRTWZabcdfghiklmnopqrstuwx1] [file…]

DESCRIPTION
For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information. For each operand that names a file of type directory, ls displays the names of files contained within that directory, as well as any requested, associated information.

Parcourir une page de man

Pour naviguer dans une page servie par la commande man, vous pouvez utiliser les flèches vers le haut et vers le bas, la barre d’espacement ou les touches ‘page down’ et ‘page up’ de votre clavier. Pour quitter une page, il faut utiliser la touche ‘q’ ou appuyer sur la barre d’espacement jusqu’à ce que la fin de la page soit atteinte.