使用java(进程构建器)与特定的unix用户运行Shell脚本

时间:2013-01-25 07:42:10

标签: jsch processbuilder

我开发了一个Web应用程序(部署在weblogic服务器上),我想连接到solaris服务器并使用特定的unix用户执行shell脚本。 目前,该脚本与wls用户一起运行。这是我的代码部分:

String CLA="-d";
out.println("Stopping ASAP for the changes to reflect ...");
                        ProcessBuilder processBuilder = new ProcessBuilder("/bin/ksh","/apps/vpn/asap/scripts/stop_asap_sys_tool"+" "+CLA);
                        process = processBuilder.start();
                        InputStream is = process.getInputStream();
                        InputStream isErr = process.getErrorStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        InputStreamReader isrErr = new InputStreamReader(isErr);
                        BufferedReader br = new BufferedReader(isr);
                        BufferedReader brErr = new BufferedReader(isrErr);
                        String line;
                        String lineErr;

                        while ((line = br.readLine()) != null) {
                            System.out.println(line);
                        }
                        while ((lineErr = brErr.readLine()) != null) {
                            System.out.println(lineErr);
                        }

我的搜索结果建议使用Jsch。有人可以给我一个关于我使用Jsch的实现的例子。或者其他任何方式吗?!

谢谢, Bhavin

2 个答案:

答案 0 :(得分:1)

Jsch是一个很好的方式,这里可以帮助你做你想做的事情:

  • 主站点中涵盖远程执行的示例
    [click]
  • 这里是StackOverflow [click]
  • 上已经为您完成的代码

建议,当您执行脚本,然后在Windows上编写或在那里打开它们时,您需要在文件上运行dos2unix(如果您在Linux上执行);否则你的远程执行将会失败。

答案 1 :(得分:0)

我认为这可以帮到你

/**
 * This method allows you to send and execute *nix command through SSH
 * to specified removed host and returns command output, in case incorrect
 * command will return command output error
 * 
 * @param user - ssh user name for login
 * @param password - ssh password for login
 * @param host - ip or domain with ssh server
 * @param command - command to execute 
 * @return string with command output or output error
 * @author Roman Kukharuk
 */

public String execNixComAndGetRez(String user, String password, String host,
        String command) {

    int port = 22;
    String rez = "+!";

    try {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");

        // System.out.println("Establishing Connection...");
        session.connect();

        // System.out.println("Connection established.");
        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command); //setting command

        channel.setInputStream(null);

        ((ChannelExec) channel).setErrStream(System.err);

        InputStream in = channel.getInputStream();

        channel.connect();

        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0)
                    break;
                // System.out.print(new String(tmp, 0, i));
                rez = new String(tmp, 0, i);
            }
            if (channel.isClosed()) {
                // System.out.println("exit-status: "+channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                rez = e.toString();
            }
        }
        channel.disconnect();
        session.disconnect();
    }

    catch (Exception e) {
        rez = e.toString();
    }
    return rez;
}