我可以在没有用户名和密码的情况下启动 JSch 会话吗?

Can I start a JSch session without a username and password?

我在我的 Android 应用程序中使用 JSch,我想创建一个 SSH 连接,而不是最初提供用户名和密码。如果我提供用户名和密码,我可以连接,但如果我不提供用户名,我会收到 JSch 的“未提供用户名”错误。

这是我在不提供用户名和密码的情况下尝试连接的内容。

private class ConnectSSH extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... a) {
        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession("192.168.1.42");
            session.setPort(22);
            session.connect();
            Channel channelssh = (Channel)session.openChannel("exec");
            StringBuilder sb = new StringBuilder();
            InputStream commandOutput = channelssh.getInputStream();
            channelssh.connect();
            int readByte = commandOutput.read();
            while(readByte != 0xffffffff){
               sb.append((char)readByte);
               readByte = commandOutput.read();
            }
            channelssh.disconnect();
            return sb.toString();
        } catch (Exception e) {
            return "Error - " + e;
        }
    }
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
    }
}

我唯一的选择是更改 JSch 的源代码以允许这样做,编译成 jar,然后导入它吗?

JSch Session class 构造函数需要填写用户名。

但最终决定使用哪个用户名的是 UserAuth 实现。

因此您可以扩展 UserAuthPassword 以将实际用户名分配给 .start() 方法开头的 .username 字段。

class UserAuthUsernamePassword extends UserAuthPassword {

  public boolean start(Session session) throws Exception {
    this.username = "real_username";
    return super.start(session);
  }

}

你只需将一个虚拟值传递给 Session 构造函数的 username 参数。