使用 sshpass ssh 到远程主机并使用 java 获取结果
ssh to remote host using sshpass and fetch results using java
我正在尝试 运行 远程机器上的一些命令并使用 Java 捕获结果。我有一个名为 test.sh 的 shell 脚本,其中包含以下命令:
sshpass -p 'password' ssh root@host.com echo hostname
我运行使用下面的 java 代码:
public void runCommand() throws IOException, InterruptedException {
ProcessBuilder builder = new ProcessBuilder();
boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
if (isWindows) {
builder.command("cmd.exe", "/c", "dir");
} else {
builder.command("sh", "-c", "sh test.sh");
}
builder.directory(new File(System.getProperty("user.home")));
Process process;
BufferedReader reader = null;
try {
process = builder.start();
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
String output = stringBuilder.toString();
System.out.println(output);
} finally
{
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
}
命令执行但我没有在输出中得到任何东西。如果我使用像 echo, hostname 这样的简单命令,那么我就能在输出中得到结果。我知道JSch可以解决问题,但是我不会用。
在 Java 中启动 Process
时,您 必须 使用 stdout 和 stderr 到 avoid blocking,并且 应该记录或控制两者(避免消费到丢弃)。现在有比链接文章提到的更简单的解决方案,使用 ProcessBuilder
.
在这种情况下,您完全忽略了命令的错误输出。您说您的进程以状态代码 127 退出,因此它可能会在 stderr 上打印,因此您将通过使用 ProcessBuilder.redirectErrorStream(true)
获得有关错误的更多详细信息。
可能未安装 sshpass,或者已安装但未安装在您的 java 进程的 $PATH
中。
我正在尝试 运行 远程机器上的一些命令并使用 Java 捕获结果。我有一个名为 test.sh 的 shell 脚本,其中包含以下命令:
sshpass -p 'password' ssh root@host.com echo hostname
我运行使用下面的 java 代码:
public void runCommand() throws IOException, InterruptedException {
ProcessBuilder builder = new ProcessBuilder();
boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
if (isWindows) {
builder.command("cmd.exe", "/c", "dir");
} else {
builder.command("sh", "-c", "sh test.sh");
}
builder.directory(new File(System.getProperty("user.home")));
Process process;
BufferedReader reader = null;
try {
process = builder.start();
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
String output = stringBuilder.toString();
System.out.println(output);
} finally
{
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
}
命令执行但我没有在输出中得到任何东西。如果我使用像 echo, hostname 这样的简单命令,那么我就能在输出中得到结果。我知道JSch可以解决问题,但是我不会用。
在 Java 中启动 Process
时,您 必须 使用 stdout 和 stderr 到 avoid blocking,并且 应该记录或控制两者(避免消费到丢弃)。现在有比链接文章提到的更简单的解决方案,使用 ProcessBuilder
.
在这种情况下,您完全忽略了命令的错误输出。您说您的进程以状态代码 127 退出,因此它可能会在 stderr 上打印,因此您将通过使用 ProcessBuilder.redirectErrorStream(true)
获得有关错误的更多详细信息。
可能未安装 sshpass,或者已安装但未安装在您的 java 进程的 $PATH
中。