Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Tcl) TCP or TLS over Multiple Hop SSH to Remote ServerDemonstrates how to use the Chilkat Socket API to connect to a remote server (using TCP or TLS) tunneled through mulitple-hop SSH. The scheme looks like this: Application => ServerSSH1 => ServerSSH2 => DestinationServer The ConnectThroughSsh and UseSsh methods are added in Chilkat version 9.5.0.55 to accomplish this task.
load ./chilkat.dll # This example requires the Chilkat API to have been previously unlocked. # See Global Unlock Sample for sample code. set ssh1 [new_CkSsh] # Connect directly to the 1st SSH server. set success [CkSsh_Connect $ssh1 "serverssh1.com" 22] if {$success != 1} then { puts [CkSsh_lastErrorText $ssh1] delete_CkSsh $ssh1 exit } # Authenticate using login/password: set success [CkSsh_AuthenticatePw $ssh1 "ssh1Login" "ssh1Password"] if {$success != 1} then { puts [CkSsh_lastErrorText $ssh1] delete_CkSsh $ssh1 exit } # Connect through the 1st SSH connection to reach a 2nd SSH server. # Note: Any number of SSH connections may be simultaneously tunneled through a single # existing SSH connection. set ssh2 [new_CkSsh] set success [CkSsh_ConnectThroughSsh $ssh2 $ssh1 "serverssh2.com" 22] if {$success != 1} then { puts [CkSsh_lastErrorText $ssh2] delete_CkSsh $ssh1 delete_CkSsh $ssh2 exit } # Authenticate with ssh2... set success [CkSsh_AuthenticatePw $ssh2 "ssh2Login" "ssh2Password"] if {$success != 1} then { puts [CkSsh_lastErrorText $ssh2] delete_CkSsh $ssh1 delete_CkSsh $ssh2 exit } set socket [new_CkSocket] # Tell the socket object to connect to our destination server though the ssh2 tunnel (which itself is routed through ssh1). # The connection looks like this: ApplicationSocket(TLS) => ServerSSH1 => ServerSSH2 => DestinationServer set success [CkSocket_UseSsh $socket $ssh2] if {$success != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } # Connect using TLS to www.chilkatsoft.com # We could also tunnel a bare TCP connection by specifying port 80 with useTls = 0. set useTls 1 set maxWaitMillisec 20000 set success [CkSocket_Connect $socket "www.chilkatsoft.com" 443 $useTls $maxWaitMillisec] if {$success != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } # Once the multiple hop SSH tunneled connection is setup, the socket programming # is identical to the normal case where we have a direct connection. # Tell the socket object that all text is to be sent in the utf-8 encoding, # and the text received is assumed to be utf-8. CkSocket_put_StringCharset $socket "utf-8" # Send an HTTP HEAD request: set success [CkSocket_SendString $socket "HEAD / HTTP/1.1\r\nHost: www.chilkatsoft.com\r\n\r\n"] if {$success != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } # Wait a maximum of 4 seconds while no data is forthcoming: CkSocket_put_MaxReadIdleMs $socket 4000 # Get the 1st response line, which should be "HTTP/1.1 200 OK" set responseStatusLine [CkSocket_receiveToCRLF $socket] if {[CkSocket_get_LastMethodSuccess $socket] != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } puts "StatusLine: $responseStatusLine" # Now get the 1st line of the response header: set responseHeaderLine [CkSocket_receiveToCRLF $socket] if {[CkSocket_get_LastMethodSuccess $socket] != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } puts "HeaderLine: $responseHeaderLine" # Now read the remainder of the response header by reading until a double CRLF is seen: set remainderOfHeader [CkSocket_receiveUntilMatch $socket "\r\n\r\n"] if {[CkSocket_get_LastMethodSuccess $socket] != 1} then { puts [CkSocket_lastErrorText $socket] delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket exit } puts "Remainder: $remainderOfHeader" # Close the connection with the server. This closes the tunnel through ssh2. # Wait a max of 20 seconds (20000 millsec) set success [CkSocket_Close $socket 20000] # Close the connection with ssh2. (This closes the the tunnel through ssh1.) # The connection with ssh1 is still alive, and may be used for more connections. CkSsh_Disconnect $ssh2 CkSsh_Disconnect $ssh1 delete_CkSsh $ssh1 delete_CkSsh $ssh2 delete_CkSocket $socket |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.