1

我有一个 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@******:~]$

我试图在输入命令后抑制此输出以直接进入服务器外壳。像那样:

$ngh BestServerEver
root@server# 

我试过这个答案: 如何在 Perl 程序中暂时抑制 STDOUT?

我也试过:

    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如果您有一些提示可以告诉我如何隐藏该垃圾。

4

1 回答 1

2

The docs tell you to use

$exp->log_stdout(0);

Tested:

$ 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.
于 2013-02-04T21:54:59.453 回答