ssh无法可靠地从远程命令返回输出

Gre*_*ers 6 ssh bash perl

跟我说,描述很长.

在perl中我想执行一个简单的远程命令并使用perl :: Expect捕获输出.但是我发现我的结果数组有时是空的.我做了很多实验,并且相信问题是我的远程ssh连接正在终止,成功之后,远程命令可以刷新到stout.

  • 无论是直接从bash命令行运行perl :: Expect还是ssh,行为都是一样的.
  • 我的数据中心中的所有主机都有此行为.主机负载越多,错误就越频繁.对于繁重的主机,我有15%的时间没有得到结果.较轻的主机上的错误率接近0.
  • 远程命令无关紧要.
  • 我知道我已经通过密码提示并进入远程主机.使用'ssh -vvv'我看到每次都执行远程命令.
  • 我已经通过执行一个尾随的伪命令并检查远程返回代码来实验,希望能够刷新stdout缓冲区.没有什么是可靠的.

以下示例已编辑用户/组/主机名.除此之外,输出是未经编辑的剪切和粘贴.

> while true ; do echo "start"; ssh -l user host 'date; ls -l abc; echo $?'; echo "end"; done
start
Password:
Mon Oct  6 13:06:51 PDT 2014
-rw-r--r-- 1 user group 34538 Dec  6  2012 abc
0
end
start
Password:
end
start
Password:
Mon Oct  6 13:06:54 PDT 2014
end

如果我将远程命令发送到虚拟文件,那么stdout也会被刷新,并且我每次都能可靠地从我的命令中获取输出.不幸的是,这是一个黑客的工作.

while true ; do echo "start"; ssh -l user host 'date | tee -a /tmp/date.txt' ; echo "end"; done

在这个例子中不要挂在perl的细节上.有趣的是返回的@output数组.在perl中我有以下命令:

local :: rc :: Utils :: executeRemoteCommand($ cmd,$ pass,0,undef,undef,\ @output)

最终深入研究这个:

my $ ssh = Expect-> spawn($ command);

结果$命令是这样的:

ssh -l用户主机"ls -l abc; echo'DONE'; echo $?"

成功的'print Dumper\@output':

$VAR1 = [
      #0
      " ",
      #1
      "-rw-r--r-- 1 user group 34538 Dec  6  2012 abc",
      #2
      "DONE",
      #3
      0
    ];
Run Code Online (Sandbox Code Playgroud)

'print Dumper\@output'失败:

$VAR1 = [
    #0
    " ",
    #1
    "DONE",
    #2
    0
];
Run Code Online (Sandbox Code Playgroud)

注意'ls'的结果是如何捕获的,但是'DONE'的回声是.我还看到输出数组的结果是ls而不是echo.我也看到两个结果都丢失了.

任何见解将不胜感激.此时我很难过,现在必须将这些远程调用编程为循环,检查预期结果.这是一个可怕的黑客.我宁愿修复根本原因.

非常感谢

Bal*_*sár 2

我无法重现它,但也许您应该尝试使用 ssh 的 -t 参数。