Android实现SSH Client

Source

本文实现的是如何使用JSCH在Android上实现一个简易版本的ssh client,来远程执行ssh命令。

1、启动ssh服务,本文以mac为例。

打开设置-->共享-->选择远程登录

2、检验ssh server是否开启成功。

     打开shell

    ssh dongxuli@ip

    输入dongxuli账户的密码,没有报错即为开始ssh server成功。

3、下载jsch.jar:jsch-0.1.55.jar包_jsch-0.1.55.jar-Linux文档类资源-CSDN下载

 4、新建Android项目并导入jsch-0.1.55.jar

5、Android源码实现ssh命令的执行:


class SSHTest {
    fun test(){
        Thread {
            val jsch = JSch()
            try {
                //ssh登录连接的用户名和ip
                val session = jsch.getSession("dongxuli", "192.168.31.123");
                //ssh登录连接的密码
                session.setPassword("123456");
                val config = java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                session.setConfig(config);
                session.connect()
                val channelExec = session.openChannel("exec") as ChannelExec
                channelExec.setCommand("ls -l /Users/xxx \n")
                channelExec.connect()
               val  inputStreamReader = BufferedReader(InputStreamReader(channelExec.inputStream))
                val errInputStreamReader = BufferedReader(InputStreamReader(channelExec.errStream))
                val runLog = StringBuilder("")
                val errLog = StringBuilder("")
                var line: String? = null
                while (inputStreamReader.readLine().also { line = it } != null) {
                    runLog.append(line).append("\n")
                }
                var errLine: String? = null
                while (errInputStreamReader.readLine().also { errLine = it } != null) {
                    errLog.append(errLine).append("\n")
                }

                Log.d("gggl" , runLog.toString())
                Log.d("gggl" , errLog.toString())
            } catch ( e : Exception) {
                e.printStackTrace();
            }
        }.start()
    }
}

执行test后会输出/User/xxx目录下的文件列表:

 

本例中使用的是ChannelExec,每次只能执行一条命令。如果想要执行多条命令,请使用ChannelShell。

ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令)
ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流

1. ChannelExec

  每个命令之间用 ; 隔开。说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
每个命令之间用 && 隔开。说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。

每个命令之间用 || 隔开。说明:|| 是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。

2. ChannelShell

  对于ChannelShell,以输入流的形式,可执行多条指令,这就像在本地计算机上使用交互式shell(它通常用于:交互式使用)。如要要想停止,有两种方式:

  发送一个exit命令,告诉程序本次交互结束;
  使用字节流中的available方法,来获取数据的总大小,然后循环去读。