AutoIt
AutoIt
TCP Socket through SSH Tunnel (Port Forwarding)
See more Socket/SSL/TLS Examples
Demonstrates using Chilkat Socket to communicate to a TCP service through an SSH tunnel. This example will connect to an NIST time server and (using the old Time Protocol (RFC 868)), will read the current GMT time.Note: This is not necessarily a recommended means for getting the current date/time. The most commonly used time protocol is the Network Time Protocol (RFC-1305). The intent of this example is to show how TCP communications can occur through an SSH tunnel.
Chilkat AutoIt Downloads
Local $bSuccess = False
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
$oTunnel = ObjCreate("Chilkat.Socket")
Local $sshHostname = "sftp.example.com"
Local $iSshPort = 22
; Connect to an SSH server and establish the SSH tunnel:
$bSuccess = $oTunnel.SshOpenTunnel($sshHostname,$iSshPort)
If ($bSuccess = False) Then
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
Exit
EndIf
; Authenticate with the SSH server via a login/password
; or with a public key.
; This example demonstrates SSH password authentication.
$bSuccess = $oTunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
If ($bSuccess = False) Then
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
Exit
EndIf
; OK, the SSH tunnel is setup. Now open a channel within the tunnel.
; Once the channel is obtained, the Socket API may
; be used exactly the same as usual, except all communications
; are sent through the channel in the SSH tunnel.
; Any number of channels may be created from the same SSH tunnel.
; Multiple channels may coexist at the same time.
; Connect to an NIST time server and read the current date/time
Local $iMaxWaitMs = 4000
Local $bUseTls = False
$oChannel = ObjCreate("Chilkat.Socket")
$bSuccess = $oTunnel.SshNewChannel("time-c.nist.gov",37,$bUseTls,$iMaxWaitMs,$oChannel)
If ($bSuccess = False) Then
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
Exit
EndIf
; The time server will send a big-endian 32-bit integer representing
; the number of seconds since since 00:00 (midnight) 1 January 1900 GMT.
; The ReceiveInt32 method will receive a 4-byte integer, but returns
; True or False to indicate success. If successful, the integer
; is obtained via the ReceivedInt property.
Local $bigEndian = True
$bSuccess = $oChannel.ReceiveInt32($bigEndian)
If ($bSuccess = False) Then
ConsoleWrite($oChannel.LastErrorText & @CRLF)
Exit
EndIf
$oDt = ObjCreate("Chilkat.CkDateTime")
$oDt.SetFromNtpTime($oChannel.ReceivedInt)
; Show the current local date/time
Local $bLocalTime = True
ConsoleWrite("Current local date/time: " & $oDt.GetAsRfc822($bLocalTime) & @CRLF)
; Close the SSH channel.
$bSuccess = $oChannel.Close($iMaxWaitMs)
If ($bSuccess <> True) Then
ConsoleWrite($oChannel.LastErrorText & @CRLF)
Exit
EndIf
; It is possible to create a new channel from the existing SSH tunnel for the next connection:
; Any number of channels may be created from the same SSH tunnel.
; Multiple channels may coexist at the same time.
$bSuccess = $oTunnel.SshNewChannel("time-a.nist.gov",37,$bUseTls,$iMaxWaitMs,$oChannel)
If ($bSuccess = False) Then
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
Exit
EndIf
; Review the LastErrorText to see that the connection was made via the SSH tunnel:
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
; Close the connection to time-a.nist.gov. This is actually closing our channel
; within the SSH tunnel, but keeps the tunnel open for the next port-forwarded connection.
$bSuccess = $oChannel.Close($iMaxWaitMs)
If ($bSuccess <> True) Then
ConsoleWrite($oChannel.LastErrorText & @CRLF)
Exit
EndIf
; Finally, close the SSH tunnel.
$bSuccess = $oTunnel.SshCloseTunnel()
If ($bSuccess = False) Then
ConsoleWrite($oTunnel.LastErrorText & @CRLF)
Exit
EndIf
ConsoleWrite("TCP SSH tunneling example completed." & @CRLF)