我想一个接一个地从java代码中成功地运行多个cmd命令。
我想使用这个创建ssh连接的命令行应用程序,我想像在正常的命令提示符窗口中一样连续运行多个命令,而不需要实际关闭会话。我在java中找到的关于运行cmd命令的大多数答案都谈到了运行单个命令然后停止。就像这个问题的答案:
通过java运行cmd命令
我需要将命令的输出重定向到控制台,并从控制台获取新命令作为输入。有点像用java代码模拟cmd窗口。然后根据需要结束cmd会话并继续程序的其余部分。
编辑:
我正在尝试运行名为plink
的Putty
的命令行实现。它用作
<code>plink-ssh
在cmd中,然后在cmd上模拟主机的linux终端。之后,直接在命令提示符中运行所有常用的linux命令,如<code>ls</code>。因此,我想在不关闭java代码的假定模拟命令提示符的情况下进行模拟。
我有一个要求,即在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
如何运行外部命令的答案在这里。然后您可以使用重定向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