OVH Cloud OVH Cloud

Perl et SSH

20 réponses
Avatar
Sameline
Bonjour,

Actuellement j'ai un script perl qui manipule des fichiers via un
classique system ("XXX");

Je cherche a optimiser tous cela et j'aurais besoin de deux fonctions
(si elle existe) :

1- Que mon script compare deux fichiers textes et qu'il soit capable de
dire si le second est different du premier (plutot que de faire un move
j'aimerais etre sur qu'il y a une modification dans le fichiers avant de
le deplacer et relancer l'appli)

2- Le script doit executer des commande sur une machine distante via
SSH. pareil, actuellement je bidouille avec du system ("XX"), il y a une
solution plus propre ?

merci d'avance

10 réponses

1 2
Avatar
Emmanuel Florac
Le Wed, 16 Nov 2005 12:28:36 +0100, Sameline a écrit :


1- Que mon script compare deux fichiers textes et qu'il soit capable de
dire si le second est different du premier (plutot que de faire un move
j'aimerais etre sur qu'il y a une modification dans le fichiers avant de
le deplacer et relancer l'appli)


Le plus simple ne serait-il pas de faire un system("cmp")?

2- Le script doit executer des commande sur une machine distante via
SSH. pareil, actuellement je bidouille avec du system ("XX"), il y a une
solution plus propre ?


IL y a bien plus propre : Net::SSH.

--
Si non confectus non reficiat.

Avatar
Thomas vO
À (at) Wed, 16 Nov 2005 12:56:07 +0100,
Emmanuel Florac nous disait (told us):
Le Wed, 16 Nov 2005 12:28:36 +0100, Sameline a écrit :


1- Que mon script compare deux fichiers textes et qu'il soit capable de
dire si le second est different du premier (plutot que de faire un move
j'aimerais etre sur qu'il y a une modification dans le fichiers avant de
le deplacer et relancer l'appli)


Le plus simple ne serait-il pas de faire un system("cmp")?


ou un rsync via ssh ?

--
Thomas vO - <http://perso.enstimac.fr/~vanouden/>


Avatar
Sameline

1- Que mon script compare deux fichiers textes et qu'il soit capable de
dire si le second est different du premier (plutot que de faire un move
j'aimerais etre sur qu'il y a une modification dans le fichiers avant de
le deplacer et relancer l'appli)


Le plus simple ne serait-il pas de faire un system("cmp")?


Possible ;=) je veins de tester la commande (je ne la connaissais pas).

comment je peux faire pour sortir le resultat d'un:
system ("cmp fichier1 fichier2")
de façon qu'une variable soit a 0 ou a 1 selon le resultat
(je suis debutant en perl)


2- Le script doit executer des commande sur une machine distante via
SSH. pareil, actuellement je bidouille avec du system ("XX"), il y a une
solution plus propre ?


IL y a bien plus propre : Net::SSH.


Good, aurais tu un exemple d'utilisation ?

Merci beaucoup

Sameline


Avatar
Sameline
À (at) Wed, 16 Nov 2005 12:56:07 +0100,
Emmanuel Florac nous disait (told us):

1- Que mon script compare deux fichiers textes et qu'il soit capable de
dire si le second est different du premier (plutot que de faire un move
j'aimerais etre sur qu'il y a une modification dans le fichiers avant de
le deplacer et relancer l'appli)
Le plus simple ne serait-il pas de faire un system("cmp")?



ou un rsync via ssh ?


Je ne pense pas que cela soit la meme chose, mais je peux me tromper.
rsync ne sert il pas a synchroniser deux repertoires/fichiers ?

Dans mon cas, mon script genere un fichier .conf d'apres des variables
et apres le deplace.



Avatar
perleen
Ne connaissant pas de fonctions qui comparent deux fichiers en dehors
de commandes unix, tu peux mettre tes fichiers dans des tableaux et te
creer un sous programme qui compare deux tableaux est specifie si ces
derniers sont identiques ou pas!!
Avatar
Emmanuel Florac
Le Wed, 16 Nov 2005 13:27:55 +0100, Sameline a écrit :


comment je peux faire pour sortir le resultat d'un:
system ("cmp fichier1 fichier2")
de façon qu'une variable soit a 0 ou a 1 selon le resultat
(je suis debutant en perl)



Facile : cmp ne renvoie rien si les fichiers sont identiques, donc "faux",
et quelque chose s'ils sont différents donc "vrai". Autrement dit il
vaut mieux utiliser `` ou qx() plutôt que 'system' (je te laisse chercher
pourquoi dans la doc...)


if ( qx(cmp $fichier1 $fichier2) ) { print "les fichiers diffèrent!n"}



2- Le script doit executer des commande sur une machine distante via
SSH. pareil, actuellement je bidouille avec du system ("XX"), il y a une
solution plus propre ?


IL y a bien plus propre : Net::SSH.


Good, aurais tu un exemple d'utilisation ?


Très simple !

Use Net::SSH;
ssh('', $command);

Note qu'il faut utiliser une authentification par clefs DSA ou RSA (c'est
la bonne méthode de toute façon...).

Il faut faire ( avec dsa ou rsa au choix) sur la machine à laquelle tu
veux pouvoir te connecter :

ssh-keygen -t rsa

ne pas donner de mot de passe, et copier la clef privée dans le ~/.ssh de
l'utilisateur qui doit pouvoir se connecter.

--
Le commissaire : Comment vous appelez-vous?
Garance : Moi je ne m'appelle jamais, je suis toujours là. J'ai pas
besoin de m'appeler. Mais les autres m'appellent Garance, si ça peut
vous intéresser.
Prévert,"les enfants du Paradis".



Avatar
Paul Gaborit
À (at) Wed, 16 Nov 2005 14:26:11 +0100,
Emmanuel Florac écrivait (wrote):
IL y a bien plus propre : Net::SSH.


Good, aurais tu un exemple d'utilisation ?


Très simple !

Use Net::SSH;
ssh('', $command);

Note qu'il faut utiliser une authentification par clefs DSA ou RSA (c'est
la bonne méthode de toute façon...).


Jusque là... Ok.

Il faut faire ( avec dsa ou rsa au choix) sur la machine à laquelle tu
veux pouvoir te connecter :

ssh-keygen -t rsa

ne pas donner de mot de passe, et copier la clef privée dans le ~/.ssh de
l'utilisateur qui doit pouvoir se connecter.


Même si ça va marcher (et encore j'ai un doute), là, ce n'est plus la
bonne méthode : par principe une clé privée doit le rester. Elle ne
doit donc jamais être copiée, transmise, etc...

La "bonne" méthode :

1 - sur la machine initiant la connexion ssh, créer une paire de clés
privée/publique :

ssh-keygen -t rsa

en mettant une "pass phrase" vide. Cela crée dans le répertoire .ssh
deux fichiers : id_rsa (la clé privée) et id_rsa.pub (la clé
publique).

2 - copier la clé *publique* sur la machine distante :

scp .ssh/id_rsa.pub :.

3 - se connecter à la machine distante et ajouter la clé publique au
fichier authorized_keys du répertoire .ssh (en le créant si besoin) :

ssh
mkdir .ssh
chmod 700 .ssh
cat id_rsa.pub >> .ssh/authorized_keys
rm id_rsa.pub
exit

À partir de là, la machine distante acceptera (sans mot de passe)
toutes les connexions ssh depuis la machine initiale.

Pour en savoir plus, un petit guide sympa (il y en a plein d'autres) :

<http://www.gentoo.org/doc/fr/keychain-guide.xml>

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Emmanuel Florac
Le Wed, 16 Nov 2005 16:09:43 +0100, Paul Gaborit a écrit :


À partir de là, la machine distante acceptera (sans mot de passe)
toutes les connexions ssh depuis la machine initiale.


Mais oui, mais c'est bien sûr, j'ai encore tout inversé :)

--
De longs désirs, une longue admiration sans espérance, voilà le moyen
d'adorer les femmes, et de rendre l'amour une passion délicieuse!
N. Rétif de la Bretonne.

Avatar
Chris
Paul Gaborit wrote:
À (at) Wed, 16 Nov 2005 14:26:11 +0100,
Emmanuel Florac écrivait (wrote):

IL y a bien plus propre : Net::SSH.


Good, aurais tu un exemple d'utilisation ?


Très simple !

Use Net::SSH;
ssh('', $command);

Note qu'il faut utiliser une authentification par clefs DSA ou RSA (c'est
la bonne méthode de toute façon...).



Jusque là... Ok.


Il faut faire ( avec dsa ou rsa au choix) sur la machine à laquelle tu
veux pouvoir te connecter :

ssh-keygen -t rsa

ne pas donner de mot de passe, et copier la clef privée dans le ~/.ssh de
l'utilisateur qui doit pouvoir se connecter.



Même si ça va marcher (et encore j'ai un doute), là, ce n'est plus la
bonne méthode : par principe une clé privée doit le rester. Elle ne
doit donc jamais être copiée, transmise, etc...

La "bonne" méthode :

1 - sur la machine initiant la connexion ssh, créer une paire de clés
privée/publique :

ssh-keygen -t rsa

en mettant une "pass phrase" vide. Cela crée dans le répertoire .ssh
deux fichiers : id_rsa (la clé privée) et id_rsa.pub (la clé
publique).

2 - copier la clé *publique* sur la machine distante :

scp .ssh/id_rsa.pub :.

3 - se connecter à la machine distante et ajouter la clé publique au
fichier authorized_keys du répertoire .ssh (en le créant si besoin) :

ssh
mkdir .ssh
chmod 700 .ssh
cat id_rsa.pub >> .ssh/authorized_keys
rm id_rsa.pub
exit

À partir de là, la machine distante acceptera (sans mot de passe)
toutes les connexions ssh depuis la machine initiale.

Pour en savoir plus, un petit guide sympa (il y en a plein d'autres) :

<http://www.gentoo.org/doc/fr/keychain-guide.xml>



Juste pour ma culture personnelle mais si les clés ont un mot de passe
existe t il un moyen pour se connecter vai ssh en lui passant la clé
ou au pire en la saisissant au prealable

A+
chris




Avatar
Paul Gaborit
À (at) Thu, 17 Nov 2005 13:33:17 +0100,
Chris écrivait (wrote):
Juste pour ma culture personnelle mais si les clés ont un mot de passe
existe t il un moyen pour se connecter vai ssh en lui passant la clé
ou au pire en la saisissant au prealable


Em la passant (la clé), cela signifie qu'elle n'est plus
protégée... donc non. En fournissant le mot de passe au préalable (à
un processus sécurisé), peut-être en passant par ssh-agent ou un
mécanisme similaire.


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

1 2