0

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")));

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

4

1 回答 1

0

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

您可以访问 lambda 函数内的 'expect' 实例以发送命令或启动新的交互式循环。

以下是等效 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 。

于 2016-09-27T20:40:06.943 回答