近期接到一个需求,自己开发的app连接到linux系统服务器,操作命令行,并对返回的数据进行处理,没看错,就是这么的偏门,上百度找啊找,还好,还真有这么个实现。所以我就哐哧哐哧的来了这,开始了我的学习开发。
查看网上的资料,发现使用程序连接到linux服务器的方式有两种:1 Ganymed SSH-2;2 JSch;这两个是jar包,直接导入到项目中就可以。
我首先用的是Ganymed,发现可以正常连接host主机,但是容器的连接不了,所以只好用了jsch(这个名字用中文‘净身出户’)
总体上来说,主要有俩个功能:1 连接到linux系统上的命令行;2 使用sftp的方式传输文件
Ganymed.jar的下载地址
Ganymed的下载保重有示例,源码,以及jar包
jsch连接ssh的代码
//创建连接
private void createJSCH() {
JSch jsch = new JSch();
try {
session = jsch.getSession(user, ip, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
System.out.println("连接成功");
bLinkStatus = true;
} catch (Exception e) {
System.out.println("连接失败");
}
}
//执行命令的代码
public void exec(String cmd) {
try {
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(cmd);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
InputStream er = ((ChannelExec) channel).getErrStream();
channel.connect();
StringBuffer buffer = new StringBuffer();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
buffer.append(new String(tmp, 0, i,bean.getCharsetName()));
}
if (channel.isClosed()) {
if (in.available() > 0) continue;
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
byte[] tmp1 = new byte[1024];
while (true) {
while (er.available() > 0) {
int i = er.read(tmp1, 0, 1024);
if (i < 0) break;
buffer.append(new String(tmp1, 0, i,bean.getCharsetName()));
}
if (channel.isClosed()) {
if (er.available() > 0) continue;
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
in.close();
if (channel != null) {
channel.disconnect();
}
System.out.println(buffer.toString());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
createJSCH();
exec("ls");
}