实现JSch在Android应用程序中运行ssh命令

时间:2014-05-04 23:10:27

标签: java android ssh android-asynctask jsch

我目前正在尝试编写一个安卓简单的Android应用程序" ls"命令ssh到远程机器。我尝试过使用JSch和this page,但它似乎并没有起作用。我环顾四周,看来我必须实现一些异步任务才能运行代码。以下是主要活动的完整代码:

package com.sshtest.sshtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.AsyncTask;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import java.util.Properties;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.*;

import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.lang.String;




public class MainActivity extends Activity {

    String string;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


private class sshconnection extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... params) {

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession("name", "ipaddress", 22);
            session.setPassword("password");

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

            session.connect();

            ChannelExec channel = (ChannelExec)session.openChannel("exec");
            channel.setCommand("ls");
            channel.connect();

            InputStream input = channel.getInputStream();


            channel.disconnect();






        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;


    }

    @Override
    protected void onPostExecute(String result) {
        TextView txt = (TextView) findViewById(R.id.txtipinfo);
        txt.setText("Executed");

    }


}
  • 添加uses-permission android:name =&#34; android.permission.INTERNET&#34;到AndroidManifest.xml

这是我对任何严肃编码的第一次尝试,如果有人能提供帮助,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

如果您只想测试。尽量不要使用AsyncTask,而只是一个线程......就像这样

        new Thread(new Runnable() {
        @Override
        public void run() {

            Session session;
            JSch jsch;
            try {
                jsch = new JSch();
                jsch.addIdentity(privateKey, "yourprivatekey");
                session = jsch.getSession("git", "github.com", 22);
                session.setPassword("yourpass");

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

                session.connect();

                if(session.isConnected()){
                    System.out.println(this.getClass().getSimpleName() + " CONNECTED");
                    System.out.println(this.getClass().getSimpleName() + " YOO " + jsch.getIdentityRepository().getName()+" "+session.getClientVersion() + " " + session.isConnected());
                }else{
                    System.out.println(this.getClass().getSimpleName() + " NOT CONNECTED");
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }).start();

在主要活动的onCreate()方法中调用它。 希望它有所帮助!