Delphi ActiveX
Delphi ActiveX
Set an Environment Variable on an SSH Channel
See more SSH Examples
Demonstrates the Chilkat Ssh.SendReqSetEnv method, which asks the server to set an environment variable for a session channel. The arguments are the channel number, the variable name, and its value. Send these requests before the exec, shell, or subsystem request.
Background: This is the clean way to pass configuration to a remote command without embedding it in the command line. Be aware that many SSH servers restrict which variables clients may set (OpenSSH's
AcceptEnv), so a request can be silently ignored or rejected — do not rely on it without verifying the server's policy.Chilkat Delphi ActiveX Downloads
var
success: Integer;
ssh: TChilkatSsh;
sshPort: Integer;
password: WideString;
channelNum: Integer;
output: WideString;
begin
success := 0;
// Demonstrates the Ssh.SendReqSetEnv method, which asks the server to set an environment
// variable for a session channel. The 1st argument is the channel number, the 2nd is the
// variable name, and the 3rd is its value. Send it before the exec, shell, or subsystem
// request.
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;
// Open a session channel. A negative return value indicates failure.
channelNum := ssh.OpenSessionChannel();
if (channelNum < 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
// Set environment variables for the channel. Multiple variables may be requested.
success := ssh.SendReqSetEnv(channelNum,'LANG','en_US.UTF-8');
if (success = 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
success := ssh.SendReqSetEnv(channelNum,'MY_APP_MODE','production');
if (success = 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
// Now run the command, which sees the requested environment.
success := ssh.SendReqExec(channelNum,'echo $MY_APP_MODE');
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;
output := ssh.GetReceivedText(channelNum,'utf-8');
if (ssh.LastMethodSuccess = 0) then
begin
Memo1.Lines.Add(ssh.LastErrorText);
Exit;
end;
Memo1.Lines.Add(output);
ssh.Disconnect();