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

时间:2014-10-06 21:34:53

标签: bash perl ssh

跟我说,描述很长。

在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 $?"

成功'打印Dumper \ @输出':

$VAR1 = [
      #0
      " ",
      #1
      "-rw-r--r-- 1 user group 34538 Dec  6  2012 abc",
      #2
      "DONE",
      #3
      0
    ];

打印Dumper \ @输出失败'

$VAR1 = [
    #0
    " ",
    #1
    "DONE",
    #2
    0
];

请注意来自' ls'的结果。没有捕捉到“完成”的回声。是。我也看到输出数组的结果是ls而不是echo。我也看到两个结果都丢失了。

非常感谢任何见解。此时我很难过,现在必须将这些远程调用编程为循环,检查预期结果。这是一个可怕的黑客。我更愿意解决根本原因。

非常感谢

1 个答案:

答案 0 :(得分:1)

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