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

从 java 运行多个 cmd 命令

雍宇定
2023-03-14

我想一个接一个地从java代码中成功地运行多个cmd命令。

我想使用这个创建ssh连接的命令行应用程序,我想像在正常的命令提示符窗口中一样连续运行多个命令,而不需要实际关闭会话。我在java中找到的关于运行cmd命令的大多数答案都谈到了运行单个命令然后停止。就像这个问题的答案:

通过java运行cmd命令

我需要将命令的输出重定向到控制台,并从控制台获取新命令作为输入。有点像用java代码模拟cmd窗口。然后根据需要结束cmd会话并继续程序的其余部分。

编辑:

我正在尝试运行名为plinkPutty的命令行实现。它用作

<code>plink-ssh

在cmd中,然后在cmd上模拟主机的linux终端。之后,直接在命令提示符中运行所有常用的linux命令,如<code>ls</code>。因此,我想在不关闭java代码的假定模拟命令提示符的情况下进行模拟。

共有2个答案

罗均
2023-03-14

我有一个要求,即在linux机器上运行该命令,并将输出存储在日志文件中,以便用户可以轻松地对其进行验证。下面发布的代码段:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class Connection
{
 public static void setConnection(String hostName)
{
    String host = hostName;
    Properties prop = new Properties();
    InputStream input = null;

    try
    {

        input = new FileInputStream("./config/finalvalidation.properties");
        Log.log("Validation of the Host Started: " + host);

        prop.load(input);
        String user = prop.getProperty("username");
        Log.log("Username : " + user);

        String password = prop.getProperty("password");
        Log.log("Password in property file is: " + password);

        String privateKey = prop.getProperty("ppkfile");

        Log.log("Password: " + password);
        Log.log("ppkfile: " + privateKey);

        String command1 = prop.getProperty("command");
            Log.log("command: " + command1);

        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);

        if (password != null && !password.isEmpty() && (privateKey == null || 
   privateKey.isEmpty()))
        {
            session.setPassword(password);
            Log.log("Password identity added ");
        }
        else if (privateKey != null && !privateKey.isEmpty() && (password == null || 
password.isEmpty()))
        {
            jsch.addIdentity(privateKey);
            Log.log("PPK identity added ");
        }
        else
        {
            Log.log("Please correct Password or PPK file placement in 
 finalvalidation.properties");
        }

        session.setConfig(config);
        session.setPassword(password);
        session.connect();
        Log.log("Connected");

        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command1);
        channel.setInputStream(null);
        ((ChannelExec) channel).setErrStream(System.err);
        InputStream inp = channel.getInputStream();
        channel.connect();
        byte[] tmp = new byte[1024];
        while (true)
        {
            while (inp.available() > 0)
            {
                int i = inp.read(tmp, 0, 1024);
                if (i < 0)
                    break;
                Log.log(new String(tmp, 0, i));
                System.out.println(tmp.toString());
            }
            if (channel.isClosed())
            {
                Log.log("exit-status: " + channel.getExitStatus());

                break;
            }
            try
            {
                Thread.sleep(500);
            }
            catch (Exception ee)
            {

            }
        }
        channel.disconnect();
        session.disconnect();
        Log.log("Validation of the host completed " + host);
        Log.log("------------------------------DONE------------------------");
    }
    catch (Exception e)
    {
        e.printStackTrace();

    }
    finally
    {
        if (input != null)
        {
            try
            {
                input.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

}

command=ls -lrt  /appl/websphere.ear |  ls -lrt /appl/prd*/ProcMgrA* | cat /appl/prd*/EF_info.txt
薄欣怿
2023-03-14

如何运行外部命令的答案在这里。然后您可以使用重定向stdin到任何已启动进程或当前进程的stdout,看这里。这样您就可以连续链接多个进程。

答案借用了前面提到的答案:

public static void pipeStream(InputStream input, OutputStream output)
   throws IOException
{
   byte buffer[] = new byte[1024];
   int numRead = 0;

   do
   {
      numRead = input.read(buffer);
      output.write(buffer, 0, numRead);
   } while (input.available() > 0);

   output.flush();
}

public static void main(String[] argv)
{
   FileInputStream fileIn = null;
   FileOutputStream fileOut = null;

   OutputStream procIn = null;
   InputStream procOut = null;

   try
   {
      fileIn = new FileInputStream("test.txt");
      fileOut = new FileOutputStream("testOut.txt");

      Process process = Runtime.getRuntime().exec ("/bin/cat");
      procIn = process.getOutputStream();
      procOut = process.getInputStream();

      pipeStream(fileIn, procIn);
      pipeStream(procOut, fileOut);
   }
   catch (IOException ioe)
   {
      System.out.println(ioe);
   }
}
 类似资料:
  • 问题内容: 我发现了几个用于通过Java类运行cmd命令的代码段,但我无法理解。 这是打开cmd的代码 我找到了一些其他链接来添加其他命令,例如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 谁能帮助我了解如何CD目录,例如: 然后在该目录上运行其他

  • 我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解。 这是打开命令的代码 我还找到了一些添加其他命令的链接,比如cdhttp://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 有人能帮我了解如何cd目录,例如: 然后在该目录上运行其他命令?

  • 我正在尝试使用ProcessBuild运行cmd语句。 但是,我只能打开cmd。exe 那么如何编写此语句通过java运行cmd命令??我得到了错误,因为语句由"*"组成。如何编辑ProcessBuilder以便我可以运行语句?非常感谢

  • 问题内容: 我想做的是从Java应用程序多次运行文件。因此,我设置了一个运行以下代码的时间: 问题是,现在每次运行命令时,都会弹出一个新的cmd窗口。但是,我想要的只是开始时弹出的 一个 窗口,该窗口用于显示以下命令调用中的所有数据。 我怎样才能做到这一点? 问题答案: 使用 & &,您可以执行多个命令,一个接一个地执行: 使用多个命令和条件处理符号 您可以使用条件处理符号从单个命令行或脚本运行多

  • 我想从java程序中运行cmd命令,但它不起作用,这是命令:newman run collection1。4.json-eqa。邮递员的环境。json-r htmlextra目录是:C:\ 我在eclipse下编写了这个java脚本,但它不起作用: *公共静态空Test_WS_Cmd()抛出IOExctive,中断异常{

  • 我有一个多线程程序,可以导入JSON,我想通过CMD运行它,但现在我不能,因为它说它没有导入。 如何解决这个问题,以便我可以始终在CMD上运行程序,而无需在运行时进行额外的键入;即,只是javacprogram.java和javaprogram.java