0

I am using Jcraft library to connect with SSH, I have done the code successfully. but when i try to get password the null pointer exception occur. i need password for future uses Can anybody help me how to solve it ?

public class UserAuthKI {
    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);

            // username and passphrase will be given via UserInfo interface.
            UserInfo ui = new MyUserInfo();
            session.setUserInfo(ui);

            session.connect();
            String newPass = session.getUserInfo().getPassword();//here I got      null value thats why Null pointer Exception occur in below
            System.out.print(newPass);
            Channel channel = session.openChannel("shell");
            InputStream is = new ByteArrayInputStream(newPass.getBytes());

            channel.setInputStream(is);

            channel.setOutputStream(System.out);

            channel.connect();

        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
        String passwd;
        JTextField passwordField = (JTextField) new JPasswordField(20);

        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;

        @Override
        public String[] promptKeyboardInteractive(String destination,
                String name, String instruction, String[] prompt, boolean[] echo) {
            // TODO Auto-generated method stub
            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
            }
        }

        @Override
        public String getPassphrase() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getPassword() {
            // TODO Auto-generated method stub
                return passwd;
        }

        @Override
        public boolean promptPassphrase(String arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean promptPassword(String message) {
            // TODO Auto-generated method stub
            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;
            }
        }

        @Override
        public boolean promptYesNo(String str) {
            // TODO Auto-generated method stub
            Object[] options = { "yes", "no" };
            int foo = JOptionPane.showOptionDialog(null, str, "Warning",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
                    null, options, options[0]);
            return foo == 0;
        }

        @Override
        public void showMessage(String message) {
            JOptionPane.showMessageDialog(null, message);
            // TODO Auto-generated method stub

        }
    }
}
2
  • please post the exact exception you are receiving Commented Sep 26, 2012 at 6:04
  • @AlexLynch I have edited my code this code not run on windows and Unix i need only password back String newPass = session.getUserInfo().getPassword() on there for future uses please help me Commented Sep 26, 2012 at 6:37

1 Answer 1

1

Yoh have use shell to get channel but you can use sftp to perform all shell command. Its working with code on window system to connect unix system.

    try
    {
        JSch jsch = new JSch();
        session = jsch.getSession(username, host, port);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.setPassword(password);
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();
        channelSftp = (ChannelSftp) channel;
    }
    catch (Throwable t)
    {
        System.out.println(t);            
    }
Sign up to request clarification or add additional context in comments.

5 Comments

Now please check that code Because I have edited. and Now I need password back to future use
I need to use session.openChannel("shell") for connection
now the programs run fine one thing i ask to u that the overall output show on console screen. can we store the output in any file or pop up window
use log4j for storing the log into file.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.