Sample code for 30+ languages & platforms
Lianja

SSH to Cisco Switch - Processing "More" Responses

See more SSH Examples

Demonstrates connecting to a Cisco switch, running a command to enable privileged mode, then running a command to get a paged response requiring the SPACE char to be sent to process "--More--".

Chilkat Lianja Downloads

Lianja
llSuccess = .F.

// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

loSsh = createobject("CkSsh")

llSuccess = loSsh.Connect("SSH_SERVER_DOMAIN_OR_IP_ADDRESS",22)
if (llSuccess <> .T.) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// Authenticate using login/password:
llSuccess = loSsh.AuthenticatePw("myLogin","myPassword")
if (llSuccess <> .T.) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// Start a shell session.
lnChannelNum = loSsh.QuickShell()
if (lnChannelNum < 0) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// If the CISCO switch returns a prompt with ">", then read until we get the prompt.
// (It's not actually required that we do this, but it helps to know that all is OK at this point..)
llSuccess = loSsh.ChannelReceiveUntilMatch(lnChannelNum,">","utf-8",.T.)
if (llSuccess <> .T.) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// Show what we received so far:
? loSsh.GetReceivedText(lnChannelNum,"utf-8")

// Send the "ena" command to enable privileged mode.
// (For the Cisco switch, terminate command with a single CR char.)
llSuccess = loSsh.ChannelSendString(lnChannelNum,"ena" + Chr(13),"utf-8")
// Assume success for this example to make it shorter..

// Read to the "Password:" prompt.
llSuccess = loSsh.ChannelReceiveUntilMatch(lnChannelNum,"Password:","utf-8",.T.)
if (llSuccess <> .T.) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// Show what we received...
? loSsh.GetReceivedText(lnChannelNum,"utf-8")

// Send the password.
llSuccess = loSsh.ChannelSendString(lnChannelNum,"MY_PASSWORD_FOR_ELEVATED_PRIVILEGE" + Chr(13),"utf-8")

// The prompt now changes from "Something>" to "Something#>
// Read until the new prompt..
llSuccess = loSsh.ChannelReceiveUntilMatch(lnChannelNum,"#","utf-8",.T.)
if (llSuccess <> .T.) then
    ? loSsh.LastErrorText
    release loSsh
    return
endif

// Show what we received...
? loSsh.GetReceivedText(lnChannelNum,"utf-8")

// Send the "show running-config" command.
// The response will be in multiple pages, each ending with "--More--" and requiring a SPACE bar to be sent
// to get the next page.
llSuccess = loSsh.ChannelSendString(lnChannelNum,"show running-config" + Chr(13),"utf-8")

// Consume the response until we end with another prompt.
loSaMatch = createobject("CkStringArray")
// Change "YOUR_PROMPT" to your actual prompt.  We don't want to check for only "#" because
// it's not specific enough.  The data in the response could contain the "#" char...
loSaMatch.Append("YOUR_PROMPT#")
loSaMatch.Append("--More--")

loSbReceived = createobject("CkStringBuilder")
llMoreComing = .T.
do while (llMoreComing = .T.)

    llSuccess = loSsh.ChannelReceiveUntilMatchN(lnChannelNum,loSaMatch,"utf-8",.T.)
    if (llSuccess <> .T.) then
        ? loSsh.LastErrorText
        release loSsh
        release loSaMatch
        release loSbReceived
        return
    endif

    llMoreComing = .F.

    loSbReceived.Clear()
    loSbReceived.Append(loSsh.GetReceivedText(lnChannelNum,"utf-8"))

    ? loSbReceived.GetAsString()

    if (loSbReceived.Contains("--More--",.T.) = .T.) then
        llMoreComing = .T.

        // Send a SPACE char just as if we were interactively pressing the SPACE key to get more output.
        llSuccess = loSsh.ChannelSendString(lnChannelNum," ","utf-8")
    endif

enddo

loSsh.Disconnect()


release loSsh
release loSaMatch
release loSbReceived