Выполнение сценария оболочки для запуска службы с помощью команды sudo в Linux с использованием jsch в java

Как выполнить сценарий оболочки для запуска службы с помощью команды sudo в Linux через Java Ex: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 и получил вывод о том, что «служба запущена» с идентификатором процесса. Когда я выполнил grep для идентификатора процесса с помощью команды ps, он отобразил службу с тем же идентификатором процесса. Но когда я выполнил ту же команду с помощью вышеуказанной Java-программы, я получил точный вывод («служба запущена») как linux с идентификатором процесса в выходной консоли. После выполнения Java-программы я сделал grep для идентификатора процесса ( из консоли вывода Java) в Linux такой процесс не выполнялся с этим идентификатором процесса. Я не могу найти, где что-то идет не так.
Пожалуйста, помогите!


person user2699067    schedule 02.01.2016    source источник
comment
Не думайте, что это имеет какое-либо отношение к программе Java, поскольку команда, похоже, выполняется на сервере.   -  person Henry    schedule 02.01.2016


Ответы (2)


Вы запускаете процесс, а затем сразу же завершаете дерево процессов.

Попробуйте использовать

channelEx.setPty(false);

Или добавьте nohup в командную строку. Видеть...

jsch ChannelExec запускает сценарий .sh с потерей nohup некоторые команды

person kervin    schedule 02.01.2016
comment
Привет, Кервин, я попробовал channelEx.setPty(false). Это не работает. setPty должен установить псевдотерминал, без этой команды sudo не будет работать. Я пытался установить true, а затем false. Но ничего не произошло. Я также пробовал nohup. cmd=nohup sudo path/script.sh start не работает. - person user2699067; 04.01.2016
comment
Я использовал sys.out в setPty (true) и setPty (false); во время выполнения одной команды sudo терминал дважды устанавливался и сбрасывался, что означает, что терминал отключается до того, как он выполнит команду. Я думаю, что это тот момент, когда он терпит неудачу. - person user2699067; 04.01.2016
comment
Есть ли способ дождаться завершения выполнения команды sudo до ее завершения? Пожалуйста помоги! - person user2699067; 04.01.2016
comment
Попробуйте nohup свою оболочку вместо sudo напрямую. Какую ошибку вы получаете? Вы также перенаправили stderr, как предполагает ссылка? Например. nohup bash -c sudo path/script.sh start 2›&1 & && sleep 4 в качестве вашей команды - person kervin; 04.01.2016
comment
Я попробовал то, что вы дали (я заменил на ', поскольку cmd является строковой переменной). Он показывает это nohup: игнорирование ввода и добавление вывода к `nohup.out'. Также служба не запускается. - person user2699067; 04.01.2016
comment
stackoverflow.com/questions/24646320/ Я прошел по этой ссылке, здесь дело не в этом исключении, а в том, что он должен полностью выполнить команду sudo без прерывания посередине. Я также напечатал код состояния выхода перед этим исключением, которое было 0, что означает, что команда выполнена успешно, но все же почему он не запускает фактический процесс, который должен был запуститься этой командой - person user2699067; 04.01.2016
comment
Скорее всего проблема в вашем скрипте. Также вы не должны заменять двойные кавычки. Попробуйте экранировать их обратной косой чертой. - person kervin; 05.01.2016
comment
при выполнении кода, который я выполнил grep для идентификатора процесса, служба работала ... и она работала до остановки выполнения программы Java. После завершения программы Java процесс остановился. Но этого не произойдет на Linux-машине. Даже если выйти из Linux и снова войти в систему, процесс будет запущен. - person user2699067; 05.01.2016
comment
Привет, Кервин, я попытался избежать двойных кавычек, но получил тот же вывод nohup: игнорирование ввода и добавление вывода в `nohup.out'. Более того, я сделал grep во время выполнения Java-программы для процесса, но для команды nohup, которую вы отправили, но процесс не запустился даже во время выполнения Java. - person user2699067; 05.01.2016

Я могу запустить команду как пользователь root и увидеть идентификатор процесса после выхода из кода Java.

  1. Используйте команду channelExec.setCommand("sudo -S -p '' " + cmd);
  2. Запустите команду с nohup (например, nohup start.sh)
  3. Убедитесь, что для сценария установлены все переменные среды с помощью команды export.
person SureshKumar    schedule 25.03.2017