[Perl / CGI] appli web = script CGI + SCP

appli web = script CGI + SCP [Perl / CGI] - Perl - Programmation

Marsh Posté le 24-04-2002 à 14:32:26    

Salut a tous les Perl gurus !
 
Je suis en train de developper une appli web (Perl CGI) et je vais bientot recontrer un probleme (j'ai d'autres trucs a regler a coté). Je voudrais recuperer un fichier sur un serveur via SCP pour ensuite travailler dessus en local et le remettre a sa place. Le probleme est le suivant : comment gerer la connexion SSH (SCP) ? Je m'explique : comment faire pour recuperer le fichier sur le serveur (et ensuite le remettre) de façon transparente pour l'utilisateur de l'appli (le gars qui utilise son browser) ? Si quelqu'un a une piste, une idée ou quoi que ce soit il est le bienvenu ! ;)
 
hihi :D

Reply

Marsh Posté le 24-04-2002 à 14:32:26   

Reply

Marsh Posté le 24-04-2002 à 14:41:07    

Encore toi?!! :D
 
Il y a un site très bien pour trouver des modules Perl : http://www.cpan.org
 
J'y ai cherché 'ssh' et il m'a renvoyé cette liste :
http://search.cpan.org/search?mode=module&query=ssh
 
Je pense que au moins le Net-SSH devrait t'intéresser, ou même plutôt le Net-SSH-Perl .

 

[jfdsdjhfuetppo]--Message édité par Tentacle le 24-04-2002 à 14:43:54--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 24-04-2002 à 14:43:27    

ben là tout dépend.....
 
Si on part du principe que le gars a sa connection internet ouverte c'est tres simple pour le recuperer....
Tu fais un open normal et un traitement normal.....
 
Par contre pour remettre le fichier a sa place.... Pas simple.
Personnellement je creerais un script qui copierais le fichier en local, le collerais dans un formulaire dans un champ de type FILE, puis avec un bouton mise a jour, je passerais la main a un script sur le serveur (qui est sur internet) qui lui se chargerais d'uploader le fichier sur le serveur et de le remettre a la bonne place......
 
Sinon, s'il faut ouvrir les connections etc.... Bonjour la galere...
 
@+
cadou

Reply

Marsh Posté le 24-04-2002 à 15:26:05    

Citation :

Encore toi?!!    
 
Il y a un site très bien pour trouver des modules Perl : http://www.cpan.org  
 
J'y ai cherché 'ssh' et il m'a renvoyé cette liste :  
http://search.cpan.org/search?mode=module&query=ssh  
 
Je pense que au moins le Net-SSH devrait t'intéresser, ou même plutôt le Net-SSH-Perl .  


 
Tentacle : je passe mes journees sur cpan.org ! ;)
Je connais... mais j'ai oublié de preciser : le module SSH pour Perl que j'ai essayé (Net::SSH) ne fonctionne pas ici (HP-UX). Donc je vais utiliser la commande ssh ou scp directement (avec system() ou les backticks).
 

Citation :

Sinon, s'il faut ouvrir les connections etc.... Bonjour la galere...


 
Ben voui... c'est justement ça le pb ! ;)
 
hihi :D

Reply

Marsh Posté le 24-04-2002 à 15:44:06    

impulse a écrit a écrit :

 
Tentacle : je passe mes journees sur cpan.org ! ;)




C'est bien ça ;p
 

Citation :

Je connais... mais j'ai oublié de preciser : le module SSH pour Perl que j'ai essayé (Net::SSH) ne fonctionne pas ici (HP-UX). Donc je vais utiliser la commande ssh ou scp directement (avec system() ou les backticks).


 
Tu pourrais pas faire comme on fait parfois avec ftp, c'est à dire faire un fichier avec toutes tes commandes dedans (genre cd, get, put, ... pour ftp) et ensuite appeler ssh en lui balançant le contenu du fichier?

 

[jfdsdjhfuetppo]--Message édité par Tentacle le 24-04-2002 à 15:44:38--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 24-04-2002 à 16:24:58    

Citation :

Tu pourrais pas faire comme on fait parfois avec ftp, c'est à dire faire un fichier avec toutes tes commandes dedans (genre cd, get, put, ... pour ftp) et ensuite appeler ssh en lui balançant le contenu du fichier?  


 
En fait je fais comme ça :  
 
[debut code]
 
#!/opt/perl/bin/perl -wT
use strict;
...
system("scp [relayuser@]relay:[user@]host:targetfile localfile" );
...
 
[fin code]
 
en ayant toutes les donnees necessaires (relayuser, relay, user, host, targetfile, localfile) dans des scalaires.
 
Le probleme majeur est plutot lié a l'identification en fait. Quand je lance ce script Perl en ligne de commande j'arrive a me connecter sans pb et ça marche (encore heureux : je ne fais qu'executer la commande scp a partir de mon script apres tout ;) )... mais le truc c'est que l'utilisateur final sera devant son browser et n'aura pas d'acces a une console Unix. Il faut que tout soit geré a partir d'un bete browser...
Il faut que l'application web demande a l'utilisateur de rentrer son login + sa passphrase SSH (SCP) et ensuite balancer l'info sur le reseau (en cryptant l'info bien sur).  
 
Je suis en train de chercher une solution pour faire ça...
 
hihi :p

 

[jfdsdjhfuetppo]--Message édité par impulse le 24-04-2002 à 16:25:57--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 24-04-2002 à 16:38:03    

impulse a écrit a écrit :

system("scp [relayuser@]relay:[user@]host:targetfile localfile" );
...
 
[fin code]
 
en ayant toutes les donnees necessaires (relayuser, relay, user, host, targetfile, localfile) dans des scalaires.
 
Le probleme majeur est plutot lié a l'identification en fait. Quand je lance ce script Perl en ligne de commande j'arrive a me connecter sans pb et ça marche (encore heureux : je ne fais qu'executer la commande scp a partir de mon script apres tout ;) )... mais le truc c'est que l'utilisateur final sera devant son browser et n'aura pas d'acces a une console Unix. Il faut que tout soit geré a partir d'un bete browser...
Il faut que l'application web demande a l'utilisateur de rentrer son login + sa passphrase SSH (SCP) et ensuite balancer l'info sur le reseau (en cryptant l'info bien sur).  
 
Je suis en train de chercher une solution pour faire ça...
 
hihi :p  




 
Déjà pour crypter le mot de passe lors de la saisie du formulaire, faudrait que tu utilises du SSL, reste à voir si ton hébergeur le propose.
 
Sinon pour balancer la passphrase à SCP, essaie de faire une pipe et d'écrire dedans le mot de pass.

Reply

Marsh Posté le 24-04-2002 à 18:06:25    

Citation :

Déjà pour crypter le mot de passe lors de la saisie du formulaire, faudrait que tu utilises du SSL, reste à voir si ton hébergeur le propose.


 
J'ai pas d'hebergeur... c'est grave docteur ? ;)
En fait je suis en stage en ce moment et j'ai cette appli a faire pour une boite avec laquelle on a un contrat...
Je pourrais en effet utiliser SSL pour crypter les communications mais le niveau de securité ne doit pas specialement etre elevé non plus : je peux me contenter de crypter la passphrase seulement (le reste de la trame peut etre en clair).
 

Citation :

Sinon pour balancer la passphrase à SCP, essaie de faire une pipe et d'écrire dedans le mot de pass.


 
Je sais pas... faut voir. :)
 
hihi :D

Reply

Marsh Posté le 24-04-2002 à 18:10:29    

impulse a écrit a écrit :

J'ai pas d'hebergeur... c'est grave docteur ? ;)



non :)
 

Citation :

Je pourrais en effet utiliser SSL pour crypter les communications mais le niveau de securité ne doit pas specialement etre elevé non plus : je peux me contenter de crypter la passphrase seulement (le reste de la trame peut etre en clair).


Oui mais je vois pas comment tu pourras faire ça, avec un javascript peut-être... ou.. ?
 

Citation :

Je sais pas... faut voir. :)


Ouais... faut voir ...:D

Reply

Marsh Posté le 25-04-2002 à 09:48:32    

Citation :

Citation :

Je pourrais en effet utiliser SSL pour crypter les communications mais le niveau de securité ne doit pas specialement etre elevé non plus : je peux me contenter de crypter la passphrase seulement (le reste de la trame peut etre en clair).


 
Oui mais je vois pas comment tu pourras faire ça, avec un javascript peut-être... ou.. ?


 
J'ai dit une connerie il me semble... je dois utiliser SSL de toute façon. :(
Va falloir que je me renseigne pour voir comment ça marche.
 
hihi :D

Reply

Marsh Posté le 25-04-2002 à 09:48:32   

Reply

Marsh Posté le 25-04-2002 à 11:19:02    

Nous te soutenons tous dans ta courageuse entreprise :D

Reply

Marsh Posté le 25-04-2002 à 13:46:21    

J'ai un script login.cgi qui sert, comme son nom l'indique, a l'identification de l'utilisateur de mon appli. J'ai un script main.cgi qui est, comme son nom ne l'indique pas specialement, mon application elle meme.  
 
Question con : comment lier les 2 ?  
 
Je voudrais en fait avoir mon script login.cgi avec une page html toute bete avec deux champs (login, pass), si l'utilisateur rentre une bonne combinaison login/pass il a droit a un petit message et hop il va sur main.cgi et si le login/pass est mauvais et ben il est puni (redirigé sur www.microsoft.com par exemple ;)).
 
hihi [:impulse]

 

[jfdsdjhfuetppo]--Message édité par impulse le 25-04-2002 à 13:47:22--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 25-04-2002 à 14:05:47    

impulse a écrit a écrit :

Question con : comment lier les 2 ?  




 
Justement login.php pourrait dire au navigateur de rediriger vers main.php (rajoutes genre session=dfglisgjsdl pour éviter que quelqu'un accède à main.php sans se loguer :D ).
 
Perso, j'utilise un script central qui s'occupe de gérer l'authentification, les droits d'accès, etc... et qui en fait appelle des fonctions spécifiques à chaque page pour premièrement gérer les arguments entrant, et l'autre appelée la page suivante (le script principal est donc assez petit). J'y trouve pas mal d'avantage (centralisation des opérations), mais ça demande pas mal de conf, et surtout je balance toujours un argument 'from' et 'to' pour s'avoir de quelle page je viens et où je veux aller. À toi de voir  ;)

Reply

Marsh Posté le 25-04-2002 à 14:19:24    

Citation :

Justement login.php pourrait dire au navigateur de rediriger vers main.php (rajoutes genre session=dfglisgjsdl pour éviter que quelqu'un accède à main.php sans se loguer :D).  


 
Ok pour le session_id... j'ai vu ds plusieurs exemples comment l'utiliser (dans des hidden fields).
 

Citation :

surtout je balance toujours un argument 'from' et 'to' pour s'avoir de quelle page je viens et où je veux aller


 
Hum... c'est pas con ça ! ;)
 

Citation :

À toi de voir ;)


 
Ben justement : je vois que dalle (mais j'aimerais bien voir ;) ). En fait il faudrait un truc du genre dans mon login.cgi => -action => 'main.cgi' ? Mais ça veut donc bien dire que le code correspondant au login se trouve dans mon main.cgi a ce moment la...
 
hihi [:impulse]
 
PS : moi c'est pas des *.php mais des *.cgi... je fais du PERL moi ! [:galatee]

Reply

Marsh Posté le 25-04-2002 à 14:30:27    

impulse a écrit a écrit :

Citation :

surtout je balance toujours un argument 'from' et 'to' pour s'avoir de quelle page je viens et où je veux aller


 
Hum... c'est pas con ça ! ;)




Mais bon le script principal est assez petit mais demande un peu de temps pour bien tout faire. D'ailleurs un des gros avantages (un autre) que j'y ai trouvé, c'est pouvoir sauvegarder les arguments renvoyés par une page, ainsi si on écrit un message, bah tu peux changer de page, revenir ensuite et retrouver ce que tu étais entrain de taper. Ensuite j'effaçais certains paramètres quand le message était enregistrer.
 

impulse a écrit a écrit :

Citation :

À toi de voir ;)


 
Ben justement : je vois que dalle (mais j'aimerais bien voir ;) ). En fait il faudrait un truc du genre dans mon login.cgi => -action => 'main.cgi' ? Mais ça veut donc bien dire que le code correspondant au login se trouve dans mon main.cgi a ce moment la...




pas forcemment avec le coup d'une redirection, genre login.cgi renvoie un code HTTP nnn (je ne le connais plus) qui au navigateur de rediriger vers une autre page.
 

impulse a écrit a écrit :

PS : moi c'est pas des *.php mais des *.cgi... je fais du PERL moi ! [:galatee]




 
Tiens je l'avais oublié (comme ai-je fais pour oublier :D )

Reply

Marsh Posté le 26-04-2002 à 08:58:43    

Citation :

pas forcemment avec le coup d'une redirection, genre login.cgi renvoie un code HTTP nnn (je ne le connais plus) qui au navigateur de rediriger vers une autre page.


 
Hum... un code HTTP ? Je vais voir ce que je peux trouver la dessus.
 
Pour ce qui est de mon probleme avec SCP et SSL : j'ai un meeting prevu la semaine prochaine avec un gars de la section secrité de la boite... ça vaut toujours le coup d'essayer. :sarcastic:  
 
hihi [:impulse]

 

[jfdsdjhfuetppo]--Message édité par impulse le 26-04-2002 à 08:59:09--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 10:47:05    

Citation :

Hum... un code HTTP ? Je vais voir ce que je peux trouver la dessus.


Bah en fait, tu peux soit mettre un header META avec un refresh très court vers une autre page (je crois que c'est possible), ou
sinon tu mets ça dans ton code :
 

Code :
  1. Header ("HTTP/1.0 303 See Other" );
  2. Header ("Location: /main.php" );


 
et n'oublit pas au 'cas ou' de mettre avec une petite page html expliquant que si la page n'est pas redirigée, de cliquer sur un lien.

Reply

Marsh Posté le 26-04-2002 à 10:48:41    

Heu par contre je ne suis pas sûr que header existe en Perl (je pensais à PHP), en fait je ne sais pas trop comment modifier les headers en Perl :)

Reply

Marsh Posté le 26-04-2002 à 11:18:38    

Pour la redirection j'ai trouvé (c'est tout con) :
 
print $login->redirect('http://www.laoujeveuxaller.com';);
 
... par contre comment passer des parametres d'un script a l'autre avec une redirection ? Pour pouvoir passer des param il ne faut pas plutot que je crée un autre form ?
 
Heu par contre je ne suis pas sûr que header existe en Perl (je pensais à PHP), en fait je ne sais pas trop comment modifier les headers en Perl
 
C'est un header HTTP donc pas specifique ni a Perl ni a PHP... ;) En perl tu peux creer du HTML (en PHP ça doit etre pareil) donc il n'y a aucun pb. Quand c'est possible (pour l'instant j'ai pas eu a faire autrement) j'utilise les methodes du module Perl CGI.pm (ex: redirect()). C'est plus sympe car tout est geré automatiquement.
 
exemple :
 
my $login = CGI->new();
print $login->header();
 
et hop t'as ton header.
 
hihi :p
 
EDIT : hum... peut etre avec une query string dans l'url de redirection... je vais voir.

 

[jfdsdjhfuetppo]--Message édité par impulse le 26-04-2002 à 11:29:10--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 12:03:00    

impulse a écrit a écrit :

Pour la redirection j'ai trouvé (c'est tout con) :
 
print $login->redirect('http://www.laoujeveuxaller.com';);
 
... par contre comment passer des parametres d'un script a l'autre avec une redirection ? Pour pouvoir passer des param il ne faut pas plutot que je crée un autre form ?




non tu mets par exemple

Code :
  1. redirect('http://www.toto.com/toto.php?session_id=afllkjdfgmlsd');


 

Citation :


Heu par contre je ne suis pas sûr que header existe en Perl (je pensais à PHP), en fait je ne sais pas trop comment modifier les headers en Perl
 
C'est un header HTTP donc pas specifique ni a Perl ni a PHP... ;)


Ca d'accord, mais je parlais de la fonction header qui permet de modifier les headers. Elle a peut-être un autre nom en Perl.

Reply

Marsh Posté le 26-04-2002 à 12:08:59    

non tu mets par exemple  
redirect('http://www.toto.com/toto.php?session_id=afllkjdfgmlsd';);

 
C'est ce que je pensais (voir EDIT post precedent)... mais ça a pas l'air de marcher... :(
 
Ca d'accord, mais je parlais de la fonction header qui permet de modifier les headers. Elle a peut-être un autre nom en Perl.
 
Avec le module CGI.pm c'est bien ça (lire post precedent en entier ;) ).
 
Merci pour ton soutien Tentacle. C'est limite un MP ce post ! :sarcastic:
 
hihi :p
 
EDIT : j'ai encore dit une connerie > j'y suis arrivé en utilisant une query string... :)

 

[jfdsdjhfuetppo]--Message édité par impulse le 26-04-2002 à 12:15:08--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 14:44:36    

Hum... Tentacle : tu peux m'expliquer vite fait comment utiliser les session_id ? Pour en creer un je fais ça :
 
sub unique_id {
  return $ENV{UNIQUE_ID} if exists $ENV{UNIQUE_ID};
}
 
(utilisation du module mod_unique_id de Apache)
 
Je crée un $id dans mon login.cgi et je le passe a mon main.cgi dans une query string... mais apres j'en fais quoi ??? j'ai du louper un episode :( (je suis pas trop reveillé aussi faut dire...)
 
hihi :p

 

[jfdsdjhfuetppo]--Message édité par impulse le 26-04-2002 à 14:45:17--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 15:03:28    

Je crée mon $id et le copie dans un fichier. Ensuite tout au debut de mon main.cgi j'ai un if du genre :
 
if ($id eq $id-qui-est-dans-le-fichier)  
{  
  ok();
}
else  
{  
  va_mourrir();  
}
 
C'est ça ?
 
hihi [:impulse]

Reply

Marsh Posté le 26-04-2002 à 23:30:34    

impulse a écrit a écrit :

Je crée mon $id et le copie dans un fichier. Ensuite tout au debut de mon main.cgi j'ai un if du genre :
 
if ($id eq $id-qui-est-dans-le-fichier)  
{  
  ok();
}
else  
{  
  va_mourrir();  
}
 
C'est ça ?
 
hihi [:impulse]  




 
C'est une solution (désolé j'ai pas eu trop de temps au boulot :)
 
Sinon tu peux le stocker dans une base de données.
Pour la base de données, je peux pas trop te donner d'exemple (enfin pour les instructions, mais je peux te donner les requête si tu veux) comme j'utilise surtout PHP pour le web (je réserve Perl pour des scripts en tout genre sur mon ordi :D.
 
Pour le coup du stockage de l'id dans un fichier, fait un peu comme les sessions en PHP, c'est à dire tu crées un fichier par session_id avec comme nom le session_id et tu y mets tes infos, genre expiration, login, etc... .

Reply

Marsh Posté le 29-04-2002 à 10:22:42    

[mode :lol: on]
 
J'avais proposé une solution a mon boss pour ce pb de securité et il m'avait repondu : "pas possible, pas bon, les gars de la secu ne voudront jamais".... et apres 1 heure de discussion avec ces gars justement on a conclu que la seule solution realisable etait celle que j'avais proposé... :sol: :sarcastic:  
 
[mode :lol: off]
 
Voici donc ce que je vais faire :
 
1. connexion client -> serveur web via https, identification du client indispensable.
 
2. connexion serveur web -> serveur de données via SCP avec un seul compte special avec des droits tres limités (pour ne pas donner la possibilité a l'eventuel cracker qui penetre mon serveur web de faire portnawak sur le serveur de données :sarcastic: ).
 
J'ai du boulot la par contre pour utiliser https et identifier le client... enfin c'est cool, mon stage devient plus interessant. C'est marrant la securité.
 
Je vais donc essayer de me debrouiller avec ce que tu m'as dit Tentacle. Mais je crois qu'avec SSL la plupart des pb (session_id...) sont reglés...
 
hihi :p

Reply

Marsh Posté le 29-04-2002 à 15:23:41    

impulse a écrit a écrit :

[mode :lol: on]
 
J'avais proposé une solution a mon boss pour ce pb de securité et il m'avait repondu : "pas possible, pas bon, les gars de la secu ne voudront jamais".... et apres 1 heure de discussion avec ces gars justement on a conclu que la seule solution realisable etait celle que j'avais proposé... :sol: :sarcastic:  
 
[mode :lol: off]



 
Faut pas se moquer de son patron ainsi :D
 

Citation :

J'ai du boulot la par contre pour utiliser https et identifier le client... enfin c'est cool, mon stage devient plus interessant. C'est marrant la securité.


 
Ce qui est moins drôle c'est que quelqu'un qui veut vraiment foutre le bordel y arrivera toujours :)
 

Citation :

Je vais donc essayer de me debrouiller avec ce que tu m'as dit Tentacle. Mais je crois qu'avec SSL la plupart des pb (session_id...) sont reglés...


Tu sais, j'y connais rien à SSL, cherche plutôt de la doc sur le net, sur les problèmes de sécurité, etc... voir ce qu'il faut faire pour avoir un niveau de sécurité correct.
 
A+

Reply

Marsh Posté le 29-04-2002 à 16:17:07    

Citation :

Faut pas se moquer de son patron ainsi


 
Me moque pas... il aurait juste pu ecouter ce que je pensais au lieu de dire NON tout de suite. ;)
 
En attendant je peux meme pas lancer mon serveur apache avec SSL car j'ai besoin d'une passphrase et personne ne la connait (personne ne sait qui a installé le serveur en +) :sarcastic:
 
hihi :p

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed