티스토리 뷰

자바(Java)

자바 리눅스 쉘 실행

xemaker 2020. 1. 22. 15:22

자바 리눅스 쉘 실행하는 방법을 살펴본다. 아래 출처 내용이 보기 힘들어서 새로 했고 소스에러난 부분도 수정해서 올린다.

 

아래 소스를 안정적으로 사용하기 위해서는 추가적인 이슈들을 해결해야 한다.

1. 한글이 깨지는 것에 유의해야 한다.

Stream으로 값을 꺼낼 때 encoding 타입을 적절하게 설정해야 한다.

2. command 명령어를 실행할 때 다소 위험한 명령어들은 필터링 할 필요가 있다.

예를들면 상황에 따라 다르겠지만 삭제 명령어나 OS를 수정할 수 있는 명령어 등은 막아야 한다.

3. 여러 명령어를 보내는 테스트 중에 오류가 아닌데 process.getErrorStream() 을 넘겨줄 때가 있었다.

오류라고 판단했는데 정상적으로 실행이 되는 경우가 있다.

테스트 하면서 나온 부분이고 위 내용들은 더 보완해야 할 것 같다.

public class CommandLineExecutor {
 
    public static void main(String[] args) {
        // 실행
        CommandLineExecutor.execute("ipconfig");
    }
 
    /**
     * cmd 명령어 실행
     *
     * @param cmd
     */
    public static void execute(String cmd) {
        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer(); // 성공 스트링 버퍼
        StringBuffer errorOutput = new StringBuffer(); // 오류 스트링 버퍼
        BufferedReader successBufferReader = null; // 성공 버퍼
        BufferedReader errorBufferReader = null; // 오류 버퍼
        String msg = null; // 메시지
 
        List<String> cmdList = new ArrayList<String>();
 
        // 운영체제 구분 (window, window 가 아니면 무조건 linux 로 판단)
        if (System.getProperty("os.name").indexOf("Windows") > -1) {
            cmdList.add("cmd");
            cmdList.add("/c");
        } else {
            cmdList.add("/bin/sh");
            cmdList.add("-c");
        }
        // 명령어 셋팅
        cmdList.add(cmd);
        String[] array = cmdList.toArray(new String[cmdList.size()]);
 
        try {
 
            // 명령어 실행
            process = runtime.exec(array);
 
            // shell 실행이 정상 동작했을 경우
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
 
            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // shell 실행시 에러가 발생했을 경우
            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }
 
            // 프로세스의 수행이 끝날때까지 대기
            process.waitFor();
 
            // shell 실행이 정상 종료되었을 경우
            if (process.exitValue() == 0) {
                System.out.println("성공");
                System.out.println(successOutput.toString());
            } else {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("비정상 종료");
                System.out.println(successOutput.toString());
            }
 
            // shell 실행시 에러가 발생
            if (errorOutput.toString().length()>0) {
                // shell 실행이 비정상 종료되었을 경우
                System.out.println("오류");
                System.out.println(successOutput.toString());
            }
 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null) successBufferReader.close();
                if (errorBufferReader != null) errorBufferReader.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
 
}

 

저렇게 개발하고 실행해보면

Windows IP 구성


이더넷 어댑터 이더넷:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김
   연결별 DNS 접미사. . . . :

무선 LAN 어댑터 로컬 영역 연결* 1:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김
   연결별 DNS 접미사. . . . :

무선 LAN 어댑터 로컬 영역 연결* 2:

   미디어 상태 . . . . . . . . : 미디어 연결 끊김
   연결별 DNS 접미사. . . . :

무선 LAN 어댑터 Wi-Fi:

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . :

 

머 이런식으로 윈도우에서 ipconfig 쳤을때랑 똑같이 나올것이다.

생각해보니 명령어를 소스에 고정하지 않고 파라미터로 입력받아서 사용하면 어떤 명령어 이던지 실행가능 할것 같다는 생각이 들었다.

다음글에서 살펴본다.


출처: https://cofs.tistory.com/365

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함