【问题标题】:Running here-doc command using JSch使用 JSch 运行 here-doc 命令
【发布时间】:2015-10-16 18:27:19
【问题描述】:

我正在尝试使用 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() 我想传递 here-doc 命令,即:

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

但它不起作用。我尝试了不同的组合,但都没有奏效。

你知道如何通过 JSch 执行 here-doc 命令吗?

【问题讨论】:

    标签: java shell ssh jsch


    【解决方案1】:

    我能够运行sudo 命令。我从here 复制了一个示例 然后使用this 示例进行一些修改(((ChannelExec) channel).setPty(true);)。

    以下是我的代码,它对我有用:

    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 username@hostname",
                            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
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多