我有以下脚本,
#!/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文档不会给我带来任何结果。
发布于 2010-10-21 18:57:30
不幸的是,我不认为这是可能的。然而,Net::SSH::Expect似乎能够做你想做的事情。
发布于 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确认我正在解决他的真实需求。
发布于 2013-05-24 00:03:34
我想我在进入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");可能会有一些遗漏,但希望这将使您朝着正确的方向前进。这是一个我不能完全理解的复杂模块。我祝你好运,让它做你想做的事情。
https://stackoverflow.com/questions/3986597
复制相似问题