

あるsshサーバが起動している装置にjschライブラリを使って下記の通り`connect`したところLogin:とユーザ名を聞いてきてログインが完了しません、無事にログインを完了するにはどのように修正すれば良いのでしょうか？  
ググってみた所、このような場合シェルスクリプトの`expect`コマンドのように対話的にプログラムを書かないといけないという記事を見たのですが、この方法でも良いので無事にログインを完了し任意のコマンドを自動的に実行するプログラムを実現したいです。

[code]

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ConnectException;
    import java.util.Hashtable;
    
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    
    
    public class ZombieEx {
        private static final String hostname = "192.168.10.2";
        private static final String userid ="super";
        private static final String password = "admin";
    
        public static void main(String[] args) {
            try {
                ZombieEx test = new ZombieEx();
                test.doProc();
            } catch(JSchException ex) {
                System.out.println(ex);
            } catch(ConnectException ex) {
                System.out.println(ex.toString());
            } catch(IOException ex) {
                System.out.println(ex);
            }
        }
    
        private void doProc() throws JSchException, IOException, ConnectException {
            JSch jsch = new JSch();
    
            // HostKeyチェックは行わない
            Hashtable config = new Hashtable();
            config.put("StrictHostKeyChecking", "no");
            jsch.setConfig(config);
    
            // connection Session
            Session session = jsch.getSession(userid, hostname, 22);
            session.setPassword(password);
            session.connect();
    
            //exec command remotely
            String command = "ls -l";
            ChannelExec channel = (ChannelExec) session.openChannel("exec");
            channel.setCommand(command);
            channel.connect();
    
            // get stdout
            InputStream in = channel.getInputStream();
            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 ex) {
    
                }
            }
    
            // disconnect
            channel.disconnect();
            session.disconnect();
        }
    }
    
[/code]

▪️追記  
本件の実行環境はクライアントがMacBookでサーバがルータになります。この環境では上記を実行しても自動login出来ず。「Login:」とユーザ名を聞いてきます。尚、ユーザ名、パスワードについてはsshコマンドを使って確認手動で問題なくlogin出来ることを確認しています。

・追記２  
Yamamotoさんheliac2001さんからご指摘あった通り、User名が無視されている事がわかりました。よって当方の環境ではコマンド一発でのLoginは出来ず、対話型でのログインが必要であることが判りました。どなたか対話型で自動ログイン出来る（サーバからのメッセーを待って、このメッセージに応じて自動的にユーザ名、パスワードを順番にコマンで送信してログインする）ライブラリをご存知ないでしょうか？宜しくお願いします。


CC BY-SA 3.0
2015-01-14T10:13:17.410
4548
2016-09-29T06:45:21.033
2015-07-27T11:15:13.713
7803
7377
question
java
javaでjschを使ってのlogin方法


sshでしたら、鍵認証を使えばいかがでしょうか。  
サーバー側に公開鍵を置き、クライアント側に秘密鍵をおいておきます。  
秘密鍵のパスフレーズをなしにしておけば対話式のID/パスフレーズ入力をパスして  
ログインできます。


CC BY-SA 3.0
2015-01-26T14:52:03.613
5359
2015-01-26T14:52:03.613
7830
4548
answer


`com.jcraft.jsch.Session`クラスの中で`PreferredAuthentications`設定値から使用する認証方式を取得しているようです(オフィシャルのリポジトリがわからなかったので[私のgistリンク](https://gist.github.com/yukihane/bcd104b4664140842059#file-
session-java-L391)を示しておきます)。

私の環境で実行したところ、設定は以下のようになっていました。

> gssapi-with-mic,publickey,keyboard-interactive,password

前に書かれているものが優先的に使用されるようです。

明示的に`password`を先に書く(あるいは`password`のみにしてしまう)ことで、パスワードでの認証を行わせることができるのではないでしょうか。もちろんサーバが対応している必要はありますが。

つまり、以下のように記述すればパスワード認証が行われるのでは、ということです(3行目`setConfig`を追加)。

[code]

    // connection Session
    Session session = jsch.getSession(userid, hostname, 22);
    session.setConfig("PreferredAuthentications", "password");
    session.setPassword(password);
    session.connect();
    
[/code]

性質的には下記のリンク先と同じ問題ではないかと思います。

  * [Skipping Kerberos authentication prompts with JSch](https://stackoverflow.com/questions/29669459/skipping-kerberos-authentication-prompts-with-jsch)
  * [SFTP connection through Java asking for weird authentication](https://stackoverflow.com/questions/10881981/sftp-connection-through-java-asking-for-weird-authentication)


CC BY-SA 3.0
2015-11-06T17:32:02.833
18493
2015-11-06T17:32:02.833
2017-05-23T12:38:55.250
-1
2808
4548
answer