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 Remote Shell Multiple CommandsDemonstrates how to start a shell on a remote SSH server, run a command, and retrieve the output, then run the next command, retrieve the output, etc.
; This example assumes the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. $oSsh = ObjCreate("Chilkat.Ssh") ; This is the prompt we'll be expecting to find in ; the output of the remote shell. Local $sMyPrompt $sMyPrompt = "chilkat@ubuntu:~/workspace$" Local $sCmdOutput ; Connect to an SSH server: Local $sHostname Local $iPort ; Hostname may be an IP address or hostname: $sHostname = "www.some-ssh-server.com" $iPort = 22 Local $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 $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" & @CRLF,"ansi") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Retrieve the output. $bSuccess = $oSsh.ChannelReceiveUntilMatch($iChannelNum,$sMyPrompt,"ansi",True) 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,"ansi") 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" & @CRLF,"ansi") If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf ; Retrieve and display the output. $bSuccess = $oSsh.ChannelReceiveUntilMatch($iChannelNum,$sMyPrompt,"ansi",True) If ($bSuccess <> True) Then ConsoleWrite($oSsh.LastErrorText & @CRLF) Exit EndIf $sCmdOutput = $oSsh.GetReceivedText($iChannelNum,"ansi") 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" & @CRLF,"ansi") 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 $iN Local $iPollTimeoutMs = 2000 $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,"ansi") 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.