当前位置: 首页 > 知识库问答 >
问题:

试图以Java字符串形式返回Unix命令的输出…没有得到预期的结果

咸玄天
2023-03-14

我正在尝试在Java创建一个小程序,它将允许我访问远程Unix服务器,运行一些命令,然后在IDE中显示这些命令的输出。

我一直在拼凑一些代码,并试图学习它是如何工作的,这可能并不理想!

目前,我能够从控制台运行命令,并且能够在服务器上看到结果,但是我无法将输出发送回控制台。 每当我试图将它们作为字符串发送回来时,我都会得到类似java.lang.unixprocess$processpipeInputStream@9x57d1ad的内容,而不是我在服务器上看到的通常输出。 我肯定我做错了一些明显的事情,但是我是一个初学者,尽管花了几个小时去寻找,我还是没有找到一个解决方案。 我真的很感激你的帮助。 谢啦!

正在服务器上运行:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(portNumber);
        Socket clientSocket = serverSocket.accept();
        PrintWriter out =
                new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));

        while ((inputLine = in.readLine()) != null) {

            out.println(inputLine);

            if (inputLine.equals("storage")) {
                runStorage();
                printResults(runStorage()); }

     catch (Exception e) {

        e.printStackTrace();

    }

public static Process runStorage() throws IOException {

    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("df", "-h");

    Process process = processBuilder.start();
    printResults(process);

    return process;

}

public static String printResults(Process process) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = "";
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    return line;  }

客户:

        public class ClientInitiator {

            public static void main(String[] args) throws IOException, InterruptedException {

                String hostName = "myHostNameGoesHere";
                Socket echoSocket = new Socket(hostName, portNumber);
                PrintWriter out =
                        new PrintWriter(echoSocket.getOutputStream(), true);
                BufferedReader in =
                        new BufferedReader(
                                new InputStreamReader(echoSocket.getInputStream()));
                BufferedReader stdIn =
                        new BufferedReader(
                                new InputStreamReader(System.in));


                {
                    String userInput;

                    while (!(userInput = stdIn.readLine()).equals("")) {
                        out.println(userInput);
                        if (userInput.equals("storage")) {
                            String serverResponse = in.readLine();
                            System.out.println(serverResponse);}

共有1个答案

南门棋
2023-03-14

为了获取正在运行的进程的输出,请尝试以下代码。

InputStream is = process.getInputStream();  
InputStreamReader isr = new InputStreamReader(is);  
BufferedReader br = new BufferedReader(isr);  
String line;  
while ((line = br.readLine()) != null) {  
  System.out.println(line);  
}  
 类似资料:
  • 我使用JSCH-SSH库在“shell”通道中执行命令,但无法找到一种方法来做两件事:- 1)如何查找命令是否在远程unix box上完全执行? 2)如何在String中捕获命令输出,而不是在System.out控制台上打印? 下面是我的代码片段,它可以很好地在系统上显示shell命令输出。出来 注意:我不想使用“exec”通道,因为它为每个命令启动一个新进程,并且不记得导出的“session”变

  • 问题内容: 在python中,我可以使用os或subprocess运行一些系统命令。问题是我无法以字符串形式获取输出。例如: 我有一个没有功能check_out的较旧版本的子流程,并且我希望有一个不需要更新该模块的解决方案,因为我的代码将在没有完全管理员权限的服务器上运行。 这个问题似乎微不足道,但我找不到微不足道的解决方案 问题答案: 用途: 执行此操作的较新方法(> python 2.6)是使

  • 问题内容: 在对包含多个单词的字符串字段进行排序时,Elasticsearch会拆分字符串值,并使用min或max作为排序值。IE:按升序对值为“老虎眼”的字段进行排序时,排序值为:“眼”,而按降序进行排序时,值为:“老虎”。 假设我在索引中输入了“老虎之眼”和“死亡之轮”,当我对该字段进行升序排序时,我希望“老虎之眼”是第一个,因为“ E”在“ W”之前,但我在该字段上进行排序时看到的是“死亡轮

  • 问题内容: 我正在尝试从JAVA控制台程序中运行cmd命令,例如: 然后将命令的输出返回到JAVA中的字符串中,例如输出: 问题答案: 您可以为此使用以下代码

  • 问题内容: 我正在调用通过管道连接的命令行程序。所有这些肯定可以在Linux上运行。 我的方法: 如果我打电话给 猫文件| grep asd,我得到了预期的结果。但是,并非所有命令都能正常工作。例如: 或这个: 该方法将返回null。我猜想这个问题取决于输出格式化命令,例如 head , tail , wc 等。我如何解决这个问题并获得输出的最终结果? 问题答案: 仍然没有找到使用Runtime.

  • 我正在使用Google Cloud Shell中的命令。我正在遵循的教程以及留档(https://cloud.google.com/sdk/gcloud/reference/compute/zones/list)指出,要以表格形式列出所有区域,您应该使用以下命令: 当我运行它时,结果不会列在表格中,而是如下所示: 这是一个全新的原始Google Cloud帐户。Google是否更改了命令的默认输出

  • 我在下面有一个函数,它的目的是返回第一个索引,其中数据不是按升序排序的。如果对数据进行排序,它将只返回数组的长度。例如,{10,20,90,5,70}将返回3(90 测试用例:

  • 问题内容: Java中有没有一种方法可以从以下数学表达式获得结果: 另一方面,解析算术表达式的最佳方法是什么? 问题答案: 你可以将其传递给如下所示: 你将要确保评估的字符串来自受信任的来源,并采取通常的预防措施,否则,它将立即起作用。 如果你想采用更复杂(但更安全)的方法,则可以使用ANTLR(我怀疑这是一个数学语法的起点),然后实际自己编译/解释该语句。