Java 我可以在没有用户名和密码的情况下启动JSch会话吗?
我在我的Android应用程序中使用JSch,我想创建一个SSH连接,但最初不提供用户名和密码。如果我提供用户名和密码,我可以连接,但如果我不提供用户名,我会从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.
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连接已建立。或者,在提供用户名和密码之前,连接是否尚未建立?