jsch连接Linux工具类
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工具类的更多相关文章
- 第2章 Linux系统安装(3)_SSH连接Linux工具:SecureCRT和WinSCP
4. SSH连接Linux工具 4.1 Linux网卡配置 (1)临时配置: ifconfig eth0 192.168.32.100 //给eth0网卡指定IP,写在ROM里的,关机会丢失. (2) ...
- Druid连接池工具类
package cn.zmh.PingCe; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSo ...
- Android OkHttp网络连接封装工具类
package com.lidong.demo.utils; import android.os.Handler; import android.os.Looper; import com.googl ...
- java使用jsch连接linux
由于项目需要使用java来linux进行管理,近一番查找,发现第三方jar包 jsch 可以轻松实现对linux的管理,(相关文档及例子请访问官网www.jcraft.com),故引进. 在网上搜索了 ...
- 基于JSch的Sftp工具类
本Sftp工具类的API如下所示. 1)构造方法摘要 Sftp(String host, int port, int timeout, String username, String password ...
- jdbc连接的工具类
在不实用框架的情况下,有一个jdbc的工具类来进行数据库的连接就再好不过了,下面提供这个工具类DBUtil.java package org.jdbc.test; import java.io.Inp ...
- C3P0连接池工具类使用
c3p0的基本连接配置文件 c3p0-config.xml <c3p0-config> <default-config> <property name="dri ...
- C3P0连接池工具类实现步骤及方法
C3P0连接池的工具类 使用C3P0获得连接对象连接池有一个规范接口 javax.sal.DataSourse 接口定义了一个从连接池中获得连接的方法getConnection(); 步骤导入jar包 ...
- JDBC连接Oracle工具类
import java.sql.*;import java.util.ResourceBundle; /** * jdbc工具类,负责: * 1. 加载/注册数据库驱动程序 * 2. 获取数据库连接 ...
随机推荐
- HTTP 400 错误 编译器错误消息: CS0016
问题:运行程序时提示http 400错误 解决方法: 去掉勾 尝试将网页发布到本地IIS上,发现出现以下错误: 编译器错误消息: CS0016 解决编译器错误消息: CS0016:方法如下: 一般都是 ...
- 如何将maven项目打包成可执行的jar
如何将maven项目打包成可执行的jar 分类: maven2010-12-17 10:18 10411人阅读 评论(2) 收藏 举报 jarmavenassemblyjava 方法一:将项目及所依赖 ...
- 《精通Spring4.X企业应用开发实战》读后感第六章(国际化)
- 判断Java对象死亡的两种常用算法
当对象不馁引用的时候,这个对象就是死亡的,等待GC进行回收. 1.引用计数法 概念: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就增加1:当应用失效时,计数器值就减1:任何时刻计数器 ...
- jQuery学习1
学习jQuery的过程中发现了一个博客把jquery的要点整理的很不错,摘抄其精华以备学习.感谢:http://blog.csdn.net/wph_1129/article/details/59932 ...
- HTML5 & CSS3编程入门经典 ((美)Rob Larsen) pdf扫描版
HTML和CSS是构建网页所需要了解的两种核心编程语言,拉尔森编著的这本<HTML5&CSS3编程入门经典>详细介绍了这两种语言. <HTML5&CSS3编程入门经典 ...
- 关于layui弹出层的使用
Jquery必须大于1.83 layui必须是all,否则不显示 <script src="../js/jquery-1.8.3.min.js"></script ...
- Unity 中动态修改碰撞框(位置,大小,方向)
在Unity中,玩家处于不同的状态,要求的碰撞框的 位置/大小/方向 会有所改变,怎么动态的修改碰撞框呢? 下面是Capsure Collider(胶囊体)的修改: CapsuleCollider.d ...
- 交叉编译Spice-gtk
Fedora环境 编译环境 操作系统: 64位 Fedora23 下载源文件 spice-gtk.spice-protocol 安装依赖 $ sudo yum install -y dh-autore ...
- Trie[字典树] 数据结构及基本操作集
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&g ...