我在某个Linux系统中存储了.sh
个文件。该文件的完整路径是:
/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh
我想通过
来执行它Runtime.getRuntime().exec(`/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh`)
但它引发了一些例外。
我想在MS-Windows环境中从我的java程序执行该文件;有可能吗?
答案 0 :(得分:3)
要在Windows上执行.sh
脚本,您必须安装合适的命令解释程序。例如,您可以在Windows框中安装Cygwin环境并使用它的bash
解释程序。
然而,即使使用Cygwin,Windows也不是Linux。某些脚本不会在没有更改的情况下从一个环境移植到另一个环境。如果我在Linux环境中通过Java执行脚本时遇到问题,我宁愿在该环境中调试该问题。
请记住,您可以在Linux上以调试模式启动Java进程,并将Windows中的IDE调试器连接到该远程进程。
答案 1 :(得分:2)
这是我的代码。正如评论所说,适用于Linux,在Windows(XP)上失败。 AFAIK Windows的问题是cmd.exe对于它的参数很奇怪。对于您的特定子任务,您可以通过使用引号并将子任务参数嵌入子任务本身来使其工作。
/** Execute an abritrary shell command.
* returns the output as a String.
* Works on Linux, fails on Windows,
* not yet sure about OS X.
*/
public static String ExecuteCommand( final String Cmd ) {
boolean DB = false ;
if ( DB ) {
Debug.Log( "*** Misc.ExecuteCommand() ***" );
Debug.Log( "--- Cmd", Cmd );
}
String Output = "";
String ELabel = "";
String[] Command = new String[3];
if ( Misc.OSName().equals( "WINDOWS" ) ) {
Command[0] = System.getenv( "ComSPec" );
Command[1] = "/C";
} else {
Command[0] = "/bin/bash";
Command[1] = "-c";
}
Command[2] = Cmd;
if (DB ) {
Debug.Log( "--- Command", Command );
}
if ( Misc.OSName().equals( "WINDOWS" ) ) {
Debug.Log( "This is WINDOWS; I give up" );
return "";
}
try {
ELabel = "new ProcessBuilder()";
ProcessBuilder pb = new ProcessBuilder( Command );
ELabel = "redirectErrorStream()";
pb.redirectErrorStream( true );
ELabel = "pb.start()";
Process p = pb.start();
ELabel = "p.getInputStream()";
InputStream pout = p.getInputStream();
ELabel = "p.waitFor()";
int ExitCode = p.waitFor();
int Avail;
while ( true ) {
ELabel = "pout.available()";
if ( pout.available() <= 0 ) {
break;
}
ELabel = "pout.read()";
char inch = (char) pout.read();
Output = Output + inch;
}
ELabel = "pout.close()";
pout.close();
} catch ( Exception e ) {
Debug.Log( ELabel, e );
}
if ( DB ) {
Debug.Log( "--- Misc.ExecuteCommand() finished" );
}
return Output;
}
}
答案 2 :(得分:2)
感谢大家的回复。我找到了问题的解决方案。对于这种情况,我们需要将我的Windows机器绑定到Linux系统。以下是有效的代码:
public String executeSHFile(String Username, String Password,String Hostname)
{
String hostname = Hostname;
String username = Username;
String password = Password;
try{
Connection conn = new Connection(hostname);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(username, password);
if (isAuthenticated == false)
throw new IOException("Authentication failed.");
Session sess = conn.openSession();
sess.execCommand("sh //full path/file name.sh");
System.out.println("Here is some information about the remote host:");
InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while (true)
{
String line = br.readLine();
if (line == null)
break;
current_time=line;
System.out.println(line);
}
System.out.println("ExitCode: " + sess.getExitStatus());
/* Close this session */
sess.close();
/* Close the connection */
conn.close();
}catch(IOException e)
{
e.printStackTrace(System.err);
System.exit(2);
}finally{
}
}
谢谢。
答案 3 :(得分:1)
我在这里做了一个快速测试,假设您的机器上有/ bin / bash,以下工作:
我的/tmp/test.sh:
#!/bin/bash
echo `ls`
我的java代码:
try {
InputStream is = Runtime.getRuntime().exec("/bin/bash /tmp/test.sh").getInputStream();
int i = is.read();
while(i > 0) {
System.out.print((char)i);
i = is.read();
}
} catch (IOException e) {
e.printStackTrace();
}
输出:当前目录中的所有文件
编辑:我有点忽略了“从Windows执行”评论。我不知道你的意思。
答案 4 :(得分:0)
你可以创建一个可以在windows上运行的.bat文件(批处理文件)。 将.sh文件的内容放在.bat文件中 从您的应用程序开始一个过程,如:
Process.Start("myFile.bat");