2009-12-09 5 views
1

Salut, je travaille dans une application Delphi. J'ai besoin d'exécuter un script Perl qui est dans une machine distante dans une application Delphi à partir de la machine locale. J'ai besoin de faire ce processus automatiquement, sans interception manuelle. Maintenant, je vais expliquer le processus clairement, à l'heure actuelle pour exécuter le script Perl, je viens d'ouvrir la fenêtre putty, se connecter à la machine distante et exécuter le script Perl. Le script perl appelle à son tour une procédure de stockage et met à jour la table.Comment faire pour exécuter le script perl dans la machine distante de l'application Delphi?

Maintenant, je veux faire ci-dessus expliqué processus automatiquement en cliquant sur un bouton. Donc, quand je clique sur un bouton, il devrait appeler une fonction qui se connecte à l'ordinateur distant, puis exécute le script Perl. Suis-je clair pour toi ??? S'il vous plaît, aidez à résoudre cela. J'ai besoin de ce code dans Delphi dès que possible.

+0

Juste automatisez ce que vous faites manuellement. –

+0

Dans quelle partie rencontrez-vous des problèmes? Se connecter à la machine distante, exécuter un programme ou exécuter un * script Perl * en particulier? –

Répondre

2

deux étapes:

  • Utilisez un module/fonction Delphi qui vous permet de SSH
  • Exécutez le script Perl.
+0

serait génial si vous postez un lien vers un tel module – NickSoft

0

Vous pouvez regarder dans Capistrano - il a été conçu pour précisément ce type d'automatisation. Vous devez juste avoir à:

  1. download et installer Ruby pour Windows
  2. download et installer RubyGems
  3. créer une recette Capistrano pour appeler le script Perl à distance
  4. invoquer Capistrano de votre application Delphi
-1

Je ne sais pas Perl. Mais si je comprends bien, c'est un langage de script web similaire à PHP. Moi aussi j'étais confronté à une situation similaire mais avec php. Donc j'ai fini par faire un appel en utilisant Indy dans mon application Delphi à un script php. Je ne sais pas si le même genre de logique pourrait être appliqué à perl. Voici quelques extraits de la logique.

var 
    IdHTTP: TIdHTTP; 
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    try 
    IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil); 
    IdHTTP := TIdHTTP.create(nil); 
    idhttp.handleredirects := True; 
    with IdSSLIOHandlerSocket1 do begin 
     SSLOptions.Method := sslvSSLv3; 
     SSLOptions.Mode := sslmUnassigned; 
     SSLOptions.VerifyMode := []; 
     SSLOptions.VerifyDepth := 2; 
    end; 
    with IdHTTP do begin 
     IOHandler := IdSSLIOHandlerSocket1; 
     ProxyParams.BasicAuthentication := False; 
     Request.ContentType := 'text/html'; 
     request.connection := 'keep-alive'; 
     Request.Accept := 'text/html, */*'; 
    end; 
    result := idhttp.get('http://www.mysite.com/myscript.php'); 
    finally 
    IdHTTP.free; 
    IdSSLIOHandlerSocket1.free; 
    end; 
end; 
+0

Perl n'est pas un langage de script web: "Perl est un langage de programmation dynamique interprété, de haut niveau, polyvalent." (http://en.wikipedia.org/wiki/Perl) - vous pouvez écrire des applications web avec Perl, mais pas tous les scripts Perl sont des applications web :) – mjn

+0

Merci pour toutes vos réponses. Je vous le ferai savoir une fois que j'aurai terminé ce processus d'automatisation. Merci beaucoup. Si vous avez d'autres solutions, n'hésitez pas à partager avec moi. – JVNR

0

Si la machine distante exécute Windows, PsExec peut être une solution.

PsExec est un léger -remplacement telnet qui vous permet d'exécuter des processus sur d'autres systèmes

Il existe des outils similaires WinExe qui exécutent à distance des programmes sur un hôte Windows

0

Est la machine distante exécutant Windows? Si c'est le cas, vous pouvez toujours appeler "psexec" depuis Delphi. Ou vous pouvez utiliser WMI pour exécuter à distance un processus (en supposant que l'hôte distant exécute une version de Windows)

Voici un exemple complet dans Delphi, taken from here. Vous avez besoin de l'unité WbemScripting_TLB, que vous pouvez créer en installant la bibliothèque de types % windir% \ System32 \ wbem \ wbemdisp.tlb en utilisant les options de menu "Composant | Importer un composant | Importation d'une bibliothèque de types" dans Delphi 2007.

unit Unit1; 

interface 

uses 
    Windows, 
    Messages, 
    SysUtils, 
    Variants, 
    Classes, 
    Graphics, 
    Controls, 
    Forms, 
    Dialogs, 
    StdCtrls, 
    ComCtrls; 

type 
    TForm1 = class(TForm) 
    btnExecute: TButton; 
    edtProgramToExecute: TEdit; 
    Label2: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    Label5: TLabel; 
    edtRemoteMachine: TEdit; 
    edtUser: TEdit; 
    edtPassword: TEdit; 
    procedure btnExecuteClick(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses WbemScripting_TLB; 

function remoteExecute(programName: string; machine: string = ''; user: string = ''; 
    password: string = ''): string; 
var 
    SWbemLocator1: TSWbemLocator; 
    Service: ISWbemServices; 
    InParam, 
    OutParam, SObject: ISWbemObject; 
    Method: ISWbemMethod; 
    SProp1 
    , SProp2, MyProperty 
    : ISWbemProperty; 
    s, methodName: string; 
    PropValue: OleVariant; 
begin 
    methodName := 'Create'; 
    // CoInitialize(nil); 
    SWbemLocator1 := TSWbemLocator.Create(nil); 
    if machine = '' then 
    machine := '.'; 
    Service := SWbemLocator1.ConnectServer(machine, 'root\CIMV2', user, password, '', '', 
    0, nil); 
    Service.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate); 
    SObject := Service.Get('Win32_Process', 0, nil); 

    Method := SOBject.Methods_.Item(methodName, 0); 
    InParam := Method.InParameters.SpawnInstance_(0); 

    MyProperty := InParam.Properties_.Add('CommandLine', wbemCimtypeString, False, 0); 
    PropValue := programName; 
    MyProperty.Set_Value(PropValue); 

    MyProperty := InParam.Properties_.Add('CurrentDirectory', wbemCimtypeString, False, 0); 
    PropValue := Null; 
    MyProperty.Set_Value(PropValue); 

    MyProperty := InParam.Properties_.Add('ProcessStartupInformation', wbemCimtypeObject, 
    False, 0); 
    PropValue := Null; 
    MyProperty.Set_Value(PropValue); 

    OutParam := SObject.ExecMethod_(methodName, InParam, 0, nil); 
    // OutParam:= SObject.ExecMethod_(methodName, nil, 0, nil); 
    SProp1 := outParam.Properties_.Item('ReturnValue', 0); 
    SProp2 := outParam.Properties_.Item('ProcessId', 0); 
    case SProp1.Get_Value of 
    0: s := 'Successful completion.'; 
    2: s := 'Access denied.'; 
    3: s := 'Insufficient privilege.'; 
    8: s := 'Unknown failure.'; 
    9: s := 'Path not found.'; 
    21: s := 'Invalid parameter.'; 
    else 
    s := 'Unknown reply code!'; 
    end; 
    SWbemLocator1.Free; 
    service := nil; 
    SObject := nil; 
    OutParam := nil; 
    SProp1 := nil; 
    result := s + '(PID=' + inttostr(SProp2.Get_Value) + ')'; 
    // CoUninitialize; 
end; 

procedure TForm1.btnExecuteClick(Sender: TObject); 
begin 
    statusbar1.simpletext := remoteExecute(edit1.text, edit2.text, edit3.text, edit4.text); 
end; 

end. 

Vous pouvez aussi le faire en VBScript:

Here's a VBScript snippet that demonstrates how this would work. 
' This script provides a function for executing a command on a remote computer 
' This uses WMI and requires that you have administrative righs on the remote machine 
' 

Dim strComputer, strCommandLineToRun 

'change the period to an IP Address or computer name 
strComputer = "." 'example: strComputer = "192.168.1.105" 

'this is the path to the file on the computer whose name/IP address is stored in the strComputer variable 
strCommandLineToRun = "c:\windows\system32\calc.exe" 


' This calls the function to run the process on a remote computer 
RemoteExecute strComputer,"","",strCommandLineToRun 


Function RemoteExecute(strServer, strUser, strPassword, CmdLine) 
    Const Impersonate = 3 

    RemoteExecute = -1 

    Set Locator = CreateObject("WbemScripting.SWbemLocator") 
    Set Service = Locator.ConnectServer(strServer, "root\cimv2", strUser, strPassword) 

    Service.Security_.ImpersonationLevel = Impersonate 
    Set Process = Service.Get("Win32_Process") 

    result = Process.Create(CmdLine, , , ProcessId) 

    If (result <> 0) Then 
     WScript.Echo "Creating Remote Process Failed: " & result 
     Wscript.Quit 
    End If 

    RemoteExecute = ProcessId 
End Function 
3

Dans l'esprit d'automatiser ce que vous faites déjà manuellement, vous pouvez utiliser l'utilitaire Plink qui vient avec Putty. Il accepte diverses options de ligne de commande, notamment le nom d'utilisateur, l'hôte, le mot de passe et la commande à exécuter. Vous pouvez également spécifier la plupart des options dans une session Putty enregistrée. Voir the Putty documentation pour plus. Vous pouvez utiliser CreateProcess pour exécuter la commande à partir de votre programme. Si la commande que vous devez exécuter a des paramètres, vous devrez peut-être citer la commande entière. Si vous avez plusieurs commandes à exécuter, vous devez les placer dans un fichier, puis utiliser l'option -m de Plink.

+0

Merci pour votre réponse. Je vais mettre cela en application dans ma demande et vous faire savoir si je fais face à des problèmes dans ce domaine. – JVNR

Questions connexes