Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

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 Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.StringArray,
  Chilkat.StringBuilder,
  Chilkat.Ssh;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  ssh: TSsh;
  channelNum: Integer;
  saMatch: TStringArray;
  sbReceived: TStringBuilder;
  moreComing: Boolean;

begin
  success := False;

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

  ssh := TSsh.Create;

  success := ssh.Connect('SSH_SERVER_DOMAIN_OR_IP_ADDRESS',22);
  if (success <> True) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  Authenticate using login/password:
  success := ssh.AuthenticatePw('myLogin','myPassword');
  if (success <> True) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  Start a shell session.
  channelNum := ssh.QuickShell();
  if (channelNum < 0) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  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..)
  success := ssh.ChannelReceiveUntilMatch(channelNum,'>','utf-8',True);
  if (success <> True) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  Show what we received so far:
  WriteLn(ssh.GetReceivedText(channelNum,'utf-8'));

  //  Send the "ena" command to enable privileged mode.
  //  (For the Cisco switch, terminate command with a single CR char.)
  success := ssh.ChannelSendString(channelNum,'ena' + #13,'utf-8');
  //  Assume success for this example to make it shorter..

  //  Read to the "Password:" prompt.
  success := ssh.ChannelReceiveUntilMatch(channelNum,'Password:','utf-8',True);
  if (success <> True) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  Show what we received...
  WriteLn(ssh.GetReceivedText(channelNum,'utf-8'));

  //  Send the password.
  success := ssh.ChannelSendString(channelNum,'MY_PASSWORD_FOR_ELEVATED_PRIVILEGE' + #13,'utf-8');

  //  The prompt now changes from "Something>" to "Something#>
  //  Read until the new prompt..
  success := ssh.ChannelReceiveUntilMatch(channelNum,'#','utf-8',True);
  if (success <> True) then
    begin
      WriteLn(ssh.LastErrorText);
      Exit;
    end;

  //  Show what we received...
  WriteLn(ssh.GetReceivedText(channelNum,'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.
  success := ssh.ChannelSendString(channelNum,'show running-config' + #13,'utf-8');

  //  Consume the response until we end with another prompt.
  saMatch := TStringArray.Create;
  //  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...
  saMatch.Append('YOUR_PROMPT#');
  saMatch.Append('--More--');

  sbReceived := TStringBuilder.Create;
  moreComing := True;
  while (moreComing = True) do
    begin

      success := ssh.ChannelReceiveUntilMatchN(channelNum,saMatch,'utf-8',True);
      if (success <> True) then
        begin
          WriteLn(ssh.LastErrorText);
          Exit;
        end;

      moreComing := False;

      sbReceived.Clear();
      sbReceived.Append(ssh.GetReceivedText(channelNum,'utf-8'));

      WriteLn(sbReceived.GetAsString());

      if (sbReceived.Contains('--More--',True) = True) then
        begin
          moreComing := True;

          //  Send a SPACE char just as if we were interactively pressing the SPACE key to get more output.
          success := ssh.ChannelSendString(channelNum,' ','utf-8');
        end;

    end;

  ssh.Disconnect();


  ssh.Free;
  saMatch.Free;
  sbReceived.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.