SSH Verbindung aufbauen
-
hallo,
gibt es in VCL ein Objekt zur SSH Verbindung ?
Wenn ja, wie kann ich eine SSH Port Forwarding einrichten, den Port einstellen und das SSH Protocoll auf Version 2 einstellen?
gruß,
Günther
-
-
gibt es keine andere lösung für c++ builder ?
-
Günther571 schrieb:
gibt es keine andere lösung für c++ builder ?
Was spricht gegen openssl? Hier mal ein paar Auszüge aus meiner eigenen Klassen:
SSL_LIB_ERROR SSL_SOCKET::initialize_ctx( void ) { char progPath[10240]; const char *kf; char *theKeyfile, *caFile; static bool first = true; GetModuleFileName( NULL, progPath, 10240 ); sslLibraryError = SSL_NO_ERROR; SSL_METHOD *meth; /* Global system initialization*/ if( first ) { SSL_library_init(); SSL_load_error_strings(); first = false; } /* Create our context*/ meth=SSLv23_method(); ctx=SSL_CTX_new(meth); /* Load our keys and certificates*/ if( !keyfile[0U] ) kf = DEF_KEYFILE; else kf = keyfile; if( access( kf, 00 ) ) theKeyfile = makeFullPath( progPath, kf ); else theKeyfile = strdup( kf ); if( access( CA_LIST, 00 ) ) caFile = makeFullPath( progPath, CA_LIST ); else caFile = strdup( CA_LIST ); if( SSL_CTX_use_certificate_chain_file(ctx, theKeyfile) ) { pass=password; SSL_CTX_set_default_passwd_cb( ctx, password_cb ); if( SSL_CTX_use_PrivateKey_file( ctx, theKeyfile, SSL_FILETYPE_PEM ) ) { /* Load the CAs we trust*/ if( SSL_CTX_load_verify_locations(ctx, caFile,0) ) { #if (OPENSSL_VERSION_NUMBER < 0x00905100L) SSL_CTX_set_verify_depth(ctx,1); #endif } else sslLibraryError = BAD_CA_LIST; } else sslLibraryError = BAD_KEY_FILE; } else sslLibraryError = BAD_CERT_FILE; free( caFile ); free( theKeyfile ); return sslLibraryError; } int SSL_SOCKET::connect( const char *server, int port, size_t bufferSize ) { STRING theServer = server; int thePort = port; bool useProxy = false; STRING proxyRequest; int sslStatus; if( proxy[0U] && strcmpi( theServer, "localhost" ) ) { theServer = proxy; thePort = proxyPort; useProxy = true; proxyRequest = "CONNECT "; proxyRequest += server; proxyRequest += ':'; port >> proxyRequest; proxyRequest += " HTTP/1.1\r\n\r\n"; } sslLibraryError = initialize_ctx(); if( sslLibraryError == SSL_NO_ERROR ) { if( !SOCKET_STREAM::connect( theServer, thePort, bufferSize ) ) { if( useProxy ) { STRING result; SOCKET_STREAM::sendData( proxyRequest, proxyRequest.strlen() ); SOCKET_STREAM::getNextLine(); flush(); } ssl=SSL_new( ctx ); sbio=BIO_new_socket( getSocket(), BIO_NOCLOSE ); SSL_set_bio( ssl, sbio, sbio ); if( (sslStatus = SSL_connect( ssl )) > 0 ) { // if( require_server_auth ) // check_cert( ssl, server ); } else { sslLibraryError = SSL_LAYER_ERROR; sslLayerError = sslStatus; } } else { sslLibraryError = SSL_SOCKET_ERROR; } } if( sslLibraryError ) theErrorText = "Connect failed"; return sslLibraryError; } int SSL_SOCKET::sendData( const char *data, size_t numData ) { if( ssl ) { clock_t sendTime = clock(); sslLibraryError = SSL_NO_ERROR; int r, sslStatus, request_len = numData; r=SSL_write(ssl,data,request_len); sslStatus = SSL_get_error(ssl,r); switch( sslStatus ) { case SSL_ERROR_NONE: if(request_len!=r) sslLibraryError = SSL_INCOMPLETE; break; default: sslLibraryError = SSL_LAYER_ERROR; sslLayerError = sslStatus; } this->sendTime += clock()-sendTime; if( sslLibraryError ) theErrorText = "Send failed"; return sslLibraryError; } else return SOCKET_STREAM::sendData( data, numData ); } void SSL_SOCKET::receiveData( void ) { if( ssl ) { int count; clock_t receiveTime = clock(); if( connected ) { if( dataBuffer ) { count=SSL_read( ssl, dataBuffer, bufferSize ); if( count > 0 ) { numData = count; dbPointer = dataBuffer; } else if( cout < 0 ) { theErrorText = "Receive failed"; } } } this->receiveTime += clock() - receiveTime; } else SOCKET_STREAM::receiveData(); } void SSL_SOCKET::disconnect( void ) { if( ssl ) { SSL_shutdown(ssl); SSL_free(ssl); ssl = NULL; } if( ctx ) { SSL_CTX_free(ctx); ctx = NULL; } SOCKET_STREAM::disconnect(); }
mfg Martin
-
Günther571 schrieb:
gibt es keine andere lösung für c++ builder ?
Was ist dein Problem mit der Delphi-Komponente?
-
mgaeckler schrieb:
Was spricht gegen openssl? Hier mal ein paar Auszüge aus meiner eigenen Klassen:
Der Provider hat SSH festgelegt, um auf eine MySQL DAtenbank zuzugeriefen
audacia schrieb:
Was ist dein Problem mit der Delphi-Komponente?
ich kann den für den C++ Builder nicht übernehmen, kann mir jemand helfen zahle auch geld
-
Guenther571 schrieb:
mgaeckler schrieb:
Was spricht gegen openssl? Hier mal ein paar Auszüge aus meiner eigenen Klassen:
Der Provider hat SSH festgelegt, um auf eine MySQL DAtenbank zuzugeriefen
Ah, sorry, da hab ich jetzt SSH und SSL durcheinander gewürfelt. Probier's halt dann mit OpenSSH.
mfg Martin
-
Hallo,
die Delphi-Komponente ist zwar abhängig von plink, aber wie ich finde einfach in der Bedienung.
void __fastcall TForm1::ConnectSSH() { Plinkremote1->exe_parameters = "hostname -l username -pw mypassword"; Plinkremote1->exe_directory = "d:\\Putty"; Plinkremote1->exe_name = "plink.exe"; Plinkremote1->execute(); Plinkremote1.write_string("Irgendein Text" + #13); //#13 ist der char für <ENTER> } void __fastcall TForm1::Plinkremote1DataAvailable(TObject *Sender, string buffer) { Memo1->Lines->Add(buffer) }
LG
-
Guenther571 schrieb:
audacia schrieb:
Was ist dein Problem mit der Delphi-Komponente?
ich kann den für den C++ Builder nicht übernehmen
Freilich kannst du. C++Builder kann auch Delphi-Komponenten kompilieren. Einfach die *.pas-Datei zum Projekt hinzufügen. Bei der nächsten Kompilierung erzeugt der Compiler dann eine *.hpp-Datei, die du einbinden kannst, und fertig.
-
ok hab das ins projekt geaddet und compiliert. Aber wie mach ich weiter??
-
Hallo,
so wie es dasteht. Du bindest nun die erzeugte *.hpp in dein Projekt ein und baust mit oben gezeigtem Code die Verbindung auf. Die Kommunikation passiert - wenn ich das richtig verstanden habe - textbasiert.
Plinkremote1.write_string("ls" + #13); //oder Plinkremote1.write_string("mkdir" + #13);
Nicht zu vergessen ist hierbei dass die plink.exe aus dem PuTTY-Projekt vorhanden sein muss.
Hier kannst du sie downloadenPlinkremote1->exe_directory = "d:\\Putty"; //Pfad zu plink.exe Plinkremote1->exe_name = "plink.exe"; //Dateiname der plink.exe
LG
-
ok vielen dank!.. nur ein problem hab ich, wie initialisier ich Plinkremote1 ?
habe es so versucht:
Plinkremote Plinkremote1 = new Plinkremote();
sry bin noch anfänger
gruß
Günther
-
Hallo,
da bin ich jetzt auch überfragt. Ich hab den Quellcode nicht. Schau mal in der *.hpp wie der Konstruktor aussieht.
Laut Quellcodebeispiel würd ich aber sowas in der Art versuchen:
TPlinkremote *Plinkremote1 = new TPlinkremote(/*(owner)*/);
VlG