java jsch jar_基于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服务器执行相应的命令,或者上传下发删除文件以及远程调用脚本,最终达到实现项目自动化运维的这个小目标。
java jsch jar_基于Jsch实现Java操作linux服务器相关推荐
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...
1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...
- java jsch jar_使用JSch从Java在远程计算机上执行命令
SSH是任何一种every-day工具Linux系统管理工作.这是访问网络上的远程计算机,传输数据和执行远程命令的一种简单而安全的方法.除了交互模式之外,还有许多工具可以使依赖于现有技术的远程任务实现 ...
- 大数据-NoSQL数据库-HBase操作框架:Phoenix【Java写的基于JDBC API的操作HBase数据库的SQL引擎框架;低延迟、事务性、可使用sql语句、提供JDBC接口】
一.Phoenix概述 1.Phoenix 定义 Phoenix 最早是 saleforce 的一个开源项目,后来成为 Apache 的顶级项目. Phoenix 构建在 HBase 之上的开源 SQ ...
- java nio2 iocp_基于JDK7 NIO2的高性能web服务器实践之二(转)
前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个Acc ...
- java发送邮件354_基于SMTP的JAVA邮件发送程序
这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的. 本文分两部分,第一部分是SMTP命令介绍(这个 ...
- Java毕业设计_基于SSH的Java EE开发技术课程网站设计
基于SSH的Java EE开发技术课程网站设计 基于SSH的Java EE开发技术课程网站设计mysql数据库创建语句 基于SSH的Java EE开发技术课程网站设计oracle数据库创建语句 基于S ...
- 内网java发送邮件_基于JavaMail的Java邮件发送:简单邮件发送
电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...
- vs java调试_基于VSCode的Java编程语言的构建调试环境搭建指南(作业三)
1.Java编译环境的搭建(CodeRunner) CodeRunner的强大之处在于它支持许多语言,只要选好语言,就直接可以写代码,即开即用的模式.时至今日,Code Runner已经有了超过400 ...
- Java在Windows下导出xml文件到Linux服务器上
最近由于公司项目需要,学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法,(注:这里的我的Linux是在本机上装的虚拟机)现在写下来记录一下! 1.首先是项目截图: 2.主 ...
最新文章
- Viewpager的创建和使用——————————不懂的大家可以问,欢迎提问
- python将数据存入数据库_Python读取NGINX日志将其存入数据库
- viper4android哪个版本好,VIPER4Android最新版本
- 物联网产业迎资本热潮 孤岛困局亟待打破
- 我收藏的一份嵌入式软硬件内容(含PDF下载)
- webpack指南-webpack入门-webpack的安装
- 转载:关于对REST的基本认识和理解
- 《企业软件交付:敏捷与高效管理精要》——2.8 结论
- 直接选择排序算法汇总
- LeetCode-14.最长公共前缀(字符串的erase()函数)
- ASP.NET MVC:mvc pattern
- USB存储、光驱等外设被禁用了,网络共享被禁用了,还要共享文件怎么办?
- android开源进度条,Android github开源进度条类框架SmoothProgressBar的使用
- “华为杯”第十八届中国研究生数学建模竞赛一等奖经验分享
- MOOC电子科技大学 离散数学 集合论 第一次作业答案
- seafile专业版集成微软的office online实现在线协同编辑
- 易语言 多线程,等待所有线程执行完毕后操作
- 苹果开发者账号双重验证忘记密保终极解决办法
- 在 Linux 中配置 tftpboot 服务器的 10 个步骤
- C语言之const和volatile究极学习