执行shell脚本以使用java中的jsch在linux中通过sudo命令启动服务

时间:2016-01-02 12:35:59

标签: java sudo jsch

如何执行shell脚本以通过Java在Linux中通过sudo命令启动服务 例如:cmd =" sudo path / script.sh start"

这个Java程序将在linux中执行命令。 即使我能够做到“sudo ls -lt path'以及' sudo path / script.sh start'

//Java
public List<String> sshConnection(String usr,String host,int port,String pass)
{
      Session session=null;
      List<String> outputList = new ArrayList<String>();
      try
      {
        JSch jsch = new JSch();
        session = jsch.getSession(usr, host, port);
        session.setPassword(pass);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();  

        //String cmd="sudo ls path";            //working fine
        String cmd="sudo path/script.sh start"; //service is not starting..but getting the exact output as linux

        ChannelExec channelEx=new ChannelExec();

        channelEx = (ChannelExec) session.openChannel("exec");

        if(cmd.contains("sudo"))
        {
            channelEx.setPty(true);
        }

        ((ChannelExec) channelEx).setCommand(cmd);
        channelEx.connect();

        InputStream cmdOp = channelEx.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(cmdOp));

        String printOp;
        while ((printOp = br.readLine()) != null) 
        {
            outputList.add(printOp);
        }
        br.close();

        channelEx.disconnect();

    } 
    catch (Exception ex) 
    {
        System.out.println(ex.getMessage());
    } 
    finally 
    {
        if (channelEx != null) 
        {
            channelEx.disconnect();
        }
    }

    if(session!=null)
    {
        session.disconnect();
    }
    System.out.println("disconnected successfully");
    return outputList;
}

我直接在linux中执行了相同的命令并得到一个输出,告诉“服务正在运行”。使用进程id。当我使用ps命令为进程ID执行grep时,它显示具有相同进程ID的服务。 但是当我通过上面的Java程序执行相同的命令时,我得到了输出控制台中具有进程ID的确切输出(&#39;服务正在运行&#39;)作为linux。在执行java程序之后,我做了grep对于linux中的进程ID(来自Java输出控制台),没有使用该进程ID运行此类进程。 我无法找到它出错的地方 请帮忙!

2 个答案:

答案 0 :(得分:1)

您正在启动该流程,然后立即终止流程树。

尝试使用

channelEx.setPty(false);

或者将 nohup 添加到命令行。见...

jsch ChannelExec run a .sh script with nohup "lose" some commands

答案 1 :(得分:-1)

我能够以root用户身份启动命令,并在Java代码退出后查看进程ID。

  1. 使用命令channelExec.setCommand("sudo -S -p '' " + cmd);
  2. 使用nohup(例如nohup start.sh
  3. 运行命令
  4. 确保使用export命令为脚本设置了所有环境变量。