Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
Check Whether an SSH Exit Status Was Received
See more SSH Examples
Demonstrates the Chilkat Ssh.ChannelReceivedExitStatus method, which reports whether the server supplied an exit-status value for a channel. The only argument is the channel number. When it returns true, call GetChannelExitStatus to read the value.
Background: Always test this before reading the exit status, because the server is not required to send one for every channel type or command — treating a missing status as "0" would silently turn a failure into a success. Exit status is independent of EOF and CLOSE: it can arrive after EOF and either before or together with CLOSE.
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.Ssh;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
ssh: TSsh;
sshPort: Integer;
password: string;
channelNum: Integer;
exitStatus: Integer;
begin
success := False;
// Demonstrates the Ssh.ChannelReceivedExitStatus method, which reports whether the server
// supplied an exit-status value for a channel. The only argument is the channel number. When
// it returns True, call GetChannelExitStatus to read the value.
ssh := TSsh.Create;
sshPort := 22;
success := ssh.Connect('ssh.example.com',sshPort);
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// Normally you would not hard-code the password in source. You should instead obtain it
// from an interactive prompt, environment variable, or a secrets vault.
password := 'mySshPassword';
success := ssh.AuthenticatePw('mySshLogin',password);
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
channelNum := ssh.OpenSessionChannel();
if (channelNum < 0) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
success := ssh.SendReqExec(channelNum,'test -f /etc/hosts');
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// IMPORTANT: Set a read timeout. ReadTimeoutMs defaults to 0, which means no limit -- without
// it, this call waits forever if the server never sends channel close.
ssh.ReadTimeoutMs := 15000;
success := ssh.ChannelReceiveToClose(channelNum);
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// The server is not required to send an exit status for every channel type or command.
if (ssh.ChannelReceivedExitStatus(channelNum)) then
begin
exitStatus := ssh.GetChannelExitStatus(channelNum);
WriteLn('Exit status: ' + exitStatus);
end
else
begin
WriteLn('The server did not provide an exit status.');
end;
ssh.Disconnect();
ssh.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.