Ir al contenido


Foto

[RESUELTO] Curl puede transferir archivos a un sitio sFTP ?


  • Por favor identifícate para responder
21 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 25 julio 2011 - 03:24

Pues eso


¿ Es posible hacer que curl se conecte a un sFTP y transferir  archivos ?


Salud OS
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 25 julio 2011 - 03:59

Pues parece que si:

Get a file from an SSH server using SFTP:

        curl -u username sftp://shell.example.com/etc/issue



Pero para tener algo de código necesito mas tiempo  ;)  y un servidor sftp para probar
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 25 julio 2011 - 04:17

Te servirá este ?

http://www.secureftp-test.com/

Salud OS
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 julio 2011 - 05:31

Partiendo de los ejemplos anterirores sobre libcurl, podemos hacer algo como esto:


delphi
  1. function SaveToStream(Buffer: PAnsiChar; Size, Count: Integer;
  2.   Stream: TStream): Integer; cdecl;
  3. begin
  4.   Result:= Stream.Write(Buffer^,Size*Count) div Size;
  5. end;
  6.  
  7. function Bajar(Usuario, Clave, URL: AnsiString): Boolean;
  8. var
  9.   Curl: TCURL;
  10.   Stream: TMemoryStream;
  11. begin
  12.   Result:= FALSE;
  13.   Curl:= curl_easy_init;
  14.   if Curl <> nil then
  15.   try
  16.     if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
  17.       Exit;
  18.     if curl_easy_setopt(Curl, CURLOPT_USE_SSL, CURLUSESSL_ALL) <> CURLE_OK then
  19.       Exit;
  20.     // No verificamos la identidad del servidor, suponemos que es quien dice ser
  21.     if curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, FALSE) <> CURLE_OK then
  22.       Exit;
  23.     if curl_easy_setopt(Curl, CURLOPT_USERNAME, PAnsiChar(Usuario)) <> CURLE_OK then
  24.       Exit;
  25.     if curl_easy_setopt(Curl, CURLOPT_PASSWORD, PAnsiChar(Clave)) <> CURLE_OK then
  26.       Exit;
  27.     if curl_easy_setopt(Curl, CURLOPT_URL, PChar(URL)) <> CURLE_OK then
  28.       Exit;
  29.     if curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, @SaveToStream) <> CURLE_OK then
  30.       Exit;
  31.     Stream:= TMemoryStream.Create;
  32.     try
  33.       if curl_easy_setopt(Curl, CURLOPT_FILE, Stream) <> CURLE_OK then
  34.         Exit;
  35.       Result:= curl_easy_perform(Curl) = CURLE_OK;
  36.       // Con los datos del stream podemos hacer cualquier cosa
  37.       Stream.SaveToFile('C:\1.txt');
  38.     finally
  39.       Stream.Free;
  40.     end;
  41.   finally
  42.     curl_easy_cleanup(Curl);
  43.   end;
  44. end;
  45.  
  46. Bajar('test','test','ftps : / / ftp. secureftp-test. com :990 / pigs. xml');




¿Nos estamos acercando a lo que buscas egostar?
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 julio 2011 - 05:35

En el ejemplo anterior quitar los espacios en blanco de la url.
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 26 julio 2011 - 07:14

A probar, aunque no entiendo mucho el codigo, eso es para bajar archivo, pero para subir que función se utiliza :)

Salud OS
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 26 julio 2011 - 07:59

Probado y se conecta perfectamente, descarga el archivo sin problema, ahora, con que función se sube archivos al sFTP ? he visto en otros procesos esto


if curl_easy_setopt(Curl, CURLOPT_UPLOAD, TRUE) <> CURLE_OK then

Será con eso ?

Muchas gracias amigo Domingo :)

Salud OS
  • 0

#8 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 julio 2011 - 08:32

Ya te estoy preparando un ejemplo de como subir un archivo.

De todas formas fíjate que el ftp de prueba que me pasaste es ftps y no sftp, que aunque se parecen no son lo mismo, son protocolos diferentes y si no lo tienes en cuenta puedes perder un monton de tiempo como me paso a mi por la mañana :D

Para probar un sftp me he bajado un programita de internet que actúa como servidor sftp.
http://portableapps.com/node/19958
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 26 julio 2011 - 08:36

Ya te estoy preparando un ejemplo de como subir un archivo.

De todas formas fíjate que el ftp de prueba que me pasaste es ftps y no sftp, que aunque se parecen no son lo mismo, son protocolos diferentes y si no lo tienes en cuenta puedes perder un monton de tiempo como me paso a mi por la mañana :D

Para probar un sftp me he bajado un programita de internet que actúa como servidor sftp.
http://portableapps.com/node/19958


Ah vaya, en este caso la propiedad conmutativa si altera el producto sFTP <> FTPs :D :D :D

Salud OS
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 26 julio 2011 - 08:49

Aqui el ejemplo:


delphi
  1. function ReadFromStream(Buffer: PAnsiChar; Size, Count: Integer;
  2.   Stream: TStream): Integer; cdecl;
  3. begin
  4.   Result:= Stream.Read(Buffer^,Size*Count) div Size;
  5. end;
  6.  
  7. function SaveToStream(Buffer: PAnsiChar; Size, Count: Integer;
  8.   Stream: TStream): Integer; cdecl;
  9. begin
  10.   Result:= Stream.Write(Buffer^,Size*Count) div Size;
  11. end;
  12.  
  13. function Subir(Usuario, Clave, URL, Archivo: AnsiString): Boolean;
  14. var
  15.   Curl: TCURL;
  16.   Stream: TFileStream;
  17. begin
  18.   Result:= FALSE;
  19.   Curl:= curl_easy_init;
  20.   if Curl <> nil then
  21.   try
  22.     // Indicamos que muestre mensajes de todo lo que va haciendo
  23.     if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
  24.       Exit;
  25.     // Le decimos que uses SSL
  26.     if curl_easy_setopt(Curl, CURLOPT_USE_SSL, CURLUSESSL_ALL) <> CURLE_OK then
  27.       Exit;
  28.     // No verificamos la identidad del servidor, suponemos que es quien dice ser.
  29.     if curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, FALSE) <> CURLE_OK then
  30.       Exit;
  31.     // Indicamos el usuario
  32.     if curl_easy_setopt(Curl, CURLOPT_USERNAME, PAnsiChar(Usuario)) <> CURLE_OK then
  33.       Exit;
  34.     // El password
  35.     if curl_easy_setopt(Curl, CURLOPT_PASSWORD, PAnsiChar(Clave)) <> CURLE_OK then
  36.       Exit;
  37.     // La URL del tipo: sftp://servidor/rutadelfichero
  38.     if curl_easy_setopt(Curl, CURLOPT_URL, PAnsiChar(URL)) <> CURLE_OK then
  39.       Exit;
  40.     // Le indicamos que funcion debe usar para leer el stream
  41.     if curl_easy_setopt(Curl, CURLOPT_READFUNCTION, @ReadFromStream) <> CURLE_OK then
  42.       Exit;
  43.     // Creamos un stream a partir de un archivo
  44.     Stream:= TFileStream.Create(Archivo,fmOpenRead);
  45.     try
  46.       // Aqui le indicamos el stream que debe subir
  47.       if curl_easy_setopt(Curl, CURLOPT_INFILE, Stream) <> CURLE_OK then
  48.         Exit;
  49.       // Aqui le indicamos que la operacion es de subida
  50.       if curl_easy_setopt(Curl, CURLOPT_UPLOAD, TRUE) <> CURLE_OK then
  51.         Exit;
  52.       // Ejecutamos el comando
  53.       Result:= curl_easy_perform(Curl) = CURLE_OK;
  54.     finally
  55.       Stream.Free;
  56.     end;
  57.   finally
  58.     curl_easy_cleanup(Curl);
  59.   end;
  60. end;
  61.  
  62. // Sube el archivo "C;\ART.DAT" al servidor con el nombre "2.txt"
  63.   Subir('test','test','sftp://169.254.0.2:999/2.txt','C:\ART.DAT');




Como veras el ejemplo es muy sencillo y va comentado.


Por otro lado el que se utilice un protocolo u otro solo varia en que el url debe empezar por sftp o por ftps y curl ya se encarga del resto.
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 26 julio 2011 - 09:01

Wow!!!

Eres genial amigo Domingo (y), ya te comento como me fué con las pruebas :)

salud OS
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 26 julio 2011 - 09:06

¡Caramba! Me quito el sombrero amigo, funcionó como los mismísimos ángeles. Ya no sé cuantas te debo :)

Salud OS
  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2011 - 09:16

Gracias Domingo, a mi también me viene de perlas ese code.  (y) (y)
  • 0

#14 DIEGO.CHAVEZ

DIEGO.CHAVEZ

    Member

  • Miembros
  • PipPip
  • 15 mensajes

Escrito 12 septiembre 2014 - 10:28

hola ayer instale unos componentes de delphi para curl,  y estoy tratando de reproducir el codigo para subir archivos a un servidor SFTp pero me marca
"Undeclared identifier: CURLOPT_USE_SSL ", buscando encontre que eso se definia en el cul_h.pas creo que la version que estoy utilizando no soporta SFTP entonces como puedo actualizar mi version o que me podrian sugerir para solucionar esto,  utilizo el wrapper de curl "curlpas" o ustedes como le hicieron para lograr subir archivos a servidor SFTP.
  • 0

#15 Ana

Ana

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 23 octubre 2019 - 02:54

Buenos días,

he conseguido subir ficheros a una sftp, pero ahora me surge la necesidad de bajar todos los ficheros de un directorio de una sftp. He visto el código de bajar, pero es para un único fichero, ¿como puedo descargar todos los ficheros del directorio?

 

Gracias.


  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.192 mensajes
  • LocationMéxico

Escrito 23 octubre 2019 - 07:23

Buenos días,
he conseguido subir ficheros a una sftp, pero ahora me surge la necesidad de bajar todos los ficheros de un directorio de una sftp. He visto el código de bajar, pero es para un único fichero, ¿como puedo descargar todos los ficheros del directorio?
 
Gracias.

 
Hola Ana, bienvenida a DelphiAccess
 
Si cambias pigs.xml por *.* servirá

 

Saludos


  • 0

#17 Ana

Ana

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 24 octubre 2019 - 04:49

 
Hola Ana, bienvenida a DelphiAccess
 
Si cambias pigs.xml por *.* servirá

 

Saludos

 

Hola 

ya lo he cambiado y me devuelve el siguiente error "CURLE_REMOTE_FILE_NOT_FOUND"


  • 0

#18 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 24 octubre 2019 - 10:01

Buenas tardes,

 

Ahora mismo no tengo instalado Delphi asi que no puedo probarlo, pero si no recuerdo mal si pones como la ruta la del directorio se descarga un fichero tal que asi:

 

Bajar('demo','password','sftp : //test. rebex. net: 22/');


php
  1. drwx------ 2 demo users          0 Jul 26  2017 .
  2. drwx------ 2 demo users          0 Jul 26  2017 ..
  3. drwx------ 2 demo users          0 Dec 03  2015 aspnet_client
  4. drwx------ 2 demo users          0 Oct 27  2015 pub
  5. -rw------- 1 demo users        403 Apr 08  2014 readme.txt

Puedes "parsear" ese fichero linea a linea para saber que ficheros tienes que bajar, y luego bajar uno a uno.

 

Saludos

 

PD: Me tengo que instalar delphi en una maquina virtual, muchas veces me quedo con ganas de responder en el foro por no disponer de un Delphi a mano :(


  • 1

#19 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 24 octubre 2019 - 05:34

Buenas otra vez. Al final he instalado Delphi y lo he probado.

 

Parece ser que hay que añadir una opcion mas:


php
  1. if curl_easy_setopt(Curl, CURLOPT_DIRLISTONLY, TRUE) <> CURLE_OK then
  2.       Exit;

Y asi el listado que se descarga ya solo tiene los nombres de los fichero, lo que es mas fácil de procesar


php
  1. .
  2. ..
  3. aspnet_client
  4. pub
  5. readme.txt


  • 0

#20 Ana

Ana

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 25 octubre 2019 - 04:56

Buenas otra vez. Al final he instalado Delphi y lo he probado.
 
Parece ser que hay que añadir una opcion mas:


delphi
  1. if curl_easy_setopt(Curl, CURLOPT_DIRLISTONLY, TRUE) <> CURLE_OK then
  2.       Exit;

Y asi el listado que se descarga ya solo tiene los nombres de los fichero, lo que es mas fácil de procesar

delphi
  1. .
  2. ..
  3. aspnet_client
  4. pub
  5. readme.txt

 
Hola 
he probado, pero alguna cosa me falta, mejor dicho, no sé como obtener la lista, el codigo que tengo es el siguiente
 
 

delphi
  1. function DameFichero_SFTP(servidor,Usuario, Clave, ruta: AnsiString): integer;
  2.  
  3. var
  4.  
  5.   Curl: TCURL;
  6.  
  7.   Stream: TMemoryStream;
  8.  
  9.   respuesta:curlcode;
  10.  
  11. begin
  12.   servidor:='sftp://'+servidor+'/'+ruta+'/';
  13.   Curl:= curl_easy_init;
  14.   if Curl <> nil then
  15.   try
  16.     if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
  17.       Exit;
  18.     if curl_easy_setopt(Curl, CURLOPT_USE_SSL, CURLUSESSL_ALL) <> CURLE_OK then
  19.       Exit;
  20.     // No verificamos la identidad del servidor, suponemos que es quien dice ser
  21.     if curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, FALSE) <> CURLE_OK then
  22.       Exit;
  23.     if curl_easy_setopt(Curl, CURLOPT_USERNAME, PAnsiChar(Usuario)) <> CURLE_OK then
  24.       Exit;
  25.     if curl_easy_setopt(Curl, CURLOPT_PASSWORD, PAnsiChar(Clave)) <> CURLE_OK then
  26.       Exit;
  27.     if curl_easy_setopt(Curl, CURLOPT_URL, PChar(servidor)) <> CURLE_OK then
  28.       Exit;
  29.  
  30.  
  31.     if curl_easy_setopt(Curl, CURLOPT_DIRLISTONLY, true) <> CURLE_OK then
  32.       Exit;
  33.  
  34.  
  35.     try
  36.        respuesta:=curl_easy_perform(Curl);
  37.     finally
  38.     end;
  39.   finally
  40.     curl_easy_cleanup(Curl);
  41.   end;
  42. end;

 
ruta es la carpeta de la ftp que tengo que leer, la respuesta que me devuelve es curle_ok, pero ahora no sé como leer o guarda la lista , porque si pongo lo siguiente
 

 if curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, @SaveToStream) <> CURLE_OK then
        Exit;
 
para guardar el listado en un stream me da un acces violation.
  • 0