Bhavin Bhatia
Bhavin Bhatia

Reputation: 43

Running a Shell Script using java ( process Builder ) with a specific unix user

I have developed a web application ( deployed on a weblogic server ) , I want to connect to the solaris server and execute a shell script with a specific unix user. At present , the script runs with a wls user. Here's the portion of my code :

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);
                        }

My search result suggests to use Jsch. Can some one give me an example with respect to my implementation on using Jsch. Or any other way of doing it ?!

THanks , Bhavin

Upvotes: 0

Views: 7001

Answers (2)

kyxap
kyxap

Reputation: 574

I think this can help you

/**
 * 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;
}

Upvotes: 0

Dane Balia
Dane Balia

Reputation: 5367

Jsch is a good way to go, here is something to assist you with what you trying to do:

  • Examples from the Main Site which covers Remote Execution
    [click]
  • Also here is the code already done for you on StackOverflow [click]

A word of advice, when you execute scripts, and you have written then on Windows or opened them there, you will need to run a dos2unix on the file (if you executing on Linux); otherwise your remote execution is going to fail horribly.

Upvotes: 1

Related Questions