从 java 程序远程执行 kafka sh 脚本
executing kafka sh script remotely from java program
我正在尝试执行一个 kafka 脚本来检索主题、消费者组和滞后信息。我不断收到错误消息,通过这个论坛和其他论坛进行搜索会发现相互矛盾的信息。有人说不可能在 Unix 上从 windows 执行远程脚本,而其他人则给出了一些关于尝试纠正此错误的建议。我能够连接 运行 一个简单的 ping 命令并能够检索响应。也许我在这里遗漏了一个简单的被忽视的错误。
代码如下:
try {
jsch.setKnownHosts("C:\Users\.ssh\ssh_host_rsa_key.pub");
Session session = jsch.getSession(uname, host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(pword);
session.connect();
Process p = Runtime.getRuntime().exec("./usr/kafka/bin/
kafka-consumer-groups.sh --bootstrap-server 192.xxx.xx.xxx:9092
--describe -group OPSII");
InputStream scriptStdout = p.getInputStream();
BufferedReader scriptReader= new BufferedReader(new
InputStreamReader(scriptStdout));
String scriptOutput = scriptReader.readLine();
StringBuilder sb = new StringBuilder();
while ((scriptOutput = scriptReader.readLine())!= null) {
sb.append(scriptOutput + "\n");
}
scriptStdout.close();
错误:
Exception in thread "main" java.io.IOException: Cannot run program
"./usr/kafka/bin/kafka-consumer-groups.sh": CreateProcess
error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
我已经确认该脚本在远程 unix 机器上有效并且目录是正确的。它可能是格式,它应该是'//'而不是'/'吗?到底是什么导致了这个错误?请这不是一个重复的问题,因为 none 其他提议的解决方案有效。
您可以使用以下代码通过 JSch
运行 脚本
// open a channel
channel = session.openChannel("exec");
// type in your command
String command = "./path/to/your_script.sh --add_params \n";
//Below command will execute the data you set in the previous line
((ChannelExec) channel).setCommand(command);
channel.connect();
请注意,这仅使用 JSch
库。
编辑:
根据您的评论,您也想从控制台获取输出以用于该用途:
InputStream in = channel.getInputStream();
我正在尝试执行一个 kafka 脚本来检索主题、消费者组和滞后信息。我不断收到错误消息,通过这个论坛和其他论坛进行搜索会发现相互矛盾的信息。有人说不可能在 Unix 上从 windows 执行远程脚本,而其他人则给出了一些关于尝试纠正此错误的建议。我能够连接 运行 一个简单的 ping 命令并能够检索响应。也许我在这里遗漏了一个简单的被忽视的错误。
代码如下:
try {
jsch.setKnownHosts("C:\Users\.ssh\ssh_host_rsa_key.pub");
Session session = jsch.getSession(uname, host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(pword);
session.connect();
Process p = Runtime.getRuntime().exec("./usr/kafka/bin/
kafka-consumer-groups.sh --bootstrap-server 192.xxx.xx.xxx:9092
--describe -group OPSII");
InputStream scriptStdout = p.getInputStream();
BufferedReader scriptReader= new BufferedReader(new
InputStreamReader(scriptStdout));
String scriptOutput = scriptReader.readLine();
StringBuilder sb = new StringBuilder();
while ((scriptOutput = scriptReader.readLine())!= null) {
sb.append(scriptOutput + "\n");
}
scriptStdout.close();
错误:
Exception in thread "main" java.io.IOException: Cannot run program
"./usr/kafka/bin/kafka-consumer-groups.sh": CreateProcess
error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
我已经确认该脚本在远程 unix 机器上有效并且目录是正确的。它可能是格式,它应该是'//'而不是'/'吗?到底是什么导致了这个错误?请这不是一个重复的问题,因为 none 其他提议的解决方案有效。
您可以使用以下代码通过 JSch
// open a channel
channel = session.openChannel("exec");
// type in your command
String command = "./path/to/your_script.sh --add_params \n";
//Below command will execute the data you set in the previous line
((ChannelExec) channel).setCommand(command);
channel.connect();
请注意,这仅使用 JSch
库。
编辑: 根据您的评论,您也想从控制台获取输出以用于该用途:
InputStream in = channel.getInputStream();