从java程序远程执行kafka sh脚本

dddzy1tm  于 2021-06-06  发布在  Kafka
关注(0)|答案(1)|浏览(410)

我正在尝试执行一个kafka脚本来检索主题、consumergroups和lag信息。我不断得到的错误和搜索,通过这个和其他论坛揭示矛盾的信息。有人说在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机器上工作,并且目录是正确的。它可能是格式吗?它应该是“/”而不是“/”?究竟是什么导致了这个错误?请注意,这不是一个重复的问题,因为其他建议的解决方案都不起作用。

rkue9o1l

rkue9o1l1#

您可以使用以下代码通过 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();

相关问题