用于执行.sh文件的Java代码

时间:2011-06-24 06:01:04

标签: windows linux unix java shell

我在某个Linux系统中存储了.sh个文件。该文件的完整路径是:

/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh

我想通过

来执行它
Runtime.getRuntime().exec(`/comviva/CPP/Kokila/TransactionHandler/scripts/stopTH.sh`)

但它引发了一些例外。

我想在MS-Windows环境中从我的java程序执行该文件;有可能吗?

5 个答案:

答案 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");