[概述]

如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉。ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接。ssh在连接和传送的过程中会加密所有的数据。但是ssh一般是基于客户端的或者Linux命令行的。比如客户端工具:OpenSSH,putty,SSHTectia。在linux系统上大家可以通过sshusername@host命令连接到目标主机,但是如果在Java中,如何实现SSH功能呢?更进一步如何实现SCP,SFTP的功能呢?目前Java主流操作linux服务器基本都是基于Jsch与ganymed-ssh2。Jsch与ganymed-ssh2都是用纯Java实现SSH-2协议的一个包。两者大同小异,下面笔者重点讲解下如何在Java代码中基于Jsch连接并操作linux系统。

[实际应用]

目前在湖南移动的日志分析项目中,我们正是基于jsch实现java操作linux服务器,实现脚本库的功能。

1、Pom文件中配置相应的jsch的jar包

com.jcraft

jsch

0.1.54

2、建立一个SSH会话

publicstatic Session openSession(String sshHost, int sshPort, StringsshUser, String sshPass)

throwsDeployException {

finalJSch jsch = new JSch();

Sessionsession;

try{

session= jsch.getSession(sshUser, sshHost, sshPort);

}catch (JSchException e) {

logger.error(sshHost,e);

thrownew DeployException("创建一个新的session异常");

}

//设置第一次登录的时候提示,可选值:(ask| yes | no)

session.setConfig("StrictHostKeyChecking","no");

session.setPassword(sshPass);

try{

session.connect();

}catch (JSchException e) {

logger.error("openSession异常",e);

thrownew DeployException("创建一个新的session异常");

}

returnsession;

}

3、执行Shell命令

publicstatic String execCommand(Session session, String cmd, Charsetcharset, long timeout)

throwsDeployException, TimeOutException {

StringBufferresult = new StringBuffer();

ChannelExecexec = null;

try{

exec= (ChannelExec)createChannel(session, ChannelType.EXEC);

cmd= cmd + " 2>&1";

exec.setCommand(cmd);

exec.setInputStream(null);

logger.info(newStringBuilder(exec.getSession().getHost()).append(",执行输出命令:").append(cmd).toString());

try(InputStream stdout = exec.getInputStream()) {

exec.connect();

longstartTime = System.currentTimeMillis();

byte[]tmp = new byte[1024];

while(true) {

while(stdout.available() > 0) {

inti = stdout.read(tmp, 0, 1024);

if(i < 0)

break;

result.append(newString(tmp, 0, i, Charset.defaultCharset()));

}

if(exec.isClosed()) {

if(stdout.available() > 0)

continue;

break;

}

//超时

if(System.currentTimeMillis() - startTime > timeout) {

thrownew TimeOutException("sh命令执行超时:"+ cmd);

}

}

}

}catch (TimeOutException t) {

throwt;

}catch (Exception e) {

//result.append(e.getMessage());

logger.error("execCommand异常",e);

thrownew DeployException("ssh 异常",e);

}finally {

close(exec);

}

if(result.length() > 0)

result.deleteCharAt(result.length()- 1);

returnresult.toString();

}

测试执行shell命令

运行结果:

这样就和在原linux系统中一样使用shell功能了。

4、创建sftp通道

publicstatic Channel openChannel(Session session, ChannelType channelType)throws DeployException {

Channelchannel;

try{

if(false == session.isConnected()) {

session.connect();

}

channel= session.openChannel(ChannelType.SFTP.getValue());

}catch (JSchException e) {

logger.error(session.getHost(),e);

thrownew DeployException("创建一个新的Channel异常");

}

try{

channel.connect();

}catch (JSchException e) {

logger.error(session.getHost(),e);

thrownew DeployException("创建一个新的Channel异常");

}

return(ChannelSftp)channel;

}

ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:

put():    文件上传

get():    文件下载

cd():     进入指定目录

ls():     得到指定目录下的文件列表

rename(): 重命名指定文件或目录

rm():     删除指定文件

mkdir():  创建目录

rmdir():  删除目录

等等(这里省略了方法的参数,put和get都有多个重载方法,大家如需使用请看具体源代码,这里篇幅有限就不一一列出。

[注意事项]

JSch是以多线程方式连接,所以程序在connect后如果不disconnectchannel和session以及相关stream,进程会一直等待,开发同事在编写代码时切记在使用完毕,须在最后finally中disconnect掉所有连接通道。

[使用总结]

我们再次回顾总结下使用Jsch步骤:

1、new一个JSch对象;

2、从JSch对象中获取Session,用于连接,并设置连接信息;

3、使用session对象调用opnChannel("xxx")打开通信信道,并连接;

4、后面就是不同的channel,不同的操作(常用的有三种通道,即ChannelShell、ChannelExec、ChannelSftp,前两类用于执行命令,后一种是用于上传下载文件)在实际项目中,我们可以基于jsch实现java操作linux服务器执行相应的命令,或者上传下发删除文件以及远程调用脚本,最终达到实现项目自动化运维的这个小目标。

channelsftp实现两个xftp之间文件互传_基于Jsch实现Java操作linux服务器相关推荐

  1. 两台电脑怎么文件互传,电脑和电脑互传文件怎么传,两台电脑怎么互传文件

    两台电脑怎么文件互传?我们想要从一台电脑传文件到另一台电脑是一件非常麻烦的事情.大部分人都会想到用U盘来拷贝,先把文件复制到U盘中,再将U盘插入另一台电脑,然后粘贴出来.这种方法对于小文件来说比较方便 ...

  2. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...

    1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...

  3. 电脑局域网之间文件互传、共享文件;特点:传输速率快,传输4G以上的文件,比如:centOS 7 64大于4G传输速率 7-10MB/S。

    方式一:在局域网内几台电脑连接wifi,进行文件互传 1.首先,所有电脑关闭防火墙. 2.电脑连接WiFi,获取自身电脑IP地址:打开win+R,输入cmd,进入控制台,输入命令ipconfig. 3 ...

  4. 本机与服务器、镜像机之间文件互传

    本机向服务器发送文件 打开本机终端,cd到目标文件路径: #[]里面可有可无,是默认值.1.py为目标文件.user为服务器名称.remote为服务器ip.Desktop/2.py为发送到的位置及文件 ...

  5. Windows和服务器文件互传之scp命令,ssh通道连接服务器、linux获取管理员权限执行杀进程等常用linux命令

    一.scp命令 前提条件:本地和服务端网络通信正常,可以通过ping命令校验查看 ping 10.29.133.111 场景:把当前Windows系统桌面的 123.txt 文件上传至 10.29.1 ...

  6. Java两个网页之间的文件互传_如何让两台 PC 进行文件传输?

    最方便快捷的同时快速的方案应该是[windows 局域网共享] 我之前也是苦于寻找一种PC之间大文件快速交换的解决方案,因为实验室的笔记本和主机都是有生产力电脑,所以需要经常传文件,而且经常很大,移动 ...

  7. java开源大文件上传_共有19款Java 文件上传组件开源软件

    spring 配置 redis 1.maven相关pom.xml or ... Oracle 使用小计(3) 1.出错处理 ORA-00911: invalid character. 这是因为在语句末 ...

  8. linux 没有那个文件或目录_基于CentOS8Linux运维教程-Linux文件目录管理笔记

    Linux文件目录结构及用途 文件目录增删改查 vim编辑器使用技巧 准备工作: 虚拟机 root登录系统 打开终端 操作技巧 方向键 上下键可以查看历史的命令 tab键 自动补齐命令及参数 取消命令 ...

  9. pscp使用详解 Win与Linux文件互传工具

    pscp使用方法详解: pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方法与linux中的scp相似,这里来介绍一些详细的使用方 ...

  10. linux学习笔记-windows和linux文件互传

    目录 概述: FTP说明: 操作方式: linux 下FTP环境搭建: Windows 下FTP环境搭建 1.使用windows自带的FTP登录 windows建立快捷登录文件夹 2.使用FileZi ...

最新文章

  1. 小米KK:智能家居谁能破局?
  2. mysql source防止乱码
  3. 电脑没网络设备dns服务器没检测到响应,设备或资源dns没检测到有响应 网络无法连接...
  4. 聋人工学院计算机老师,聋人工学院12位手语老师用双手传递声音
  5. 面向对象方法及软件工程——团队答辩
  6. 关于Context []startup failed due to previous errors
  7. 会“聆听”用户,用户反馈设计
  8. 删除链表的倒数第 N 个节点
  9. mysql半同步模式_MySQL 半同步复制模式的实现
  10. VS2015 C#6.0 中的那些新特性(转)
  11. vim学习 08——搜索替换
  12. protel 99se中文版
  13. 1024程序员节最新福利之2018最全大数据资料集合
  14. 死磕 Java8 新特性,17 种日期处理方式!
  15. c语言课程设计交通处罚单系统,交通处罚单管理系统课程设计.doc
  16. 创业应该业务驱动还是技术驱动?(深度)|极客九剑
  17. sam文件获取与解密
  18. Everything+Wox介绍和使用方式
  19. 第4章 关系数据理论
  20. 学习笔记-Hadamard矩阵的Kronecker积

热门文章

  1. 最长公共子序列问题解析
  2. PTN OAM交互接口设计
  3. Android简单的发短信示例
  4. Oracle数据库基础入门视频合集
  5. GetLogicalDrives,GetLogicalDriveStrings,GetDri...
  6. 150+ Web 2.0 工具和相关资源
  7. 将excel文档转为word文档的方法
  8. Android常用提示框(dialog和popuwindow)
  9. Python使用matplotlib可视化模拟学生课程分数雷达图
  10. Python的类与对象