2015-07-26 4 views
0

Я пытаюсь запустить следующие команды с помощью JSch:Выполнение команды здесь-ДОК с помощью JSch

sudo su - someuser << EOF 
whoami 
EOF 

Чтобы выполнить команду, я использую этот метод:

public String exec(String command) { 
    StringBuilder outputBuffer = new StringBuilder(); 

    try { 
     Channel channelInstance = this.session.openChannel("exec"); 
     ((ChannelExec) channelInstance).setCommand(command); 
     InputStream commandOutput = channelInstance.getInputStream(); 
     channelInstance.connect(); 
     int readByte = commandOutput.read(); 
     while (readByte != 0xffffffff) { 
      outputBuffer.append((char) readByte); 
      readByte = commandOutput.read(); 
     } 
     channelInstance.disconnect(); 
    } catch (IOException ioX) { 
     System.out.println(ioX.getMessage()); 
     return null; 
    } catch (JSchException jschX) { 
     System.out.println(jschX.getMessage()); 
     return null; 
    } 
    return outputBuffer.toString(); 
} 

Теперь, используя exec() I хочу передать здесь команду-doc, то есть:

exec("sudo su - someuser << EOF\nwhoami\nEOF"); 

Но это не работает. Я пробовал разные комбинации, и никто из них не работал.

Есть ли у вас идеи, как выполнить команду here-doc через JSch?

ответ

1

Я смог запустить команду sudo. Я скопировал пример из here , а затем произвел некоторую модификацию (((ChannelExec) channel).setPty(true);) с использованием примера this.

Ниже мой код и он работает для меня:

import com.jcraft.jsch.*; 

import java.awt.*; 

import javax.swing.*; 

import java.io.*; 

public class Exec { 
    public static void main(String[] arg) { 
     try { 
      JSch jsch = new JSch(); 

      String host = null; 
      if (arg.length > 0) { 
       host = arg[0]; 
      } else { 
       host = JOptionPane.showInputDialog("Enter [email protected]", 
         System.getProperty("user.name") + "@localhost"); 
      } 
      String user = host.substring(0, host.indexOf('@')); 
      host = host.substring(host.indexOf('@') + 1); 

      Session session = jsch.getSession(user, host, 22); 
      UserInfo ui = new MyUserInfo(); 
      session.setUserInfo(ui); 
      session.connect(); 

      Channel channel = session.openChannel("exec"); 
      ((ChannelExec) channel).setCommand("sudo su - chatar << EOF\nwhoami\nEOF"); 
      ((ChannelExec) channel).setPty(true); 
      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)); 
       } 
       if (channel.isClosed()) { 
        if (in.available() > 0) 
         continue; 
        System.out.println("exit-status: " 
          + channel.getExitStatus()); 
        break; 
       } 
       try { 
        Thread.sleep(1000); 
       } catch (Exception ee) { 
        ee.printStackTrace(); 
       } 
      } 
      channel.disconnect(); 
      session.disconnect(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive { 
     public String getPassword() { 
      return passwd; 
     } 

     public boolean promptYesNo(String str) { 
      Object[] options = { "yes", "no" }; 
      int foo = JOptionPane.showOptionDialog(null, str, "Warning", 
        JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, 
        null, options, options[0]); 
      return foo == 0; 
     } 

     String passwd; 
     JTextField passwordField = (JTextField) new JPasswordField(20); 

     public String getPassphrase() { 
      return null; 
     } 

     public boolean promptPassphrase(String message) { 
      return true; 
     } 

     public boolean promptPassword(String message) { 
      Object[] ob = { passwordField }; 
      int result = JOptionPane.showConfirmDialog(null, ob, message, 
        JOptionPane.OK_CANCEL_OPTION); 
      if (result == JOptionPane.OK_OPTION) { 
       passwd = passwordField.getText(); 
       return true; 
      } else { 
       return false; 
      } 
     } 

     public void showMessage(String message) { 
      JOptionPane.showMessageDialog(null, message); 
     } 

     final GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1, 
       GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, 
       new Insets(0, 0, 0, 0), 0, 0); 
     private Container panel; 

     public String[] promptKeyboardInteractive(String destination, 
       String name, String instruction, String[] prompt, boolean[] echo) { 
      panel = new JPanel(); 
      panel.setLayout(new GridBagLayout()); 

      gbc.weightx = 1.0; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.gridx = 0; 
      panel.add(new JLabel(instruction), gbc); 
      gbc.gridy++; 

      gbc.gridwidth = GridBagConstraints.RELATIVE; 

      JTextField[] texts = new JTextField[prompt.length]; 
      for (int i = 0; i < prompt.length; i++) { 
       gbc.fill = GridBagConstraints.NONE; 
       gbc.gridx = 0; 
       gbc.weightx = 1; 
       panel.add(new JLabel(prompt[i]), gbc); 

       gbc.gridx = 1; 
       gbc.fill = GridBagConstraints.HORIZONTAL; 
       gbc.weighty = 1; 
       if (echo[i]) { 
        texts[i] = new JTextField(20); 
       } else { 
        texts[i] = new JPasswordField(20); 
       } 
       panel.add(texts[i], gbc); 
       gbc.gridy++; 
      } 

      if (JOptionPane.showConfirmDialog(null, panel, destination + ": " 
        + name, JOptionPane.OK_CANCEL_OPTION, 
        JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) { 
       String[] response = new String[prompt.length]; 
       for (int i = 0; i < prompt.length; i++) { 
        response[i] = texts[i].getText(); 
       } 
       return response; 
      } else { 
       return null; // cancel 
      } 
     } 
    } 
} 
+0

работает как шарм, спасибо. – zuberuber

+0

Рад, что это помогло. – TheCodingFrog

Смежные вопросы