Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssh 系统命令执行,但立即后台处理_Ssh_Pascal_Lazarus_Freepascal_Delphi - Fatal编程技术网

Ssh 系统命令执行,但立即后台处理

Ssh 系统命令执行,但立即后台处理,ssh,pascal,lazarus,freepascal,delphi,Ssh,Pascal,Lazarus,Freepascal,Delphi,我试图使用TProcess单元来执行ssh,以连接到我的一个服务器,并向我提供shell。这是我在Ruby中的一个重写,因为Ruby的执行时间非常慢。当我运行我的Process.Execute函数时,我看到了shell,但它立即成为了背景。运行pgrepssh会显示它正在运行,但我无法访问它,使用fg不会将其恢复。本段代码如下: if HasOption('c', 'connect') then begin TempFile:= GetRecord(GetOptionValue('c

我试图使用TProcess单元来执行ssh,以连接到我的一个服务器,并向我提供shell。这是我在Ruby中的一个重写,因为Ruby的执行时间非常慢。当我运行我的Process.Execute函数时,我看到了shell,但它立即成为了背景。运行
pgrepssh
会显示它正在运行,但我无法访问它,使用
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
类型的变量,它是包含服务器信息的记录。编目系统和检索系统运行良好,但打开外壳却不行

...
AProcess.ShowWindow:= swoShow;
AProcess.InheritHandles:= False;
AProcess.Execute;
AProcess.Free;
...
您正在启动进程,但不是等待它退出。这是来自:

Execute实际执行命令行中指定的程序,应用当前平台上支持的指定选项中的任意一个

如果在选项中指定了poWaitOnExit选项,则调用将仅在程序完成执行(或发生错误)时返回如果未给出此选项,调用将立即返回[sic],但WaitOnExit调用可用于等待其关闭,或者运行中的调用可用于检查它是否仍在运行


在调用
Execute
之前,您应该在options中设置
poWaitOnExit
选项,以便Execute将阻塞,直到进程退出。或者调用
AProcess.WaitOnExit
显式等待进程退出。

设置其中任何一项都会导致我的输入被隐藏,远程设备上的所有后续输出行在行的开头添加三个制表符。我很难弄明白为什么,有什么想法吗?如果你有一个新问题,你应该问一个新问题。并以当前形式包含所有相关源代码。正确的选项是poUsePipes,以允许进程通过tprocess提供的流与父进程通信。必须通过pipebuffersize相应地设置管道缓冲区。您应该使用execute not waitforexit。您正在同步运行,而不是同步运行。基本上这个答案是错误的,我稍后会写我的。你还需要答案吗?