import com.alibaba.fastjson.JSONObject;
import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.*; /**
* Created by solon on 2017/3/1.
* 远程调用工具
*/
public class SSHBase {
String host;
String user;
Session session;
UserInfo ui; final Logger logger = LoggerFactory.getLogger(SSHBase.class); public SSHBase(String host, String user, String passwd) {
this.host = host;
this.user = user;
this.ui = new MyUserInfo(passwd);
} public void connect() {
try {
JSch jsch = new JSch(); this.session = jsch.getSession(this.user, this.host, 22);
this.session.setUserInfo(this.ui);
this.session.connect();
logger.info("connect to {}@{} success.", this.user, this.host);
} catch (JSchException e) {
logger.error("connect to {} failed.", this.host, e);
}
} public String runCommand(String cmd) {
Channel channel = null;
StringBuffer cmdOutput = new StringBuffer();
int cmdExitStatus = -1;
boolean isSuccess = false;
JSONObject result = new JSONObject();
result.put("result",isSuccess);
result.put("output",cmdOutput.toString());
result.put("exitStatus",cmdExitStatus);
try {
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(cmd); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024];
logger.info("run \"{}\"", cmd);
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
cmdOutput.append(new String(tmp, 0, i));
}
if (channel.isClosed()) {
if (in.available() > 0) continue;
cmdExitStatus = channel.getExitStatus();
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.error("run \"{}\" thread sleep error", cmd, e);
return result.toString();
}
}
logger.info("{} output is:{}", cmd, cmdOutput);
logger.info("{} ExitStatus is:{}", cmd, cmdExitStatus);
} catch (JSchException e1) {
logger.error("run \"{}\"", cmd, e1);
return result.toString();
} catch (IOException e1) {
logger.error("run \"{}\"", cmd, e1);
return result.toString();
} finally
{
if (channel != null) {
channel.disconnect();
}
}
isSuccess = true;
result.put("result",isSuccess);
result.put("output", cmdOutput.toString());
result.put("exitStatus", cmdExitStatus);
return result.toString();
} public boolean scpToRemote(String srcFile, String dstFile) {
Channel channel = null;
try {
FileInputStream fis = null;
boolean ptimestamp = true; // exec 'scp -t rfile' remotely
String command = "scp " + (ptimestamp ? "-p" : "") + " -t " + dstFile;
channel = this.session.openChannel("exec");
((ChannelExec) channel).setCommand(command); // get I/O streams for remote scp
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream(); channel.connect(); if (checkAck(in) != 0) {
logger.error("scp {} check ack failed.", srcFile);
return false;
} File _lfile = new File(srcFile); if (ptimestamp) {
command = "T " + (_lfile.lastModified() / 1000) + " 0";
// The access time should be sent here,
// but it is not accessible with JavaAPI ;-<
command += (" " + (_lfile.lastModified() / 1000) + " 0\n");
out.write(command.getBytes());
out.flush();
if (checkAck(in) != 0) {
logger.error("scp {} check ack failed.", srcFile);
return false;
}
} // send "C0644 filesize filename", where filename should not include '/'
long filesize = _lfile.length();
command = "C0644 " + filesize + " ";
if (srcFile.lastIndexOf('/') > 0) {
command += srcFile.substring(srcFile.lastIndexOf('/') + 1);
} else {
command += srcFile;
}
command += "\n";
out.write(command.getBytes());
out.flush();
if (checkAck(in) != 0) {
logger.error("scp {} check ack failed.", srcFile);
return false;
} // send a content of lfile
fis = new FileInputStream(srcFile);
byte[] buf = new byte[1024];
while (true) {
int len = fis.read(buf, 0, buf.length);
if (len <= 0) break;
out.write(buf, 0, len); //out.flush();
}
fis.close();
// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();
if (checkAck(in) != 0) {
logger.error("scp {} check ack failed.", srcFile);
return false;
}
out.close();
channel.disconnect();
} catch (JSchException e) {
logger.error("scp {} failed.", srcFile, e);
return false;
} catch (IOException e) {
logger.error("scp {} failed.", srcFile, e);
return false;
} finally {
if (channel != null) {
channel.disconnect();
}
}
return true;
} public void close() {
if (this.session != null) {
this.session.disconnect();
}
} public class MyUserInfo implements UserInfo {
String passwd; public MyUserInfo(String passwd) {
this.passwd = passwd;
} public String getPassword() {
return passwd;
} public boolean promptYesNo(String str) {
return true;
} public String getPassphrase() {
return null;
} public boolean promptPassphrase(String message) {
return true;
} public boolean promptPassword(String message) {
return true;
} public void showMessage(String message) {
logger.info(message);
} } int checkAck(InputStream in) throws IOException {
int b = in.read();
// b may be 0 for success,
// 1 for error,
// 2 for fatal error,
// -1
if (b == 0) return b;
if (b == -1) return b; if (b == 1 || b == 2) {
StringBuffer sb = new StringBuffer();
int c;
do {
c = in.read();
sb.append((char) c);
}
while (c != '\n');
if (b == 1) { // error
logger.error(sb.toString());
}
if (b == 2) { // fatal error
logger.error(sb.toString());
}
}
return b;
} }

jsch连接Linux工具类的更多相关文章

  1. 第2章 Linux系统安装(3)_SSH连接Linux工具:SecureCRT和WinSCP

    4. SSH连接Linux工具 4.1 Linux网卡配置 (1)临时配置: ifconfig eth0 192.168.32.100 //给eth0网卡指定IP,写在ROM里的,关机会丢失. (2) ...

  2. Druid连接池工具类

    package cn.zmh.PingCe; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSo ...

  3. Android OkHttp网络连接封装工具类

    package com.lidong.demo.utils; import android.os.Handler; import android.os.Looper; import com.googl ...

  4. java使用jsch连接linux

    由于项目需要使用java来linux进行管理,近一番查找,发现第三方jar包 jsch 可以轻松实现对linux的管理,(相关文档及例子请访问官网www.jcraft.com),故引进. 在网上搜索了 ...

  5. 基于JSch的Sftp工具类

    本Sftp工具类的API如下所示. 1)构造方法摘要 Sftp(String host, int port, int timeout, String username, String password ...

  6. jdbc连接的工具类

    在不实用框架的情况下,有一个jdbc的工具类来进行数据库的连接就再好不过了,下面提供这个工具类DBUtil.java package org.jdbc.test; import java.io.Inp ...

  7. C3P0连接池工具类使用

    c3p0的基本连接配置文件 c3p0-config.xml <c3p0-config> <default-config> <property name="dri ...

  8. C3P0连接池工具类实现步骤及方法

    C3P0连接池的工具类 使用C3P0获得连接对象连接池有一个规范接口 javax.sal.DataSourse 接口定义了一个从连接池中获得连接的方法getConnection(); 步骤导入jar包 ...

  9. JDBC连接Oracle工具类

    import java.sql.*;import java.util.ResourceBundle; /** * jdbc工具类,负责: * 1. 加载/注册数据库驱动程序 * 2. 获取数据库连接 ...

随机推荐

  1. chef语法和案例

    1. 添加用户 $ vim create_user.rb -----------------------------------> user 'charlie' do //创建一个uid为88的 ...

  2. 关于android上dpi/screen-size的厘清解释

    android定义了四种screen-size: small normal large xlarge 同时定义了六种dpi级别: ldpi (low) ~120dpimdpi (medium) ~16 ...

  3. sklearn解决过拟合的例子

    Learning curve 检视过拟合 sklearn.learning_curve 中的 learning curve 可以很直观的看出我们的 model 学习的进度, 对比发现有没有 overf ...

  4. C# 生成chm帮助文件

    引用博友的博客地址,里面有详细资料,谢谢博主分享 http://blog.csdn.net/snakorse/article/details/44963015

  5. 6.5 通过命令安装git

    本来是一头雾水,以为很麻烦,结果,一句命令就搞定: 安装完后,在搜索框搜索,即出现github.

  6. 10. CTF综合靶机渗透(三)

    靶机说明 斗牛犬工业公司最近将其网站污损,并由恶意德国牧羊犬黑客团队拥有.这是否意味着有更多的漏洞可以利用?你为什么不知道?:) 这是标准的Boot-to-Root.你唯一的目标是进入根目录并看到祝贺 ...

  7. 拦截导弹 (NYOJ—79) 最长字串问题 (NYOJ—17)

    这是到动态规划的题目,属于有顺序的0 1 背包问题: 代码: #include<stdio.h> #include<string.h> ][]; //d[i][j] ]; in ...

  8. 【Spring-任务调度】

    Spring-任务调度: spring内部有一个task是Spring自带的一个设定时间自动任务调度task使用的时候很方便,但是他能做的东西不如quartz那么的多!可以使用注解和配置两种方式,配置 ...

  9. go语言实战教程:项目文件配置和项目初始化运行

    在上节内容中,我们已经搭建了实战项目框架,并将实战项目开发所需要的静态资源文件进行了导入.在本节内容中,我们将讲解如何通过相关的配置,并初始化运行项目. conf配置文件读取配置信息 我们前面说过,使 ...

  10. knockout+MVC+webapi+sqlserver完成增删查改

    快过年了,公司的事情较少,想着开始学习点新东西.这段时间一个项目用到了mvc和webapi,然后一直对knockout比较感兴趣,就想着用这个框架做一个小实例.数据库采用的是sqlserver.话不多 ...