Delphi ActiveX
Delphi ActiveX
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 Delphi ActiveX Downloads
var
success: Integer;
ssh: TChilkatSsh;
sshPort: Integer;
password: WideString;
channelNum: Integer;
exitStatus: Integer;
begin
success := 0;
// 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 1, call GetChannelExitStatus to read the value.
ssh := TChilkatSsh.Create(Self);
sshPort := 22;
success := ssh.Connect('ssh.example.com',sshPort);
if (success = 0) then
begin
Memo1.Lines.Add(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 = 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
channelNum := ssh.OpenSessionChannel();
if (channelNum < 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
success := ssh.SendReqExec(channelNum,'test -f /etc/hosts');
if (success = 0) then
begin
Memo1.Lines.Add(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 = 0) then
begin
Memo1.Lines.Add(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);
Memo1.Lines.Add('Exit status: ' + IntToStr(exitStatus));
end
else
begin
Memo1.Lines.Add('The server did not provide an exit status.');
end;
ssh.Disconnect();