I'm attempting to use the TProcess unit to execute ssh to connect to one of my servers and provide me with the shell. It's a rewrite of one I had in Ruby as the execution time for Ruby is very slow. When I run my Process.Execute function, I am presented with the shell but it is immediately backgrounded. Running pgrep ssh
reveals that it is running but I have no access to it whatsoever, using fg
does not bring it back. The code is as follows for this segment:
if HasOption('c', 'connect') then begin
TempFile:= GetRecord(GetOptionValue('c', 'connect'));
AProcess:= TProcess.Create(nil);
AProcess.Executable:= '/usr/bin/ssh';
AProcess.Parameters.Add('-p');
AProcess.Parameters.Add(TempFile.Port);
AProcess.Parameters.Add('-ntt');
AProcess.Parameters.Add(TempFile.Username + '@' + TempFile.Address);
AProcess.Options:= [];
AProcess.ShowWindow:= swoShow;
AProcess.InheritHandles:= False;
AProcess.Execute;
AProcess.Free;
Terminate;
Exit;
end;
TempFile
is a variable of type TProfile
, which is a record containing information about the server. The cataloging system and retrieval works fine, but pulling up the shell does not.
You're starting the process but not waiting for it to exit. This is from the documentation on
Execute
:You should set the
poWaitOnExit
option in options before callingExecute
, so that Execute will block until the process exits. Or else callAProcess.WaitOnExit
to explicitly wait for the process to exit.