首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向以Perl的Expect.pm开头的命令发送密码?

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

Stack Overflow用户
提问于 2010-10-21 18:47:30
回答 4查看 1.1K关注 0票数 1

我有以下脚本,

代码语言:javascript
复制
#!/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";
}

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

感谢任何指导和示例,阅读Expect文档不会给我带来任何结果。

EN

回答 4

Stack Overflow用户

发布于 2010-10-21 18:57:30

不幸的是,我不认为这是可能的。然而,Net::SSH::Expect似乎能够做你想做的事情。

票数 3
EN

Stack Overflow用户

发布于 2010-10-21 20:14:35

我总结一下:您需要Expect,而ssh模块没有任何用处。

更准确地说:如果我理解你的源代码,你的需求,用人类的术语来说,是这样的:登录到一组Unix主机上,使用passwd(1)来更新每个主机上的根目录的密码。

我预计在各个方向都会有挫败感,因为这个问题的各种变体至少在20年前就得到了权威的回答。这不是对你的影响,因为我知道要找到正确的答案是多么困难。

虽然Net::SSH是一个优秀而有价值的模块,但它对我所理解的您的需求的解决方案毫无帮助。你需要期望。

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

当然,可以在Expect.pm中编写相同的功能。不过,在我展示这一点之前,我要请最初的提问者lupin确认我正在解决他的真实需求。

票数 1
EN

Stack Overflow用户

发布于 2013-05-24 00:03:34

我想我在进入cisco路由器的特权执行模式时也遇到了类似的问题,当调用"en“时,它同样会要求输入密码。我用一个特殊的子例程绕过了它:

代码语言:javascript
复制
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定义:

代码语言:javascript
复制
  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");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3986597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档