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 downloaden

    Plinkremote1->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


Anmelden zum Antworten