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

Java 我可以在没有用户名和密码的情况下启动JSch会话吗?,java,ssh,jsch,Java,Ssh,Jsch,我在我的Android应用程序中使用JSch,我想创建一个SSH连接,但最初不提供用户名和密码。如果我提供用户名和密码,我可以连接,但如果我不提供用户名,我会从JSch获得“用户名未给出”错误 这就是我在没有提供用户名和密码的情况下尝试连接的内容 private class ConnectSSH extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void.

我在我的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();
    }
}
私有类ConnectSSH扩展异步任务{
@凌驾
受保护字符串DOIN背景(无效…a){
试一试{
JSch JSch=新的JSch();
Session Session=jsch.getSession(“192.168.1.42”);
会话.设置端口(22);
session.connect();
channelssh=(Channel)session.openChannel(“exec”);
StringBuilder sb=新的StringBuilder();
InputStream commandOutput=channelssh.getInputStream();
channelssh.connect();
int readByte=commandOutput.read();
while(readByte!=0xffffffff){
sb.append((char)readByte);
readByte=commandOutput.read();
}
channelssh.disconnect();
使某人返回字符串();
}捕获(例外e){
返回“错误-”+e;
}
}
@凌驾
受保护的void onPostExecute(字符串结果){
Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG.show();
}
}

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

JSch
会话
类构造函数需要填充用户名

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

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

class UserAuthUsernamePassword extends UserAuthPassword {

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

}

您只需向
Session
构造函数的
username
参数传递一个伪值。

AFAIK,用户名要求与任何其他要求一样来自
sshd
。您是如何配置SSH守护进程的,使其不需要用户名的?理论上,您可以为SSH守护进程分配默认用户名(请参阅)所以你不必提供它。但在这种情况下,它是一个sshd配置。另一件事是有人启动ssh连接并在之后提供用户名的情况。在这种情况下,我认为JSch不支持此选项。谢谢Leo。我指的是终端模拟器,如Putty,它需要在e连接已建立。或者,在提供用户名和密码之前,连接是否尚未建立?