Faire du SSH ou du SCP ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Faire du SSH ou du SCP ?

Message par pastor »

Bonjour à tous,

Savez-vous s'il existe des exemples de codes sources (en Purebasic bien sur) ou des librairies pour faire du SSH ou du SCP ?

Pour rappel, avec SSH on peut faire l'équivalent de telnet mais chiffré.

L'idée est d'envoyer des commandes unix via SSH à d'autres machines sous Unix.

Je ne compte pas refaire un client SSH comme Putty, mais plutot d'envoyer des commandes spécifiques via mon application en Purebasic.

La je pense que c'est fort comme demande, mais je suis en permanence surpris par la puissance des codes Purebasic que l'on trouve à droite et à gauche, alors peut-être...

A+

Laurent
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

essaie avec CURL
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Message par pastor »

Merci Droopy,

Effectivement, CURL est une piste intéressante, il permet de faire :

curl is a tool to transfer data from or to a server, using one of the supported protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or FILE).

Je viens de le tester.

Il répond à mon besoin pour le SCP, par contre, visiblement, il ne permet pas de faire du SSH, juste TELNET.

Pour ceux que ca intéresses le site CURL :

http://curl.haxx.se/docs/

La distrib Windows :

http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi

Pour que ca puisse marcher sous Windows, il faut télécharger OpenSSL :

http://209.61.202.80/apache/Openssl-0.9.8d-Win32.zip

Puis copier : libeay32.dll et ssleay32.dll du répertoire Openssl vers le répertoire de Curl.

Pour finir, il faut renommer ssleay32.dll en libssl32.dll dans le répertoire de Curl.

Et ca marche, dans une fenêtre console on peut lancer pour faire un test :

curl http://www.google.fr
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Message par pastor »

J'avance, j'ai trouvé une distrib SSH libre sous Windows :

http://www.itefix.no/phpws/index.php?mo ... tion=22:22

Je souhaite la piloter avec Purebasic, voici le code en mode console :

Code : Tout sélectionner

prg= RunProgram ( "D:\SSH\Copssh_1.4.2\bin\ssh.exe", " -l pastor machine.bidule.fr" , "" , #PB_Program_Open|#PB_Program_Read|#PB_Program_Error|#PB_Program_Write     )

If prg 
     While ProgramRunning (prg) 
         Debug (ReadProgramString (prg) )
            
     Wend 
EndIf 
CloseProgram (prg) 
Voici sans Purebasic ce que l'on lance pour se connecter en SSH avec en rouge le mot de passe et le exit à saisir :

D:\SSH\Copssh_1.4.2\bin>ssh -l pastor machine.bidule.fr
pastor@machine.bidule.fr's password: XXXXX

Last login: Fri May 4 16:06:10 2007 from sigalser3

Bonjour pastor, bonne journee.

Path : .:/usr/bin:/usr/sbin:/usr/openwin/bin:/opt/local/bin

pastor@machine.bidule.fr~$ exit
logout
Connection to machine.bidule.fr closed.

------------------------------------------------------------------------------------

Mon problème, c'est que après le lancement de l'appli, il me demande le mot de passe de connexion et je ne sais pas comment lui transmettre ni le exit d'ailleur ?

Je suppose qu'il faut utiliser : WriteProgramStringN(prg, "motdepasse") mais comment savoir quand lui envoyer ?

Laurent
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

En analysant ce que le serveur t'a répondu ?!!! non ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
pastor
Messages : 54
Inscription : sam. 14/avr./2007 22:59

Message par pastor »

J'ai trouvé un code sur le forum Anglais que j'ai un peu adapté, pour tout dire c'est un peu complexe pour moi, mais ca marche, enfin presque.

Il suffit de récupérer Putty, j'utilise le fichier Plink.exe de Putty comme client SSH en mode console, la particularitée de Plink, c'est que l'on peut mettre le password en ligne de commande :

PLINK -ssh -2 -l lpastor -pw 12345 127.0.0.1

Openssh n'autorise pas cela.

Pour ceux que ca intéresse voici un autre serveur SSH en freeware pour Windows, ils sont particulièrement rares et celui la est le plus simple de tous à configurer et à utiliser :

http://www.freesshd.com/

Voici mon nouveau code, le problème c'est que je ne sais pas interagir avec les réponses, comment lui envoyer une commande en cours de fonctionnement ?

Code : Tout sélectionner

; Redirect Outputs into Memory 
; coded by Siegfried Rings march 2002 
; redirected the pipes 
; 
;see http://support.microsoft.com/default.aspx?scid=kb;EN-US;q173085 
; 

;mCommand.s="ssh" 
mCommand.s="PLINK -ssh -2 -l lpastor -pw 12345 127.0.0.1"

;Structure used by the CreateProcessA function 
;another then that Fred implemented ! 
Structure MySTARTUPINFO 
cb.l 
lpReserved.l 
lpDesktop.l 
lpTitle.l 
dwX.l 
dwY.l 
dwXSize.l 
dwYSize.l 
dwXCountChars.l 
dwYCountChars.l 
dwFillAttribute.l 
dwFlags.l 
wShowWindow.w 
cbReserved2.w 
lpReserved2.l 
hStdInput.l 
hStdOutput.l 
hStdError.l 
EndStructure 

proc.PROCESS_INFORMATION ;Process info filled by CreateProcessA 
ret.l ;long variable For get the Return value of the 
start.MySTARTUPINFO ;StartUp Info passed To the CreateProceeeA 
sa.SECURITY_ATTRIBUTES ;Security Attributes passeed To the 
hReadPipe.l ;Read Pipe handle created by CreatePipe 
hWritePipe.l ;Write Pite handle created by CreatePipe 
lngBytesread.l ;Amount of byte Read from the Read Pipe handle 
strBuff.s=Space(256) ;String buffer reading the Pipe 

;Consts For functions 
#NORMAL_PRIORITY_CLASS = $20 
#STARTF_USESTDHANDLES = $100 
#STARTF_USESHOWWINDOW = $1 

;Create the Pipe 
sa\nLength =SizeOf(SECURITY_ATTRIBUTES) ;Len(sa) 
sa\bInheritHandle = 1 
sa\lpSecurityDescriptor = 0 
ret = CreatePipe_(@hReadPipe, @hWritePipe, @sa, 0) 
If ret = 0 
;If an error occur during the Pipe creation exit 
MessageRequester("info", "CreatePipe failed. Error: ",0) 
End 
EndIf 

start\cb = SizeOf(MySTARTUPINFO) 
start\dwFlags = #STARTF_USESHOWWINDOW | #STARTF_USESTDHANDLES 

;set the StdOutput And the StdError output To the same Write Pipe handle 
start\hStdOutput = hWritePipe 
start\hStdError = hWritePipe 

;Execute the command 
ret = CreateProcess_(0, mCommand, sa, sa, 1, #NORMAL_PRIORITY_CLASS, 0, 0, @start, @proc) 

If ret <> 1 
MessageRequester("Info","File Or command not found", 0) 
End 
Else 
;MessageRequester("Info","PRG started..:",0) 
EndIf 


;Now We can ... must close the hWritePipe 
ret = CloseHandle_(hWritePipe) 

mOutputs.s = "" 

;Read the ReadPipe handle 
While ret<>0 
ret = ReadFile_(hReadPipe, strBuff, 255, @lngBytesread, 0) 
If lngBytesread>0 
mOutputs = mOutputs + Left(strBuff, lngBytesread) 
EndIf 
Wend 

;Close the opened handles 
ret = CloseHandle_(proc\hProcess) 
ret = CloseHandle_(proc\hThread) 
ret = CloseHandle_(hReadPipe) 
;ret=CloseHandle_(hWritePipe) 

;Return the Outputs property with the entire DOS output 
MessageRequester("Info",mOutputs,0)

Voici mon ancien code un peux amélioré, qui marche lui aussi à moitié, il oblige à saisir le mot de passe dans la console :

Code : Tout sélectionner


prg= RunProgram ( "D:\CLEE\Développement\PB\Sources LP\SSH\ssh.exe", "-v -l lpastor 127.0.0.1", "D:\CLEE\Développement\PB\Sources LP\SSH" , #PB_Program_Open|#PB_Program_Read|#PB_Program_Error|#PB_Program_Write )

; Ca, ca ne marche pas !
;prg=ShellExecute_(0, "open", "D:\CLEE\Développement\PB\Sources LP\SSH\ssh.exe", "-v -i laurent.ppk -l lpastor 127.0.0.1", "D:\CLEE\Développement\PB\Sources LP\SSH", #SW_SHOW	) 

n.l=0
ligne.s=""

If prg 
     While ProgramRunning (prg) 
     
         ligne=ReadProgramString (prg)
         
         Debug (ligne)
         
          
         If ligne="" And n=0
            n=n+1
            WriteProgramStringN(prg, "dir")
            ;MessageRequester("Information",ligne,#PB_MessageRequester_Ok)
         EndIf
        ;MessageRequester("Good",ligne,#PB_MessageRequester_Ok)
     Wend 
EndIf 
CloseProgram (prg) 
MessageRequester("FIN","Fin du programme",#PB_MessageRequester_Ok)
Voila, maintenant je suis planté la...

Laurent
Répondre