通过 perl 的 expect 自动化和捕获登录提示

Automate and capture login prompt through perl's expect

我正在尝试在 Perl 中自动显示登录提示

我正在使用 SSHGetCredentials('login_prompt' => 1) 生成登录提示,这是 perl 的 Expect::SSH 库的一个功能

我的代码是这样的,这里 REST::Client->getCredentials() 内部调用 SSHGetCredentials('login_prompt' => 1) 会调用登录提示和 return 输入的用户 ID 和密码。

use Expect;
my $command = "perl -e 'use REST::Client; REST::Client->getCredentials()'";
my $exp = Expect->spawn($command) || die "i am done";
$exp->expect(undef, 'Login on Remote:');
$exp->send("user\n");
$exp->expect(undef, 'Password of user:');
$exp->send("12345\n");

现在想验证一下是不是我传的用户名或密码,所以想抓包比较

我怎样才能捕捉到它们?

我试过这个:

use Expect;
my $command = "perl -e 'use REST::Client; $tmp = REST::Client->getCredentials();print $tmp->{'username'};print \" \";print $tmp->{'password'};'";
my $exp = Expect->spawn($command) || die "i am done";
$exp->expect(undef, 'Login on Remote:');
$exp->send("user\n");
$exp->expect(undef, 'Password of user:');
$exp->send("12345\n");
my $value = $exp->expect(1);

$value 什么也没有,$exp->expect(1) 只是在 STDOUT 中打印值。

不确定这是否是最好的方法,但确实有效

use Expect;
my $command = "perl -e 'use REST::Client; $tmp = REST::Client->getCredentials();print $tmp->{'username'};print \" \";print $tmp->{'password'};'";
my $exp = Expect->spawn($command) || die "i am done";
$exp->expect(undef, 'Login on Remote:');
$exp->send("user\n");
$exp->expect(undef, 'Password of user:');
$exp->send("12345\n");
if ($exp->expect(undef,'-re','user 12345') == 1) {
    print "matched\n";
}