2013-02-04 124 views
1

我有一个Perl脚本,自动与Expect.pm产卵通过SSH登录ssh我。隐藏的Perl期望输出

它实际上工作得很好,这里是我的输出中:

$ ngh bestServerEver 
    GPG Pass : 
    [email protected]**********'s password: 
    Linux **** 2.6.32-042stab059.7 #1 SMP Tue Jul 24 19:12:01 MSK 2012 x86_64 GNU/Linux 
    motd!!!!!!!!!! 
    Last login: Mon Feb 4 22:18:10 2013 from ******************* 
    bash 
    [[email protected]******:~]$ bash 
    [[email protected]******:~]$ 

我试图抑制这种输出输入我的命令后直接到达服务器外壳。这样的:

$ngh BestServerEver 
[email protected]# 

我已经试过了答案: How can I suppress STDOUT temporarily in a Perl program?

我也试过:

local (*OUT, *ERR); 
    open OUT, ">&STDOUT"; 
    open ERR, ">&STDERR"; 
    close STDOUT; 
    close STDERR; 
    print "don't print"; 
    open STDOUT, ">&OUT"; 
    open STDERR, ">&ERR"; 

两者都是好时,它的有关标准STDOUT但预计似乎是一个不同种类的手柄或其他。

我也试着设置:

$exp->stty("-echo"); 

但它并没有掩饰什么

最后,这里是我的代码http://pastebin.com/pSL3AwBW如果你有一些提示,以给我如何来隐藏垃圾。

回答

2

docs告诉你使用

$exp->log_stdout(0); 

测试:

$ perl -MExpect -E' 
    my $e = Expect->spawn("cat"); 
    $e->log_stdout($ARGV[0]); 
    $e->send("abc\n"); $e->expect(undef, "abc"); 
    $e->send("def\n"); $e->expect(undef, "def"); 
    say "done." 
' 1 
abc 
def 
done. 

$ perl -MExpect -E' 
    my $e = Expect->spawn("cat"); 
    $e->log_stdout($ARGV[0]); 
    $e->send("abc\n"); $e->expect(undef, "abc"); 
    $e->send("def\n"); $e->expect(undef, "def"); 
    say "done." 
' 0 
done. 
+0

那么这有很大帮助!谢谢!但我仍然会得到我发送的命令的输出:当我发送$ exp-> send(“bash”);它。OUPUTS: 庆典(当时) [根@服务器〜] $ bash的(当时) [根@服务器〜] $ – Azryel

+0

不,不。 – ikegami

+0

我可能在我的脚本中做了一些错误,因为它实际上会打印它:debug为3,--->尝试互连--->互连:从spawn id(3)读取51个字节。 --->打印'\ 033 [01; 32m [root @ server \ 033 [00m:\ 033 [01; 34m〜] \ 033 [00m $ bash \ r \ n')从spawn id处理id 3)。 ---> [root @ server:〜] $ bash <---但是,无论如何,我会尽力弄明白;) – Azryel