[概述]

如果大家熟悉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服务器相关推荐

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

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

  2. java jsch jar_使用JSch从Java在远程计算机上执行命令

    SSH是任何一种every-day工具Linux系统管理工作.这是访问网络上的远程计算机,传输数据和执行远程命令的一种简单而安全的方法.除了交互模式之外,还有许多工具可以使依赖于现有技术的远程任务实现 ...

  3. 大数据-NoSQL数据库-HBase操作框架:Phoenix【Java写的基于JDBC API的操作HBase数据库的SQL引擎框架;低延迟、事务性、可使用sql语句、提供JDBC接口】

    一.Phoenix概述 1.Phoenix 定义 Phoenix 最早是 saleforce 的一个开源项目,后来成为 Apache 的顶级项目. Phoenix 构建在 HBase 之上的开源 SQ ...

  4. java nio2 iocp_基于JDK7 NIO2的高性能web服务器实践之二(转)

    前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个Acc ...

  5. java发送邮件354_基于SMTP的JAVA邮件发送程序

    这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的. 本文分两部分,第一部分是SMTP命令介绍(这个 ...

  6. Java毕业设计_基于SSH的Java EE开发技术课程网站设计

    基于SSH的Java EE开发技术课程网站设计 基于SSH的Java EE开发技术课程网站设计mysql数据库创建语句 基于SSH的Java EE开发技术课程网站设计oracle数据库创建语句 基于S ...

  7. 内网java发送邮件_基于JavaMail的Java邮件发送:简单邮件发送

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  8. vs java调试_基于VSCode的Java编程语言的构建调试环境搭建指南(作业三)

    1.Java编译环境的搭建(CodeRunner) CodeRunner的强大之处在于它支持许多语言,只要选好语言,就直接可以写代码,即开即用的模式.时至今日,Code Runner已经有了超过400 ...

  9. Java在Windows下导出xml文件到Linux服务器上

    最近由于公司项目需要,学习了在Windows平台导出xml文件到Linux服务器上的指定目录下的方法,(注:这里的我的Linux是在本机上装的虚拟机)现在写下来记录一下! 1.首先是项目截图: 2.主 ...

最新文章

  1. Viewpager的创建和使用——————————不懂的大家可以问,欢迎提问
  2. python将数据存入数据库_Python读取NGINX日志将其存入数据库
  3. viper4android哪个版本好,VIPER4Android最新版本
  4. 物联网产业迎资本热潮 孤岛困局亟待打破
  5. 我收藏的一份嵌入式软硬件内容(含PDF下载)
  6. webpack指南-webpack入门-webpack的安装
  7. 转载:关于对REST的基本认识和理解
  8. 《企业软件交付:敏捷与高效管理精要》——2.8 结论
  9. 直接选择排序算法汇总
  10. LeetCode-14.最长公共前缀(字符串的erase()函数)
  11. ASP.NET MVC:mvc pattern
  12. USB存储、光驱等外设被禁用了,网络共享被禁用了,还要共享文件怎么办?
  13. android开源进度条,Android github开源进度条类框架SmoothProgressBar的使用
  14. “华为杯”第十八届中国研究生数学建模竞赛一等奖经验分享
  15. MOOC电子科技大学 离散数学 集合论 第一次作业答案
  16. seafile专业版集成微软的office online实现在线协同编辑
  17. 易语言 多线程,等待所有线程执行完毕后操作
  18. 苹果开发者账号双重验证忘记密保终极解决办法
  19. 在 Linux 中配置 tftpboot 服务器的 10 个步骤
  20. C语言之const和volatile究极学习

热门文章

  1. 惠普电脑u盘重装系统步骤_解决惠普电脑怎么设置u盘启动
  2. 区块链基础知识——哈希函数
  3. 想在领英开发客户,却发现举步维艰,如何解锁领英开发客户新模式
  4. 旅游品牌如何在中国进行移动APP推广?
  5. 高并发系统设计六(池化技术)
  6. 名画383 齐白石《荷塘十八幅》
  7. 揭秘ChatGPT背后天价超算!上万颗英伟达A100,烧光微软数亿美元
  8. 数据离奇丢失案件的侦破与思考
  9. 根据冯诺依曼原理 计算机分为哪五大部件,冯诺依曼计算机的五大部件(什么是冯诺依曼计算机结构)...
  10. 【UE】制作简单的山脉地形