本文实现的是如何使用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方法,来获取数据的总大小,然后循环去读。