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