我有以下脚本,
#!/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文档不会对我产生任何影响。
答案 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就可以做到这一点!