`

Java读取远程主机文件

    博客分类:
  • Java
阅读更多
//Java利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件

package com.poson.cb.web.action.bill;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SFTPv3Client;
import ch.ethz.ssh2.SFTPv3FileAttributes;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import com.poson.cb.ext.domain.RealTimeBilling;
import com.poson.cb.lib.dr.DRApiHPImpl;
import com.poson.cb.service.AppException;
import com.poson.cb.web.action.BaseAction;

//实时清,账单文件查询
public class RealTimeBillingAction extends BaseAction{
Runtime runtime=Runtime.getRuntime();
String useHome=System.getProperty("user.home");
String idxMasterPath = useHome+"ADR/cb/data/master/";   //主侧IDX文件路径
String idxSlavePath = useHome+"ADR/cb/data/slave/";     //备侧文件路径
String[] fileDirName={"bill","mobile","fixed","fileout"};
short outTime=2;   //设置超时时间为2分钟
String shIsMaster="Master";   //当前主侧默认是上海
Connection con=null;

public ActionForward realTimeActionForward(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws AppException, Exception {
List bjList=new ArrayList();
List shList=new ArrayList();
InetAddress address=InetAddress.getLocalHost();

// 1.0 获取主备角色
short sysSate = new DRApiHPImpl().getSystemState();
System.out.println("第三种方法获得主备角色:" + sysSate); // 0-主系统,1-备系统,2-非融灾系统
       
//判断上海是否是主侧
if(sysSate==1 && (getCurrentHostAddress().equals("132.32.24.105"))){
shIsMaster="slave";
}
// 2.0 获取当前侧容灾平台正在处理的IDX(文件)名称
Process p1 = runtime
.exec(new String[] { "/bin/sh", "-c", "dr_stat -l" });
BufferedReader bReader = new BufferedReader(new InputStreamReader(p1
.getInputStream()));
String firstLine = bReader.readLine();
// 读取第二行的记录(第一行为unix返回的列)
while ((firstLine = bReader.readLine()) != null) {
String[] arrs = firstLine.split("\\s{1,}"); // 以空格为分隔符
// 获取IDX文件名
String idxName = arrs[0];
if(idxName != null && !"".equals(idxName)){
//得到当前侧的文件集合
    RealTimeBilling  billing=getFileNameListByIdxOfCurr(idxName.trim(),sysSate);
if(null !=billing){
if(getCurrentHostAddress().equals("132.129.24.18") || getCurrentHostAddress().equals("132.129.24.5")){
shList.add(billing);
}else {
bjList.add(billing);
}
}
}
}

// 获得对端侧文件集合
short endSysStat;
if(sysSate==0){
endSysStat=1;
}else {
endSysStat=0;
}
Session session=getEndtoSession();
//获取对端idxName
session.execCommand("dr_stat -l");
BufferedReader bReader2=new BufferedReader(new InputStreamReader(session.getStdout()));
String endFirstLine = bReader2.readLine();
while((endFirstLine=bReader2.readLine())!=null){
String[] endArrs = endFirstLine.split("\\s{1,}"); // 以空格为分隔符
// 获取IDX文件名
String endIdxName = endArrs[0].trim();
RealTimeBilling  billing1 =getFileNameListByIdxOfEnd(session, endIdxName, endSysStat);
if(null !=billing1){
if(getCurrentHostAddress().equals("132.129.24.18") || getCurrentHostAddress().equals("132.129.24.5")){
bjList.add(billing1);
}else {
shList.add(billing1);
}
}
}
session.close();
p1.destroy();
request.setAttribute("bjList", bjList);
request.setAttribute("shList", shList);
request.setAttribute("shIsMaster", shIsMaster);
return actionMapping.findForward("realTimeBilling");
}

//设置跳转方法
public ActionForward realTimeForward(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws AppException, Exception {
request.setAttribute("bjList", "");
request.setAttribute("shList", "");
request.setAttribute("shIsMaster", "");
return actionMapping.findForward("realTimeForward");
}

// 获得对端session
public Session getEndtoSession(){
String hAddress = "";
String ip,user,pwd;
Session session=null;

try {
//InetAddress iAddress = InetAddress.getLocalHost();
hAddress =getCurrentHostAddress();
System.out.println("本机的IP地址是:" + hAddress);
String ipConfigFile = useHome + "web" + File.separator + "CB"
+ File.separator + "WEB-INF" + File.separator
+ "ipconfig.properties";
Properties properties = new Properties();
properties.load(new FileInputStream(ipConfigFile));
if (hAddress.equals("132.129.24.18") || hAddress.equals(properties.get("sIp").toString().trim())) {
ip=properties.get("bIp").toString().trim();
user=properties.get("bUser").toString().trim();
pwd=properties.get("bPwd").toString().trim();
} else {
ip=properties.get("sIp").toString().trim();
user=properties.get("sUser").toString().trim();
pwd=properties.get("sPwd").toString().trim();
}
System.out.println("对端服务器的IP="+ip+" 用户名:"+user+" 密码:"+pwd);
con=new Connection(ip);
con.connect();
boolean isAuthenticate=con.authenticateWithPassword(user, pwd);
if(isAuthenticate==false){
System.out.println("连接对端服务器认证失败......");
throw new IOException("Authentication failed....");
}
session=con.openSession();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return  session;
}

//获取对端文件集合
public List getEndToFileNameList(){

Session  session=getEndtoSession();
//1.0 获得对端侧
return null;
}

//这种方法可以获得主备系统
public String getMachineRole(){
String mRole="";
try {
String drStatStr="dr_stat -d|head -n1|sed 's/^.*=//'|tr [A-Z] [a-z]";
Process p2=Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",drStatStr});
InputStreamReader inReader=new InputStreamReader(p2.getInputStream());
LineNumberReader lReader=new LineNumberReader(inReader);

p2.waitFor();
while((mRole=lReader.readLine()) !=null){
System.out.println("用第二种方法获得主机角色:"+mRole);
}
} catch (IOException e) {
System.out.println("用第二种方法获得主机角色失败");
e.printStackTrace();
} catch (InterruptedException e) {
System.out.println("用第二种方法获得主机角色失败");
e.printStackTrace();
}
//output :master
return mRole;
}

//通过文件idxName查找对应的文件名称

public RealTimeBilling getFileNameListByIdxOfCurr(String idxName,int sysStat) throws Exception{
RealTimeBilling rBilling=null;
for (int i = 0; i < fileDirName.length; i++) {
String filePath="";
if(sysStat==0){
//在主侧目录查找
filePath=idxMasterPath+fileDirName[i]+File.separator+idxName;
}else if (sysStat==1) {
//在备侧目录查找
filePath=idxSlavePath+fileDirName[i]+File.separator+"processing"+File.separator+idxName;
}
File file=new File(filePath);
if(file.exists()){
rBilling=new RealTimeBilling();
System.out.println("打印文件所在目录:"+file.getPath());
//读取idx文件并获取文件名称
LineNumberReader lNumberReader=new LineNumberReader(new FileReader(file));
String linInfo ="";
while((linInfo=lNumberReader.readLine())!=null){
if(linInfo.indexOf("FILE_NAME")>0){
String fileName=lNumberReader.readLine().trim();
rBilling.setFileName(fileName);
if((Calendar.getInstance().getTimeInMillis()-file.lastModified())/1000/60 > outTime){
rBilling.setOutTime(true);
}else {
rBilling.setOutTime(false);
}
System.out.println("打印当前侧文件名称:"+fileName +"是否超过2分钟:"+rBilling.isOutTime());
break;
}
}
}

}
return rBilling;
}

//在对端侧查找对应的文件
public RealTimeBilling getFileNameListByIdxOfEnd(Session session ,String idxName,short sysStat) throws Exception{
RealTimeBilling rBilling=null;
for (int i = 0; i < fileDirName.length; i++) {
String filePath="";
if(sysStat==0){
//在主侧目录查找
filePath=idxMasterPath+fileDirName[i];
}else if (sysStat==1) {
//在备侧目录查找
filePath=idxSlavePath+fileDirName[i]+File.separator+"processing";
}
session.execCommand("find "+filePath+" -name "+idxName);
BufferedReader bReader1=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;
String pathStr;
while((pathStr=bReader1.readLine())!=null){
session.execCommand("cat "+pathStr);
BufferedReader bReader2=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;
String endFileLine;
while((endFileLine=bReader2.readLine())!=null){
if(endFileLine.indexOf("FILE_NAME")>0){
String fileName=bReader2.readLine().trim();
System.out.println("对端提取的文件名称为:"+fileName);
rBilling=new RealTimeBilling();
rBilling.setFileName(fileName);
    SFTPv3FileAttributes sAttributes= new SFTPv3Client(con).lstat(filePath);
Integer mtime= sAttributes.mtime;  //获得文件的修改时间  需要确认返回的值是否以毫秒为单位
    if(((Calendar.getInstance().getTimeInMillis()-Long.parseLong(mtime.toString()))/1000/60) > outTime){
    rBilling.setOutTime(true);
    }else {
rBilling.setOutTime(false);
}
    System.out.println("对端提取的idxName文件所在路径为:"+filePath +"  该文件的访问时间为:"+mtime +"  是否超时:"+rBilling.isOutTime());
break;
}
}
}
}
return rBilling;
}


public String getCurrentHostAddress(){
String hoString="";
try {
InetAddress iAddress=InetAddress.getLocalHost();
hoString= iAddress.getHostAddress();
} catch (UnknownHostException e) {
System.out.println("获取本机IP地址出错错误......");
e.printStackTrace();
}
return hoString;
}




public static void main(String[] args) {
new RealTimeBillingAction().getEndtoSession();
}
}


利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件的主要步骤为:
1.0 获得session
    con=new ch.ethz.ssh2.Connection(ip);
    con.connect();
    boolean isAuthenticate=con.authenticateWithPassword(user, pwd);
    session=con.openSession();
2.0 通过session执行命令并读取返回结果
     session.execCommand("find "+filePath+" -name "+idxName);
    BufferedReader bReader1=new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()))) ;



                         2013-09-19 0:19 记 @sanliheludongkou.xichengqu.beijing

                        
0
2
分享到:
评论
1 楼 steafler 2013-09-19  
老夫用jcifs

相关推荐

    JAVA实现远程文件读取

    JAVA实现远程文件读取 JAVA是一种广泛应用于软件开发的编程语言,随着网络技术的发展,JAVA也提供了许多支持远程文件读取的功能,本文将详细介绍JAVA实现远程文件读取的知识点。 1. Socket 编程 在JAVA中,Socket...

    Java实现远程桌面(参赛作品)

    7. **用户界面**:使用Java Swing或JavaFX库,开发者构建了用户友好的界面,使用户能够输入远程主机的IP地址和端口号,以及进行连接、断开等操作。 8. **性能优化**:为了提高性能和减少带宽消耗,可能采用了屏幕...

    跨网段获取远程主机MAC地址的方法与java实现

    利用SNMP协议,可以从这些交换机中读取MAC地址表,进而获取任意远程主机的MAC地址,即便它们位于不同的网段。 #### Java实现跨网段MAC地址获取 在Java环境中实现跨网段获取远程主机MAC地址,首先需要利用现有的...

    java代码在window获取linux文件

    在Java编程环境中,有时我们需要在Windows系统中远程访问Linux服务器以获取或操作文件。`JSch`库提供了一个这样的解决方案,它是一个纯Java实现的SSH2库,允许开发者连接到远程计算机并执行命令,传输文件等。本篇将...

    java远程调shell

    JSchAPI是Jsch库提供的接口,开发者可以通过它与远程主机建立安全连接,并执行Shell命令。 1. **安装Jsch库**:在项目中引入Jsch库,通常通过Maven或Gradle添加依赖。Maven用户可以在pom.xml文件中添加以下依赖: `...

    java读取服务器硬件信息(windowx+linux+Mac OS)

    在Java编程中,读取服务器硬件信息是一项重要的任务,尤其对于跨平台的应用程序来说,能够兼容Windows、Linux和Mac OS等不同操作系统是必不可少的。本文将深入探讨如何使用Java来获取这些不同系统的硬件信息。 首先...

    java通过代码登录远程linux服务器并执行linux命令源码以及jar包

    同时,可能还包含了一个示例的Java源码文件,展示如何整合这些步骤以完成远程登录和执行命令的功能。 总的来说,Java通过JSch库远程登录Linux服务器并执行命令,是Java与Linux系统交互的一种常用方式,尤其适用于...

    Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    总结来说,Java实现文本文件MD5加密并FTP上传至远程主机涉及以下几个关键步骤: 1. 使用`MessageDigest`计算文件的MD5哈希。 2. 使用Apache Commons Net的FTPClient进行文件上传。 3. 在前端页面收集用户输入,校验...

    java远程控制

    在Java中,可以使用序列化(Serialization)技术将命令对象转化为字节流,通过Socket发送到远程主机。服务端接收到字节流后反序列化回原对象,然后执行对应的本地功能。这个过程可能涉及到线程安全问题,因为服务端...

    java远程连接

    Java远程连接技术主要涉及到网络通信和安全性,其中SSH(Secure Shell)是一种安全的网络协议,用于在不安全的网络环境中提供加密的通信通道。在这个场景中,`ganymed-ssh2-build210.jar` 是一个Java库,它允许Java...

    Java socket编程实现两台主机间的通信

    3.远程教育:使用 Java Socket 编程可以实现远程教育中的实时通信和数据传输。 四、Java Socket 编程的优点 Java Socket 编程有许多优点,例如: 1. 可靠性高:Java Socket 编程基于 TCP/IP 协议,提供了可靠的...

    java应用程序远程登录linux并执行其命令

    2. **文件传输(SCP/SFTP)**:允许用户上传或下载文件到远程主机。 ### 二、环境搭建与依赖引入 #### 1. 下载 Ganymed SSH2 库 首先,我们需要从官方提供的地址下载所需的jar包:...

    Java上传下载ftp上的文件

    文件上传涉及到选择远程目录、读取本地文件并将其写入FTP服务器。以下是一个简单的文件上传示例: ```java File localFile = new File("/path/to/local/file.txt"); String remoteFilePath = "/path/to/remote/file...

    Java网络屏幕监控(把客户端屏幕截图实时发送到主机端)

    在Java编程领域,实现"Java网络屏幕监控(把客户端屏幕截图实时发送到主机端)"是一项技术挑战,涉及到网络通信、图像处理以及文件传输等多个知识点。在这个项目中,`WnetWScreenRecorder.java`作为客户端负责捕获并...

    java执行远程linux服务器命令

    在实际情况中,这个文件可能包含一个简单的Java程序,展示了如何使用JSch或其他工具来执行远程Linux命令。如果能查看到具体的代码内容,我们将能够更深入地了解其实现细节。 总结,通过Java执行远程Linux服务器命令...

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    利用这些方法,我们可以很方便地对远程服务器上的文件进行操作。 为了安全起见,实际部署时应避免将"StrictHostKeyChecking"设置为"no",这样会导致系统接受任何主机的密钥,增加了被中间人攻击的风险。更好的做法...

    HTTP文件下载Java编程

    - `java.net.ConnectException`: 当无法连接到远程主机时抛出此异常。 - `java.net.URL`: 表示统一资源定位符(Uniform Resource Locator)的对象。 - `java.lang.Runnable`: 一个可以被线程执行的简单任务的接口。 ...

    java实现ftp上传jar包

    它允许用户从远程主机下载文件或向远程主机上传文件。在Java中,我们可以使用多种库来实现FTP功能。 2. **Java FTP库**:在描述中提到了`edtftpj.jar`,这是一个Java FTP客户端库,提供了一种简单的方式来处理FTP...

    java操作sftp的工具类(JSch)

    4. **建立连接**:调用`session.connect()`方法建立与远程主机的连接。 5. **打开SFTP通道**:使用`session`打开一个SFTP通道,即`ChannelSftp`对象。 ```java ChannelSftp sftpChannel = (ChannelSftp) session....

Global site tag (gtag.js) - Google Analytics