首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JSch进行简单SSH连接

使用JSch进行简单SSH连接
EN

Stack Overflow用户
提问于 2013-01-15 01:40:27
回答 3查看 39.9K关注 0票数 19

我试着从这个简单的例子中做一些事情:

SSH, execute remote commands with Android

我只想看看是否可以使用SSH从我的android手机连接到linux服务器,但它不起作用……

下面是我的主要代码:

代码语言:javascript
复制
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会话没有问题。

EDIT1 :事实上,我发现了一个错误,它解释了为什么即使我不知道如何解决问题,它也不能工作。错误是:

android.os.NetworkOnMainThreadException

因此,这似乎意味着应用程序不能在其主线程上执行网络操作...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-15 03:03:59

您必须在另一个线程中执行该代码,这样才不会挂起UI线程,这就是该异常的含义。如果UI线程正在执行网络调用,它就不能重新绘制UI,因此当应用程序等待网络调用完成时,您的用户会看到一个冻结的UI,该UI不会响应他们。Android想要避免像这样糟糕的用户体验,所以它通过抛出这个异常来阻止你做这样的事情。

您的onCreate()方法应该调用另一个线程(我建议在原始线程上使用AsyncTask )来执行onCreate连接。然后,当它完成后,它可以将结果发送回UI线程,并从UI线程安全地更新应用程序的UI。

http://developer.android.com/reference/android/os/AsyncTask.html

票数 22
EN

Stack Overflow用户

发布于 2014-11-03 02:38:47

chubbsondubs的解决方案是完美的。我只想为那些想要快速解决这个问题的人分享我为这个问题做的代码:

代码语言:javascript
复制
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new AsyncTask<Integer, Void, Void>(){
       @Override
       protected Void doInBackground(Integer... params) {
           try {
                 executeRemoteCommand("root", "myPW","192.168.0.26", 22);
           } catch (Exception e) {
                 e.printStackTrace();
           }
           return null;
       }
    }.execute(1);
}

public static String executeRemoteCommand(String username,String password,String hostname,int port)
        throws Exception {
    JSch jsch = new JSch();
    Session session = jsch.getSession(username, hostname, port);
    session.setPassword(password);

    // Avoid asking for key confirmation
    Properties prop = new Properties();
    prop.put("StrictHostKeyChecking", "no");
    session.setConfig(prop);

    session.connect();

    // SSH Channel
    ChannelExec channelssh = (ChannelExec)
            session.openChannel("exec");
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    channelssh.setOutputStream(baos);

    // Execute command
    channelssh.setCommand("lsusb > /home/pi/test.txt");
    channelssh.connect();
    channelssh.disconnect();

    return baos.toString();
}
票数 18
EN

Stack Overflow用户

发布于 2018-02-08 10:47:27

Kotlin解决方案:

代码语言:javascript
复制
import android.os.AsyncTask
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.jcraft.jsch.ChannelExec
import com.jcraft.jsch.JSch
import java.io.ByteArrayOutputStream
import java.util.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        SshTask().execute()
    }

    class SshTask : AsyncTask<Void, Void, String>() {
        override fun doInBackground(vararg p0: Void?): String {
            val output = executeRemoteCommand("demo", "password", "test.rebex.net")
            print(output)
            return output
        }
    }
}

fun executeRemoteCommand(username: String,
                         password: String,
                         hostname: String,
                         port: Int = 22): String {
    val jsch = JSch()
    val session = jsch.getSession(username, hostname, port)
    session.setPassword(password)

    // Avoid asking for key confirmation.
    val properties = Properties()
    properties.put("StrictHostKeyChecking", "no")
    session.setConfig(properties)

    session.connect()

    // Create SSH Channel.
    val sshChannel = session.openChannel("exec") as ChannelExec
    val outputStream = ByteArrayOutputStream()
    sshChannel.outputStream = outputStream

    // Execute command.
    sshChannel.setCommand("ls")
    sshChannel.connect()

    // Sleep needed in order to wait long enough to get result back.
    Thread.sleep(1_000)
    sshChannel.disconnect()

    session.disconnect()

    return outputStream.toString()
}

build.gradle add中:

代码语言:javascript
复制
dependencies {
    ...
    compile group: 'com.jcraft', name: 'jsch', version: '0.1.54'
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14323661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档