跟我说,描述很长。
在perl中我想执行一个简单的远程命令并使用perl :: Expect捕获输出。但是我发现我的结果数组有时是空的。我做了很多实验,并且相信问题是我的远程ssh连接正在终止,成功之后,远程命令才能刷新到stout。
以下示例已编辑用户/组/主机名。除此之外,输出是未经编辑的剪切和粘贴。
> 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。我也看到两个结果都丢失了。
非常感谢任何见解。此时我很难过,现在必须将这些远程调用编程为循环,检查预期结果。这是一个可怕的黑客。我更愿意解决根本原因。
非常感谢
答案 0 :(得分:1)
我无法重现它,但也许你应该尝试使用ssh的-t参数。