隐藏perl Expect输出

时间:2013-02-04 21:40:38

标签: perl stdout expect

我有一个perl脚本,通过ssh生成ssh,通过Expect.pm自动记录我。

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

    $ ngh bestServerEver
    GPG Pass : 
    root@**********'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
    [root@******:~]$ bash
    [root@******:~]$

我正在尝试在输入命令后禁止此输出直接进入服务器shell。像那样:

$ngh BestServerEver
root@server# 

我试过这个答案: 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有关时,两者都没关系,但Expect似乎是一种不同的手柄或其他类型。

我也尝试过设置:

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

但它没有隐藏任何东西

最后,如果您有一些技巧可以告诉我如何隐藏垃圾,那么这是我的代码http://pastebin.com/pSL3AwBW

1 个答案:

答案 0 :(得分: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.