hierynomus / sshj

ssh, scp and sftp for java
Apache License 2.0
2.48k stars 600 forks source link

Connection with Dell switch fails auth #522

Open SteadyOsprey opened 5 years ago

SteadyOsprey commented 5 years ago

I am new to SSHJ and trying to connect to Dell PowerConnect switches with authPassword to execute standard tasks for troubleshooting (for example, bounce POE on a single port to reset a device remotely). I can establish the connection, but auth fails with: W/System.err: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods

I can connect with putty and from a Linux box using username & password authentication. I found how to get allowed auth methods after a failure, and it only reports "publickey". How to I override that or force a connection using username & password like putty does?


Here's my code: public static String executeRemoteSSHJ(String username,String password,String hostname,int port) throws Exception{ String stringempty = ""; //Provide option for returning empty string

    final SSHClient ssh = new SSHClient();

    Command cmd = null; //declare

    try {
        ssh.loadKnownHosts();
    } catch (IOException e) {
        e.printStackTrace();
    }

    ssh.addHostKeyVerifier(new PromiscuousVerifier());
    ssh.connect(hostname,port);

    Session session = null;

    try {

        ssh.authPassword(username, password);
        ssh.auth

        session = ssh.startSession();

        cmd = session.exec("show int status");

        cmd.join(5, TimeUnit.SECONDS);

        Log.i("TESTING", "\n exit status: " + String.valueOf(cmd.getExitStatus())); //TESTING

    } catch (ConnectionException e) {
        e.printStackTrace();  //Print all the information about the error that occurred
        return stringempty;
    } catch (TransportException e) {
        e.printStackTrace();  //Print all the information about the error that occurred
        return stringempty;
    } catch (UserAuthException e) {
        e.printStackTrace();  //Print all the information about the error that occurred
        return stringempty;
    } catch (Exception e) {
        e.printStackTrace();  //Print all the information about the error that occurred
        return stringempty;
    } finally {
        try {
            // TESTING: This block -- tell me what authentication methods are allowed!
            Iterable<String> testresult = ssh.getUserAuth().getAllowedMethods(); //TESTING
            for (String i : testresult) {
                Log.i("TESTRESULT", i); //TESTING
            }
            //END TESTING

            if (session != null) {
                session.close();
            }
        } catch (IOException e) {
            // Do Nothing
        }
        ssh.disconnect();
    }

    return cmd.getInputStream().toString();

}

Here's my log file: I/TransportImpl: Client identity string: SSH-2.0-SSHJ_0.27.0 I/TransportImpl: Server identity string: SSH-2.0-OpenSSH_5.9p1.RL W/System.err: net.schmizz.sshj.userauth.UserAuthException: Exhausted available authentication methods at net.schmizz.sshj.SSHClient.auth(SSHClient.java:230) at net.schmizz.sshj.SSHClient.auth(SSHClient.java:205) at net.schmizz.sshj.SSHClient.authPassword(SSHClient.java:291) at net.schmizz.sshj.SSHClient.authPassword(SSHClient.java:261) W/System.err: at net.schmizz.sshj.SSHClient.authPassword(SSHClient.java:245) at net.metalx.myapplication.MainActivity.executeRemoteSSHJ(MainActivity.java:405) at net.metalx.myapplication.MainActivity$2.doInBackground(MainActivity.java:216) at net.metalx.myapplication.MainActivity$2.doInBackground(MainActivity.java:204) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) I/TESTRESULT: publickey I/TransportImpl: Disconnected - BY_APPLICATION

hierynomus commented 4 years ago

Typically you get the exhausted available auth methods if strong cryptography is disabled. Have you seen any log messages pertaining to that? If so enable the JCE Crypto extensions in your JDK/JRE