java logger使用_基于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命令

67dd31dfeb45036ab480a7525f52b4bb.png

运行结果:

d9449038d264f0015ea4a2a0a1be5c1e.png

这样就和在原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服务器执行相应的命令,或者上传下发删除文件以及远程调用脚本,最终达到实现项目自动化运维的这个小目标。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java LoggerJava自带的日志记录工具,可以通过Logger来记录应用程序运行时的信息以及发生的异常等。Logger提供了多种级别的日志记录,包括SEVERE、WARNING、INFO、CONFIG、FINE、FINER和FINEST。其中,INFO级别用于记录一些应用程序运行的重要信息。 使用Logger进行日志记录,需要先创建Logger对象,然后使用Logger对象的不同级别方法(如info())进行记录。 下面是一个简单的使用示例: ```java import java.util.logging.Logger; public class MyLogger { private static final Logger LOGGER = Logger.getLogger(MyLogger.class.getName()); public static void main(String[] args) { LOGGER.info("Hello, World!"); } } ``` 在上面的示例中,首先创建了一个Logger对象,然后使用info()方法记录了一条信息。这条信息将被记录在默认的日志文件中,通常为项目根目录下的“log.txt”文件。 需要注意的是,Logger记录日志信息的方式是异步的,即调用Logger方法并不会立即将日志信息写入日志文件中,而是先将日志信息存储在内存中,然后再按照一定的时机将日志信息写入文件中。因此,在程序结束前需要调用Logger的flush()方法,以确保所有的日志信息都已经写入文件中。 ```java import java.util.logging.Logger; public class MyLogger { private static final Logger LOGGER = Logger.getLogger(MyLogger.class.getName()); public static void main(String[] args) { LOGGER.info("Hello, World!"); LOGGER.flush(); } } ``` 这样就可以确保所有的日志信息都已经写入文件中了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值