如何向Perl的Expect.pm开始的命令发送密码?

时间:2010-10-21 10:47:30

标签: perl expect

我有以下脚本,

#!/usr/bin/perl

use strict;
use warnings;
use Net::SSH::Perl;
use Expect;

my $logs = "logs";
open(LOG,'>>',"$logs") or die "can't logs $!\n";

my $domain = 'domain.com';
my @host = qw/host/;

foreach my $host (@host) {
   my $cmd = "passwd user1";
   my $sshost = join('.', $host, $domain);
   my $ssh = Net::SSH::Perl->new("$sshost");
   $ssh->login('root');
   $ssh->debug();
   my ($stdout, $stderr, $exit) = $ssh->cmd($cmd);
   print LOG $stdout,"\n";
}

现在我的问题是我不知道如何在执行$cmd之后使用Expect发送密码,是时候输入密码了。由于我们使用HPUX,$stdin在这种情况下不起作用。

感谢任何指导和样本,阅读Expect文档不会对我产生任何影响。

4 个答案:

答案 0 :(得分:3)

我不认为不幸的是。但是,Net::SSH::Expect似乎能够做你想做的事。

答案 1 :(得分:1)

我总结一下:你需要Expect,而ssh模块没用。

我会更精确:如果我理解您的源代码,那么您的需求就像这样:登录到Unix主机集合并使用passwd(1)更新 root < / strong>每个人的密码。我有这个权利吗?

我预计各方面都会感到沮丧,因为至少二十年来,这个问题的变化已得到权威回答。这不是对你的反映,因为我认识到找到正确答案是多么困难。

虽然Net :: SSH是一个优秀且有价值的模块,但它对我理解为您的要求的解决方案没有贡献。你需要期待。

事实证明,基于Tcl的Expect的标准发行版包含一个解决您情况的示例。查看http://www.ibm.com/developerworks/aix/library/au-expect/&gt;用于描述 passmass

当然,相同的功能可以在 Expect.pm 中编码。然而,在我展示之前,我问原始提问者羽扇豆确认我正在按照他的真实要求进行。

答案 2 :(得分:0)

我认为我有一个类似的问题进入特权执行模式与cisco路由器,类似于在调用“en”时要求输入密码。我用一个特殊的子程序来解决它:

sub enable { my ($expect_session, $password) = @_;
  $expect_session->send("en\n");
  $expect_session->expect($timeout,
    [ qr/[Pp]assword:/,
    sub {
    my $expect_session = shift;
    $expect_session->send("$password","\n");
    exp_continue;
  } ],

    -re => $prompt,
 );
}

但我认为问题在于您没有使用Perl的Expect,因为它的目的是使用它。创建Expect会话以管理SSH连接,然后通过它发送命令。你根本不需要Net :: SSH:Perl。这是我的$ expect_session定义:

  my $expect_session = new Expect();
  $expect_session->log_stdout(0);  # let's keep things quiet on screen; we only want command output.
  $expect_session->log_file(".expectlog");

  $expect_session->spawn("/usr/bin/ssh -o StrictHostKeyChecking=no $username\@$host")
   or die ("\nfor some reason we can't establish an SSH session to $host.\n
              it's something to do with the spawn process: $!\n");

可能会遗漏一些碎片,但希望这会让你朝着正确的方向前进。这是一个我不完全理解的复杂模块。我祝你好运,让它做你想做的事。

答案 3 :(得分:0)

Net::OpenSSH可与Expect结合使用,轻松完成。

实际上,模块发行版包含一个sample script就可以做到这一点!