상세 컨텐츠

본문 제목

java runtime 을 이용한 외부 명령어 실행 nslookup [2021.04.22]

보안/java

by MustThanks 2021. 4. 22. 13:23

본문

반응형

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Vector;

public class IpToDomainNslookup {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		try
		{
			// 입력 파일의 내용 형식                                 : xxx.xxx.xxx.xxx(소스 아이피) , xxx.xxx.xxx.xxx(목적지 아이피)
			// 결과 파일의 내용 형식(도메인이 있는 경우) : source IP : xxx.xxx.xxx.xxx(소스 아이피) 목적지 IP: xxx.xxx.xxx.xxx(목적지 아이피) Domain:www.site.com
			// 결과 파일의 내용 형식(도메인이 없는 경우) : source IP : xxx.xxx.xxx.xxx(소스 아이피) 목적지 IP: xxx.xxx.xxx.xxx(목적지 아이피)  
			
			IpToDomainNslookup ipToDomainNslookup = new IpToDomainNslookup();
			
			String readFileName 	= "D:\\Documents\\Tools\\Tmp\\eclipse\\workspaces\\Email\\src\\org\\https\\url\\readFileName.txt";
			String writeFileName	= "D:\\Documents\\Tools\\Tmp\\eclipse\\workspaces\\Email\\src\\org\\https\\url\\writeFileName.txt";
			
			ipToDomainNslookup.runProcess(readFileName,writeFileName);
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
	}
	
	//파일의 내용을 읽어들이는 기능을 제공
	BufferedReader bufferedReaderFromFile = null;
	
	//읽어들이기위한 파일을 연결
	InputStream inputStream = null;

	//읽고쓰기위한 파일을 연결하는 기능
	private void setInitRead(String readFileName,String writeFileName) throws IOException
	{
		
		File file = new File(readFileName) ;
		inputStream = new FileInputStream(file);
		
		bufferedReaderFromFile = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
		
		//파일을 쓰기위한 내용
		file 	= new File(writeFileName) ;
		outputStream = new FileOutputStream(file);
		
	}
	
	//사용한 파일자원을 반납하는 기능
	private void close() throws IOException
	{
		//읽기
		if(bufferedReaderFromFile!=null)
		{
			bufferedReaderFromFile.close();
			bufferedReaderFromFile=null;
		}
		
		//파일내용을 읽기위해서 파일과 연결
		if(inputStream!=null)
		{
			inputStream.close();
			inputStream=null;
		}
		
		//프로세스에서 결과를 읽어오는 기능
		if(bufferedReaderProcess!=null)
		{
			bufferedReaderProcess.close();
			bufferedReaderProcess=null;
		}
		
		//결과를저장하는기능
		if(outputStream!=null)
		{
			outputStream.close();
			outputStream=null;
		}
		
	}
	
	//파일을 열어서 읽어들이는 기능
	private String getFileContext() throws IOException
	{
		return bufferedReaderFromFile.readLine();
	}
	
	//결과를기록
	OutputStream outputStream = null;
	
	//프로세스에서 nslookup 실행 결과를 읽어들이기
	BufferedReader bufferedReaderProcess = null;
	
	public void runProcess(String readFileName,String writeFileName) throws IOException
	{
		//file encoding utf-8 로 변경
		System.setProperty("file.encoding","utf-8");
		//변경한 내용확인
		System.out.println(System.getProperty("file.encoding"));
		
		//Runtime Object 생성
		Runtime runtime = Runtime.getRuntime();
		//실행 결과 확인을 위한 Object
		Process process ;
				
		int index=0;
		try
		{
			//파일 읽어오기 위해서 초기화 와 결과를 쓰기위한 초기화
			setInitRead( readFileName, writeFileName);
			
			//내용저장하기위한 분기처리를 하기위하여 선언
			boolean bool=false;
			
			String string="";			
			String[] strSplite;
			
			String strRead	=	"";
			String tmp		=	"";

			//파일에서 데이터를 읽어오는 기능
			while((string =getFileContext())!=null)
			{
				//소스 서버 IP , nslookup 목적지 서버 IP 의 형식으로 string에 입력되어 , 구분자를 이용해서 데이터를 나누는 기능
				strSplite =  string.split(",");
				
				//명령어 실행
				process = runtime.exec("nslookup " + strSplite[1]);
				
				//windows 실행결과 한글 깨짐방지 EUC-KR
				bufferedReaderProcess = new BufferedReader(new InputStreamReader(process.getInputStream(),"EUC-KR"));
				
				strRead	=	"";
				tmp		=	"";
				
				outputStream.write( ("source IP : " + strSplite[0] + "\t").getBytes());
				outputStream.write( ("목적지 IP : " + strSplite[1].replace("nslookup", "").trim()).getBytes());
				//외부명령어 결과를 읽어들이는 기능을 하는 명령어
				while((strRead = bufferedReaderProcess.readLine()) !=null)
				{
						if(strRead.contains("이름:"))
						{
							tmp =  strRead.replace("이름:", "\t Domain:");
							outputStream.write(tmp.getBytes());
							break;
						}
						
						strRead	=	"";
						
				}//while((strRead = bufferedReaderProcess.readLine()) !=null)
				
				outputStream.write("\n".getBytes());
				
				System.out.println(index++);
			}//while((string =getFileContext())!=null)
		}
		catch(IOException e)
		{
			System.out.println(e.toString());
			e.printStackTrace();
			
			throw e;
		}
		finally
		{
			close();
		}
		
	}
	
}

관련글 더보기

댓글 영역