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
(AutoIt) SSH ReceiveUntilMatchNDemonstrates how to call the SSH ChannelReceiveUntilMatchN method.
; This example assumes the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. $oSsh = ObjCreate("Chilkat.Ssh") Local $bSuccess ; For the sake of the example, pretend the remote shell prompt ; will be any of the following: $oSaPrompts = ObjCreate("Chilkat.StringArray") $oSaPrompts.Append("~$") $oSaPrompts.Append("mars#") $oSaPrompts.Append("jupiter%") $oSaPrompts.Append("chilkat$") $oSaPrompts.Append("admin>") Local $sCmdOutput ; Connect to an SSH server: ; Hostname may be an IP address or hostname: Local $sHostname = "www.some-ssh-server.com" Local $iPort = 22 $bSuccess = $oSsh.Connect($sHostname,$iPort) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Wait a max of 10 seconds when reading responses.. $oSsh.IdleTimeoutMs = 10000 ; Authenticate using login/password: $bSuccess = $oSsh.AuthenticatePw("myLogin","myPassword") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Open a session channel. (It is possible to have multiple ; session channels open simultaneously.) Local $iChannelNum = $oSsh.OpenSessionChannel() If ($iChannelNum < 0) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf Local $sTermType = "dumb" Local $iWidthInChars = 120 Local $iHeightInChars = 40 ; Use 0 for pixWidth and pixHeight when the dimensions ; are set in number-of-chars. Local $iPixWidth = 0 Local $iPixHeight = 0 $bSuccess = $oSsh.SendReqPty($iChannelNum,$sTermType,$iWidthInChars,$iHeightInChars,$iPixWidth,$iPixHeight) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Start a shell on the channel: $bSuccess = $oSsh.SendReqShell($iChannelNum) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Run the 1st command in the remote shell, which will be to ; "cd" to a subdirectory. $bSuccess = $oSsh.ChannelSendString($iChannelNum,"cd workspace" & @LF,"utf-8") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Retrieve the output to the next prompt: Local $bCaseSensitiveMatch = True $bSuccess = $oSsh.ChannelReceiveUntilMatchN($iChannelNum,$oSaPrompts,"utf-8",$bCaseSensitiveMatch) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Display what we've received so far. This clears ; the internal receive buffer, which is important. ; After we send the command, we'll be reading until ; the next command prompt. If the command prompt ; is already in the internal receive buffer, it'll think it's ; already finished... $sCmdOutput = $oSsh.GetReceivedText($iChannelNum,"utf-8") If ($oSsh.LastMethodSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ConsoleWrite($sCmdOutput & @CRLF) ; Run the 2nd command in the remote shell, which will be ; to "ls" the directory. $bSuccess = $oSsh.ChannelSendString($iChannelNum,"ls" & @LF,"utf-8") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Retrieve and display the output. $bSuccess = $oSsh.ChannelReceiveUntilMatchN($iChannelNum,$oSaPrompts,"utf-8",$bCaseSensitiveMatch) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf $sCmdOutput = $oSsh.GetReceivedText($iChannelNum,"utf-8") If ($oSsh.LastMethodSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ConsoleWrite($sCmdOutput & @CRLF) ; Start the final command in the remote shell. This example ; will send a "ls -l" command to retrieve the long format directory listing. $bSuccess = $oSsh.ChannelSendString($iChannelNum,"ls -l" & @LF,"utf-8") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Send an EOF. This tells the server that no more data will ; be sent on this channel. The channel remains open, and ; the SSH client may still receive output on this channel. $bSuccess = $oSsh.ChannelSendEof($iChannelNum) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Read whatever output may already be available on the ; SSH connection. ChannelReadAndPoll returns the number of bytes ; that are available in the channel's internal buffer that ; are ready to be "picked up" by calling GetReceivedText ; or GetReceivedData. ; A return value of -1 indicates failure. ; A return value of -2 indicates a failure via timeout. ; The ChannelReadAndPoll method waits ; for data to arrive on the connection usingi the IdleTimeoutMs ; property setting. Once the first data arrives, it continues ; reading but instead uses the pollTimeoutMs passed in the 2nd argument: ; A return value of -2 indicates a timeout where no data is received. Local $iPollTimeoutMs = 2000 Local $iN = $oSsh.ChannelReadAndPoll($iChannelNum,$iPollTimeoutMs) If ($iN < 0) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Close the channel: $bSuccess = $oSsh.ChannelSendClose($iChannelNum) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Perhaps we did not receive all of the commands output. ; To make sure, call ChannelReceiveToClose to accumulate any remaining ; output until the server's corresponding "channel close" is received. $bSuccess = $oSsh.ChannelReceiveToClose($iChannelNum) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf $sCmdOutput = $oSsh.GetReceivedText($iChannelNum,"utf-8") If ($oSsh.LastMethodSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ConsoleWrite($sCmdOutput & @CRLF) ; Disconnect $oSsh.Disconnect |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.