2013-06-27 5 views
5

Мои требования следующие:
Мне нужно войти в ящик Unix, используя мои учетные данные и после входа в систему, я должен сделать sudo для другого пользователя. Как только sudo будет успешным, я должен вызвать оболочку в nohup. По завершении выполнения, закрытие канала и сеанса обоих.Несколько команд с использованием JSch

Я пробовал первый шаг, который подключается с помощью команды sudo, но я не знаю, как вызвать скрипт оболочки после команды sudo.

В приведенном ниже коде я могу выполнить команду sudo, но после получения sudo доступа, как я могу выполнить оболочку в nohup с пользователем masteruser. Так что необходимые файлы, созданные моей оболочкой, имеют владельца как masteruser.

public class SSHUploader { 

    Session session = null; 

    public SSHUploader(){ 

    } 

    public void connect(){ 
    try { 

      JSch jsch = new JSch(); 
      session = jsch.getSession("user", "xxx.xxx.xx.xx", 22); 
      session.setPassword("test"); 
      java.util.Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      session.setConfig(config); 
      session.connect(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public void executeCommand(String script) throws JSchException, IOException{ 
     System.out.println("Execute sudo"); 
     String sudo_pass = "test"; 
     ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
     ((ChannelExec) channel).setCommand(script); 

     InputStream in = channel.getInputStream(); 
     OutputStream out = channel.getOutputStream(); 
     ((ChannelExec) channel).setErrStream(System.err); 

     channel.connect(); 
     out.write((sudo_pass + "\n").getBytes()); 
     out.flush(); 

     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)); 
      } 
      if (channel.isClosed()) { 
       System.out.println("exit-status: " + channel.getExitStatus()); 
       break; 
      } 
      try { 
       Thread.sleep(1000); 
      } catch (Exception ee) { 
       System.out.println(ee); 
      } 
     } 
     channel.disconnect(); 
     System.out.println("Sudo disconnect"); 
    } 

    public void disconnect(){ 
     session.disconnect(); 
    } 


    public static void main(String... args) throws JSchException, IOException { 

     SSHUploader up = new SSHUploader(); 
     up.connect(); 

     up.executeCommand("sudo -u masteruser bash"); 

     up.disconnect(); 
    } 

} 
+0

Возможный дубликат [Как выполнить несколько операций с JSch] (https://stackoverflow.com/questions/7419513/how-to-perform-multiple-operations-with-jsch) – Gregor

ответ

12

Для выполнения нескольких команд в последовательности, вы можете создать командную строку, как показано ниже:

String script ="pbrun su - user; cd /home/scripts;./sample_script.sh” 

Выполнить его и передать эту строку к вашему методу, описанному выше.

+0

Удивительный. Я потратил много времени на то, чтобы кэшировать SSH-клиенты/подключения, только чтобы исправить это через минуту благодаря вам. Благодаря! – Buffalo

+0

Кроме того, добавление «echo Running script_X; ./script_X» кажется приятным с несколькими командами. – Buffalo

+0

Просто обратите внимание, что это решение * nix shell - это не функция SSH и JSch. Так что в других системах (например, в Windows) может потребоваться другой синтаксис. +1 –

0

Сообщение может быть старым, но я нашел другой простой способ, который позволяет вам производить вывод каждой команды отдельно. Обратите внимание, что этот код должен быть выполнен после того, как сессия была открыта, как показано в примерах (http://www.jcraft.com/jsch/examples/Exec.java.html):

for (String command : commands) { 
      ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
      channel.setInputStream(null); 
      channel.setErrStream(System.err); 
      channel.setCommand(command); 
      channel.connect(); 
      printOutput(channel); 
      channel.disconnect(); 
     } 

Где printOutput использует channel.getInpuStream() прочитать результат команды.