channelsftp实现两个xftp之间文件互传_基于Jsch实现Java操作linux服务器
如果大家熟悉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服务器相关推荐
- 两台电脑怎么文件互传,电脑和电脑互传文件怎么传,两台电脑怎么互传文件
两台电脑怎么文件互传?我们想要从一台电脑传文件到另一台电脑是一件非常麻烦的事情.大部分人都会想到用U盘来拷贝,先把文件复制到U盘中,再将U盘插入另一台电脑,然后粘贴出来.这种方法对于小文件来说比较方便 ...
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...
1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...
- 电脑局域网之间文件互传、共享文件;特点:传输速率快,传输4G以上的文件,比如:centOS 7 64大于4G传输速率 7-10MB/S。
方式一:在局域网内几台电脑连接wifi,进行文件互传 1.首先,所有电脑关闭防火墙. 2.电脑连接WiFi,获取自身电脑IP地址:打开win+R,输入cmd,进入控制台,输入命令ipconfig. 3 ...
- 本机与服务器、镜像机之间文件互传
本机向服务器发送文件 打开本机终端,cd到目标文件路径: #[]里面可有可无,是默认值.1.py为目标文件.user为服务器名称.remote为服务器ip.Desktop/2.py为发送到的位置及文件 ...
- Windows和服务器文件互传之scp命令,ssh通道连接服务器、linux获取管理员权限执行杀进程等常用linux命令
一.scp命令 前提条件:本地和服务端网络通信正常,可以通过ping命令校验查看 ping 10.29.133.111 场景:把当前Windows系统桌面的 123.txt 文件上传至 10.29.1 ...
- Java两个网页之间的文件互传_如何让两台 PC 进行文件传输?
最方便快捷的同时快速的方案应该是[windows 局域网共享] 我之前也是苦于寻找一种PC之间大文件快速交换的解决方案,因为实验室的笔记本和主机都是有生产力电脑,所以需要经常传文件,而且经常很大,移动 ...
- java开源大文件上传_共有19款Java 文件上传组件开源软件
spring 配置 redis 1.maven相关pom.xml or ... Oracle 使用小计(3) 1.出错处理 ORA-00911: invalid character. 这是因为在语句末 ...
- linux 没有那个文件或目录_基于CentOS8Linux运维教程-Linux文件目录管理笔记
Linux文件目录结构及用途 文件目录增删改查 vim编辑器使用技巧 准备工作: 虚拟机 root登录系统 打开终端 操作技巧 方向键 上下键可以查看历史的命令 tab键 自动补齐命令及参数 取消命令 ...
- pscp使用详解 Win与Linux文件互传工具
pscp使用方法详解: pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方法与linux中的scp相似,这里来介绍一些详细的使用方 ...
- linux学习笔记-windows和linux文件互传
目录 概述: FTP说明: 操作方式: linux 下FTP环境搭建: Windows 下FTP环境搭建 1.使用windows自带的FTP登录 windows建立快捷登录文件夹 2.使用FileZi ...
最新文章
- 小米KK:智能家居谁能破局?
- mysql source防止乱码
- 电脑没网络设备dns服务器没检测到响应,设备或资源dns没检测到有响应 网络无法连接...
- 聋人工学院计算机老师,聋人工学院12位手语老师用双手传递声音
- 面向对象方法及软件工程——团队答辩
- 关于Context []startup failed due to previous errors
- 会“聆听”用户,用户反馈设计
- 删除链表的倒数第 N 个节点
- mysql半同步模式_MySQL 半同步复制模式的实现
- VS2015 C#6.0 中的那些新特性(转)
- vim学习 08——搜索替换
- protel 99se中文版
- 1024程序员节最新福利之2018最全大数据资料集合
- 死磕 Java8 新特性,17 种日期处理方式!
- c语言课程设计交通处罚单系统,交通处罚单管理系统课程设计.doc
- 创业应该业务驱动还是技术驱动?(深度)|极客九剑
- sam文件获取与解密
- Everything+Wox介绍和使用方式
- 第4章 关系数据理论
- 学习笔记-Hadamard矩阵的Kronecker积