我正试图从这个简单的例子中得到一些东西:
SSH, execute remote commands with Android
我只是想看看我是否可以使用 SSH 从我的 android 手机连接到 linux 服务器,但它不起作用...
这是我的主要代码:
package com.example.ssh;
import java.util.Properties;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try
{
JSch jsch = new JSch();
Session session = jsch.getSession("root","192.168.0.26", 22);
session.setPassword("xxxxx");
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
我做错了什么?我没有错误消息,也没有在我的 Linux 上看到任何 SSH 连接。我添加了库 jsch 和 jzlib。我可以毫无问题地连接到 Putty session 。
EDIT1:事实上,我发现了一个错误,它解释了为什么即使我不知道如何解决问题它也不起作用。错误是:
android.os.NetworkOnMainThreadException
所以这似乎意味着该应用程序无法在其主线程上执行网络操作...
最佳答案
您必须在另一个线程中执行该代码,这样您就不会挂起 UI 线程,这就是该异常的含义。如果 UI 线程正在执行网络调用,则它无法重新绘制 UI,因此当应用程序等待网络调用完成时,您的用户会看到一个没有响应的卡住 UI。 Android 想要避免像这样糟糕的用户体验,所以它通过抛出这个异常来阻止你做这样的事情。
您的 onCreate() 方法应该调用另一个线程(我建议在原始线程上使用 AsyncTask)来执行 SSH 连接。完成后,它可以将结果发回 UI 线程,并从 UI 线程安全地更新应用程序的 UI。
http://developer.android.com/reference/android/os/AsyncTask.html
关于android - 与 JSch 的简单 SSH 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323661/