期望互动问题需要为多种条件提供期望

时间:2016-09-12 23:03:00

标签: java ssh expectit

Java新手问题,

我正在尝试将我的一些脚本从Perl迁移到Java,并且我很幸运地在这里找到了答案,但这个让我难过。我尝试使用expect模块将类似的行为复制到Perl脚本,但没有成功。

$exp->spawn("ssh -l $username $dev_ip\n");
$exp->expect(15,
   [ qr/ssh -l $username $dev_ip\r/ => sub { exp_continue; } ],
   [ qr/\(yes\/no\)\?\s*$/ => sub { $exp->send("yes\n"); exp_continue; } ],
   [ qr/[Pp]assword:\s*$/ => sub {$exp->send("$password\n");exp_continue;}],
   [ qr/User/ => sub { $exp->send("$username\n"); exp_continue;} ],
   [ qr/Press any key to continue/ => sub {$exp->send("\n");exp_continue;}],
   [ qr/$prompt/i => sub { $exp->send("\n");],);

如果从未到达提示行,则上述时间超过15秒。在尝试通过调用子例程登录时,它还可以看到并响应多个条件。

我认为根据我读过的内容我需要使用类似于以下示例的交互,但我不完全确定lambda在这里做什么。有人可以提供更详细的详细信息吗?

expect.interact()
    .when(contains("abc")).then(r -> System.out.println("A"))
    .when(contains("xyz")).then(r -> System.err.println("B"))
    .until(contains("exit"));
    System.out.println("DONE!");

我怀疑我需要一个在停留在交互循环中时响应提示的示例,并且可能将整个交互包装在某种类型的计时器中,以便在没有任何导致登录提示的情况下提供默认操作。

我看了

expect.expect(anyOf(contains("string"), regexp("abc.*def")));

但不认为它会满足我的需求,因为我没有看到在继续寻找其他人的同时回应比赛的方法。

1 个答案:

答案 0 :(得分:0)

我认为可以使用ExpectIt中的 interact 复制功能。您提到的示例中的lambdas在用户键入某个字符串时会将一些文本打印到标准输出流。

您可以访问'期望' lambda函数内部的实例,用于发送命令或启动新的交互循环。

以下是等效Java代码的大致情况:

        expect.withTimeout(15, TimeUnit.SECONDS)
                .interact()
                .when(regexp("\\(yes\\/no\\)\\?\\s*$"))
                        .then(r -> expect.sendLine("yes"))
                .when(regexp("User")).then((r) -> expect.sendLine("$user"))
                .when(regexp("[Pp]assword")).then((r) -> expect.sendLine("$password"))
                .when(contains("Press any key to continue")).then((r) -> expect.sendLine())
                .until(regexp("$prompt"));

请注意,在0.8.1及更低版本中,您必须在lambda函数内处理已检查的 IOException