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")));
但不认为它会满足我的需求,因为我没有看到在继续寻找其他人的同时回应比赛的方法。
答案 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 。