目前,当我从 Windows 连接到 Linux 主机服务器时,我使用 putty 和 .bat 文件中的凭据来自动访问计算机。但是,连接不会自动将我定向到终端 shell,但有一个辅助交互式登录提示,要求我手动输入另一个用户名和密码,到目前为止,我不知道如何通过自动化传递这些内容。
我的问题是,是否可以专门在 java 或 .bat 上自动执行这些操作?
我的一位同事设法使用“sendkey”方法在 VB 脚本上完成此操作。在线信息指出“sendkey”将一个或多个击键发送到 Activity 窗口,就像在键盘上键入一样。我可以知道 JSCH 或 SSHJ 中是否有 Java 中 sendkey 的对应项?
注意:我不想要直接连接到终端,我想要的是自动化交互式登录,就像我手动输入它一样,就像 sendkey 所做的那样。
最佳答案
将键入的字符注入(inject) ssh session 非常简单。只需将要写入的字符注入(inject)到 sshj 提供的 OutputStream
中即可。我假设您登录然后执行需要交互式控制台登录的操作。
我使用以下名为 test.sh
的简单脚本来模拟执行的过程。它读取键入的行并打印它。
#/bin/bash
read varname
echo You typed $varname
我正在使用 sshj 中修改后的 Exec example 执行此脚本:
final Session session = ssh.startSession();
try {
Command cmd = session.exec("/home/username/test.sh");
OutputStream out = cmd.getOutputStream();
out.write("1234567\n".getBytes()); // we type 1234567
out.flush();
System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
cmd.join(5, TimeUnit.SECONDS);
System.out.println("\n** exit status: " + cmd.getExitStatus());
} finally {
session.close();
}
如果您使用 sshj 代码执行脚本,您将得到结果
You typed 1234567
通过逐行读取 inputStream,您可以等待询问用户名或密码的行,并将正确的数据发送到服务器,模拟您的输入。
关于用于 SSH 辅助登录验证的 Java API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145390/