我正在尝试使用TProcess单元执行ssh连接到我的一台服务器并向我提供shell。它重写了我在Ruby中的一个,因为Ruby的执行时间非常慢。当我运行我的Process.Execute函数时,我会看到shell,但它会立即显示为背景。运行pgrep ssh
会显示它正在运行但我无法访问它,使用fg
不会将其恢复。此段的代码如下:
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
是TProfile
类型的变量,它是包含有关服务器信息的记录。编目系统和检索工作正常,但拔出shell并没有。
答案 0 :(得分:1)
...
AProcess.ShowWindow:= swoShow;
AProcess.InheritHandles:= False;
AProcess.Execute;
AProcess.Free;
...
您正在启动该流程但不等待它退出。这来自the documentation on Execute
:
执行实际执行CommandLine中指定的程序,应用当前平台支持的指定选项。
如果在Options中指定了poWaitOnExit选项,则只有在程序执行完毕后(或发生错误时)才会返回调用。 如果未给出此选项,则呼叫立即返回 [sic],但可以使用WaitOnExit呼叫等待它关闭,或者可以使用Running呼叫来检查它是否仍在运行
您应该在调用poWaitOnExit
之前在选项中设置Execute
选项,以便执行将阻止,直到进程退出。或者调用AProcess.WaitOnExit
来明确等待进程退出。