JSchException 超时:未建立套接字
JSchException timeout: socket is not established
我正在尝试使用 JSch 通过 ssh 连接到我的计算机,然后 运行 一个命令。
但是,当我运行我从不连接到电脑的代码。以及以下错误:
I/System.out: com.jcraft.jsch.JSchException: timeout: socket is not established
这是我的相关代码:
protected void sshTesting(){
String name = "";
String userName = "kalenpw";
String password = "hunter2";
String ip = "192.168.0.4";
int port = 22;
String command = "cmus-remote -u";
try{
JSch jsch = new JSch();
Session session = jsch.getSession(userName, ip, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing connection");
session.connect(10);
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
channel.connect(10000);
// name = session.getUserName();
// System.out.println(session.getHost());
}
catch(Exception e){
System.err.print(e);
System.out.print(e);
}
}
这是我第一次使用 JSch,所以我几乎只是按照他们的一个示例 Exec.java. I have found this answer JSch/SSHJ - Connecting to SSH server on button click 不幸的是,我的代码看起来正在以类似的方式建立连接,但没有结果。我已经正常测试了通过 SSH 连接到我的计算机并且它工作正常,所以我不认为问题出在服务器上,而是出在我的代码上。
这是整个堆栈跟踪:
W/System.err: com.jcraft.jsch.JSchException: timeout: socket is not establishedcom.jcraft.jsch.JSchException: timeout: socket is not established
W/System.err: at com.jcraft.jsch.Util.createSocket(Util.java:394)
W/System.err: at com.jcraft.jsch.Session.connect(Session.java:215)
W/System.err: at com.example.kalenpw.myfirstapp.RectangleClickActivity.sshTesting(RectangleClickActivity.java:97)
W/System.err: at com.example.kalenpw.myfirstapp.RectangleClickActivity.onCheckedChanged(RectangleClickActivity.java:56)
W/System.err: at android.widget.CompoundButton.setChecked(CompoundButton.java:165)
W/System.err: at android.widget.Switch.setChecked(Switch.java:1151)
W/System.err: at android.widget.Switch.toggle(Switch.java:1146)
W/System.err: at android.widget.CompoundButton.performClick(CompoundButton.java:123)
W/System.err: at android.view.View$PerformClick.run(View.java:22589)
W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7325)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
RectangleClickActivity.java
是我测试SSH的文件。
第 97 行是:session.connect(10);
第 56 行是:sshTesting();
问题最终是我将配置设置为 session.setConfig("StrictHostKeyChecking", "no");
,但出于某种原因,您需要创建一个配置并设置 StrictHostKeyChecking,然后将该配置添加到会话中,而不是直接设置它.
工作代码如下所示:
protected void sshTesting(){
String name = "";
String userName = "kalenpw";
String password = "hunter2";
String ip = "192.168.0.4";
int port = 22;
String command = "cmus-remote -u";
try{
JSch jsch = new JSch();
Session session = jsch.getSession(userName, ip, port);
session.setPassword(password);
//Missing code
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
//
System.out.println("Establishing connection");
session.connect(10);
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
channel.connect(10000);
// name = session.getUserName();
// System.out.println(session.getHost());
}
catch(Exception e){
System.err.print(e);
System.out.print(e);
}
}
对于那些遇到同样异常的人:
"JSchException timeout: socket is not established"
您可能需要在尝试连接之前增加 jsch 会话属性中的超时值。
确保设置了足够大的值以允许连接成功。
例如:
...
session.setTimeout(15000);
session.connect();
...
将在您的连接上设置 15 秒的超时时间,这应该足以建立套接字。
在您上面的代码中,即使没有很好的记录,此调用也会为您的连接设置 10 毫秒:
...
session.connect(10);
...
这是非常低的。删除 10 并将其保留为:
...
session.connect();
...
设置 StrictHostKeyChecking 属性 可能已经解决了减少套接字连接时间的问题,但它可能不是正确的解决方案,因为你的超时时间太短,它可能会偶尔失败。
我正在尝试使用 JSch 通过 ssh 连接到我的计算机,然后 运行 一个命令。
但是,当我运行我从不连接到电脑的代码。以及以下错误:
I/System.out: com.jcraft.jsch.JSchException: timeout: socket is not established
这是我的相关代码:
protected void sshTesting(){
String name = "";
String userName = "kalenpw";
String password = "hunter2";
String ip = "192.168.0.4";
int port = 22;
String command = "cmus-remote -u";
try{
JSch jsch = new JSch();
Session session = jsch.getSession(userName, ip, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing connection");
session.connect(10);
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
channel.connect(10000);
// name = session.getUserName();
// System.out.println(session.getHost());
}
catch(Exception e){
System.err.print(e);
System.out.print(e);
}
}
这是我第一次使用 JSch,所以我几乎只是按照他们的一个示例 Exec.java. I have found this answer JSch/SSHJ - Connecting to SSH server on button click 不幸的是,我的代码看起来正在以类似的方式建立连接,但没有结果。我已经正常测试了通过 SSH 连接到我的计算机并且它工作正常,所以我不认为问题出在服务器上,而是出在我的代码上。
这是整个堆栈跟踪:
W/System.err: com.jcraft.jsch.JSchException: timeout: socket is not establishedcom.jcraft.jsch.JSchException: timeout: socket is not established
W/System.err: at com.jcraft.jsch.Util.createSocket(Util.java:394)
W/System.err: at com.jcraft.jsch.Session.connect(Session.java:215)
W/System.err: at com.example.kalenpw.myfirstapp.RectangleClickActivity.sshTesting(RectangleClickActivity.java:97)
W/System.err: at com.example.kalenpw.myfirstapp.RectangleClickActivity.onCheckedChanged(RectangleClickActivity.java:56)
W/System.err: at android.widget.CompoundButton.setChecked(CompoundButton.java:165)
W/System.err: at android.widget.Switch.setChecked(Switch.java:1151)
W/System.err: at android.widget.Switch.toggle(Switch.java:1146)
W/System.err: at android.widget.CompoundButton.performClick(CompoundButton.java:123)
W/System.err: at android.view.View$PerformClick.run(View.java:22589)
W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:7325)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
RectangleClickActivity.java
是我测试SSH的文件。
第 97 行是:session.connect(10);
第 56 行是:sshTesting();
问题最终是我将配置设置为 session.setConfig("StrictHostKeyChecking", "no");
,但出于某种原因,您需要创建一个配置并设置 StrictHostKeyChecking,然后将该配置添加到会话中,而不是直接设置它.
工作代码如下所示:
protected void sshTesting(){
String name = "";
String userName = "kalenpw";
String password = "hunter2";
String ip = "192.168.0.4";
int port = 22;
String command = "cmus-remote -u";
try{
JSch jsch = new JSch();
Session session = jsch.getSession(userName, ip, port);
session.setPassword(password);
//Missing code
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
//
System.out.println("Establishing connection");
session.connect(10);
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
channel.connect(10000);
// name = session.getUserName();
// System.out.println(session.getHost());
}
catch(Exception e){
System.err.print(e);
System.out.print(e);
}
}
对于那些遇到同样异常的人:
"JSchException timeout: socket is not established"
您可能需要在尝试连接之前增加 jsch 会话属性中的超时值。
确保设置了足够大的值以允许连接成功。
例如:
...
session.setTimeout(15000);
session.connect();
...
将在您的连接上设置 15 秒的超时时间,这应该足以建立套接字。 在您上面的代码中,即使没有很好的记录,此调用也会为您的连接设置 10 毫秒: ... session.connect(10); ... 这是非常低的。删除 10 并将其保留为: ... session.connect(); ... 设置 StrictHostKeyChecking 属性 可能已经解决了减少套接字连接时间的问题,但它可能不是正确的解决方案,因为你的超时时间太短,它可能会偶尔失败。