xinetd ou la création de service facile

Tags:: linux :: bash

Création d'un serveur avec xinetd

Je vous ai présenté "nc" (netcat) qui permettait, non sans mal, de créer un serveur en bash, en perl, etc... La problématique était simplement de pouvoir créer un petit serveur sans avoir à manipuler les sockets. C'était sans compter sur "xinetd", disponible sur toutes les distributions Linux. Ce serveur est un "super démon" (super deamon) qui va vous permettre d'ouvrir un port et de coder un service avec simplicité.

xinetd ne permet pas seulement de créer un service réseau, il sait aussi rediriger des ports, modifier le fonctionnement d'une réponse de service,... mais pour cet article je ne vais pas vous présenter tout cela. Nous allons simplement répondre à l'ouverture du port 12345, c'est à dire que nous allons créer un serveur "hello".

Premier service, dire bonjour

Créez un fichier /tmp/server.sh avec votre éditeur. Ouvrez le avec n'importe quel éditeur de texte (vim, nano, gedit, kwrite...) et placer ce petit code:


#!/bin/bash
echo "Bonjour :)"
 

Enregistrez ce fichier, puis tapez dans un terminal:


/bin/bash /tmp/server.sh
 

Et voilà, le script fait ce que nous voulons: il dit bonjour. Maintenant nous allons en faire un service réseau, c'est à dire qu'il devra dire bonjour à un client qui se connecte sur un port. Nous nous sommes mis d'accord sur le fait que nous utiliserons le port 12345.

En tant que root, ou avec sudo sur Ubuntu, créez un fichier /etc/xinte.d/myserver de cette manière:


#vous n'êtes pas sur Ubuntu:
su -lc gedit /etc/xinet.d/myserver
#vous êtes sur Ubuntu
sudo gedit /etc/xinet.d/myserver
 

Maintenant, on va entrer notre configuration:


# default: off
# description: This is a test
service myserver
{
        type         = UNLISTED
        port         = 12345
        disable      = no
        socket_type  = stream
        protocol     = tcp
        wait         = no
        server       = /bin/bash
        server_args  = /tmp/server.sh
        user         = nobody
}
 

Voilà, on sauvegarde le script et relance xinetd:


su -lc service xinetd restart
#ou sur Ubuntu
sudo service xinetd restart
 

Croyez le ou non, mais on a un service :) Allez on le teste, vous devez certainement avoir telnet ou nc sur votre machine, l'idée est de se connecter au port 12345 afin de voir la réponse de notre service. Testez une des ces commandes:


nc 127.0.0.1 12345
#ou
telnet 127.0.0.1 12345
 

Dans les deux cas vous devriez avoir un "Bonjour :)" de la part de votre service. Vous pouvez tenter de vous connecter à votre service depuis l'extérieur, imaginons que votre ip soit 192.168.0.5, allez sur un autre poste de votre réseau et faites:


nc 192.168.0.5 12345
#ou
telnet 192.168.0.5 12345
 

Si vous n'avez pas nc, ou telnet, ou alors vous voulez quand même tester la suite, ouvrez l'url http://127.0.0.1:12345 depuis un navigateur... et admirrez :)

Comprendre le fichier de configuration

Nous sommes passé très vite sur le fichier de configuration, je vais vous expliquer ce que nous avons entré.

Les commentaires dans l'entête ne sont pas anodins, certaines distributions linux les utilisent pour l'affichage dans les outils de gestion des service comme ici:

xinetd1download

Nous définissons un service nommé "myserver" avec des accolades. Tout ce qui se trouve dans les accolades sera la configuration de ce service.

L'argument "type" défini le type de service à créé. "UNLISTED" signifie que ce service n'est pas connu par le système, il n'apparait pas dans le fichier /etc/services.

Vient ensuite le port, c'est le port que nous ouvrons et par lequel passeront les paquets. "disable" à no afin que notre service fonctionne, si vous mettez "yes" alors le service sera coupé.

socket_type = stream cela signifie que nos données seront envoyées par flux. Il existe d'autre type de socket: dgram, raw... mais je ne vais pas entrer dans le détail.

protocol = tcp, vous pouvez aussi utiliser udp mais la plupart des services utilise la couche TCP pour le transport de paquet.

wait = no Signifie que nous n'avons pas à attendre qu'un client ferme la connexion pour répondre à un nouveau client. On appelle cela un service threaded car plusieurs instances de notre service peuvent tourner en simultané.

server = /bin/bash et server_args = /tmp/server.sh "server" est l'éxécutable à utiliser, "server_args" définissent les arguments à passer à l'exécutable. Si nous avions rendu /tmp/server.sh exécutable, nous n'aurions eut qu'à mettre à "server" la valeur "/tmp/server.sh" et de supprimer "server_args"

user = nobody définit l'utilisateur qui va lancer le service... évitez de mettre "root"...

Créer un protocole

L'intérêt d'un service, c'est qu'il réponde à des demandes différentes. Le client qui se connectera à votre service pourra faire des "requêtes" et vous y répondrez. C'est ce que l'on appelle un "protocole", ce sera le votre. Un protocole c'est simplement une norme que l'on s'impose pour écrire une requête et y répondre.

Notre protocole sera simple, nous allons attendre soit "hello", soit "bye". A "hello" nous répondrons "bonjour", à "bye" nous répondrons "au revoir"... je pense que nous ne pouvons pas faire plus simple :)

L'idée c'est que xinetd nous enverra dans l'entrée standard (STDIN) l'ensemble du flux réseau. Il enverra au client ce que nous envoyons sur la sortie standard (STDOUT).

Grosso modo, en bash, il suffira de lire avec "read" et d'écrire les réponses avec "echo". Simple, rapide, voici notre server.sh:


#!/bin/bash

#prend STDIN dans $a
read a
if [[ "$a" == "hello" ]]; then
        echo "Bonjour"
fi

if [[ "$a" == "bye" ]]; then
        echo "au revoir"
fi
exit 0
 

Voilà... il suffit de tester echo "hello" | nc 192.168.0.5 12345 et vous verrez notre service répondre "Bonjour".

Si vous voulez rester connecter au serveur, la soluction est d'écouter continuellement STDIN. Par contre n'oubliez pas de donner une solution de sortie... par exemple lors de l'appel à "bye":


#!/bin/bash
while 1
do
        #prend STDIN dans $a
        read a
        if [[ "$a" == "hello" ]]; then
                echo "Bonjour"
        fi

        if [[ "$a" == "bye" ]]; then
                echo "au revoir"
                #on quitte
                exit 0
        fi
done
exit 0
 

Connecter vous à votre service nc 127.0.0.1 12345 puis tapez "hello"... Le serveur vous répond mais ne rend pas la main. Tapez enfin "bye" et vous verrez que le serveur vous dit "au revoir" et quitte.

Bilan

Vous pourrez créer des service codés avec n'importe quelle langage, PHP, Perl, Bash, C, Java... tant que vous pouvez lire STDIN tout est permis :)

Certe, cela n'est pas aussi efficace que de coder un système de socket avec le langage visé, mais xinetd permet de simplifier les premiers prémices de votre futur serveur. Vous aurez à loisir de lire la page de manuel dans un terminal en tapant: man xinetd ou man xinetd.conf et vous vous rendrez compte de toute la puissance de ce démon.

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile

Pas de commentaire pour le moment

Ajouter un commentaire
Veuillez répondre à la question suivante : Taper "geek" sans les guillemets

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F108

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming Arkyne svn subversion gnome VLC Tv encoder ffmpeg Cryptage apple microsoft HTML5 Max Apple code youtube quvi git uzbl webgl chromium

  Catalogue professionnel de musique libre


  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict

tumblr visitor