PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Hobbestigrou : Lire des fichiers distants

jeudi 22 novembre 2012 à 01:02

Introduction

Il arrive qu'on est besoin de lire des fichiers stockés sur une machine distante, ça m'est arrivé il y a quelques jours sur un projet, je devais aller lire des logs. L'une des solutions aurait été d'utiliser par exemple Net::SCP pour copier le fichier distant dans un répertoire temporaire locale, le lire et le supprimer, mais j'ai pas pensé devait exister un module pour la gestion de fichier distant, c'est le cas et son nom est File::Remote il est plutôt pas mal bien qu'un peu vieux et facile à utiliser.

Installation

Je n'ai pas vu de paquet Debian, mais pour ma part tant-donné que j'utitilise perlbrew je n'utilise pas les paquets système.

cpanm File::Remote

Usage

Il va fournir un certain nombre de méthodes, création de fichier ou répertoire sur la machine distante, supression de fichier ou répertoire distant, copie de fichiers similaire à scp, lecture de fichier distant. Il y a deux manière de l'utiliser, la première c'est la manière procédurale et la deuxième la manière objet. Je préfère la deuxième, car en général je fais de la programmation objet, mais aussi car elle offre un avantage, elle donne la possibilité de travailler sur différents serveur en utilisant différente méthode (rsh, ssh), après c'est une question de choix. En utilisant la manière procédurale, il faudra utiliser un tag spécial :replace au chargement du module, qui va remplacer les méthodes built-in de Perl concernant les opérations sur fichiers par celle du module.

#!/usr/bin/env perl

use strict;
use warnings;

use File::Remote qw(:replace);

mkdir("hobbestigrou@erakis.im:/tmp/essai");
chown("hobbestigrou", "root", "hobbestigrou@erakis.im:/tmp/essai");
open(FILE, ">hobbestigrou@erakis.im:/tmp/essai/file") or die "Open failed: $!" . "\\n";
print FILE "Salut le monde";
close(FILE) or die "Close failed: $!" . "\\n";
unlink(hobbestigrou@erakis.im:/tmp/essai/file);

Il gère aussi les fichiers locaux, il suffit de ne pas préciser de host, mais somplement indiquer le chemin. Pas besoin donc de réécrire un vieux script pour les parties qui concerne des operations sur des fichiers locaux, si vous ajoutez File::Remote pour travailler sur des fichiers distants.

Pour la méthode objet, le constructeur peut prendre trois paramètres, rsh qui représente le chemin de rsh, rcp qui répresente chemin de rcp, et tmp pour le chemin du répertoire temporaire. Bon personnellement on est en 2012 donc je préfère utiliser ssh et scp, je vous conseil vivement d'utiliser le module File::Which pour ne pas mettre les chemins des binaires en dur ce n'est pas beau et ça risquerait de ne pas fonctionner partout.

#!/usr/bin/env perl

use strict;
use warnings;

use File::Remote;
use File::Which;

my $remote = File::Remote->new(
    rsh => which('ssh'),
    rcp => which('scp'),
);

my @lines = $remote->readfile('hobbestigrou@erakis.im:/tmp/essai/file');

foreach my $line (@lines) {
    print $line, "\\n";
}

$remote->touch(''hobbestigrou@erakis.im:/tmp/essai/file2');

Les valeurs par défaut de rsh et rcp sont '/usr/bin/rsh' et '/usr/bin/rcp'.

Conclusion

Un petit module assez pratique qui permet de facilement gérer des fichiers distants.

Gravatar de Hobbestigrou
Original post of Hobbestigrou.Votez pour ce billet sur Planet Libre.