티스토리 뷰
자바 리눅스 쉘 실행하는 방법을 살펴본다. 아래 출처 내용이 보기 힘들어서 새로 했고 소스에러난 부분도 수정해서 올린다.
아래 소스를 안정적으로 사용하기 위해서는 추가적인 이슈들을 해결해야 한다.
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 쳤을때랑 똑같이 나올것이다.
생각해보니 명령어를 소스에 고정하지 않고 파라미터로 입력받아서 사용하면 어떤 명령어 이던지 실행가능 할것 같다는 생각이 들었다.
다음글에서 살펴본다.
'자바(Java)' 카테고리의 다른 글
자바 rmi java.rmi.ConnectException: Connection refused to host: 10.1.1.1; nested exception is: java.net.ConnectException: Connection refused: connect (0) | 2020.01.23 |
---|---|
자바 리눅스 쉘 실행 -2 (0) | 2020.01.22 |
[JAVA] 자바 rmi(remote method invocation) 샘플 예제 코드 (3) | 2020.01.17 |
자바 jsp 파일 다운로드 (0) | 2019.12.12 |
자바 aes 암호화 복호화 예제 (0) | 2019.12.09 |
- Total
- Today
- Yesterday
- ocajp
- 인포믹스
- proc
- XE
- 문자열
- 자바 smtp
- xe addon
- EC
- 이클립스
- 파이썬
- php
- webix
- 라이믹스 모듈
- ocjap
- 파싱
- 포인터
- XE3
- 플러터
- C
- JDBC
- 오라클
- C언어
- 자바
- 스크래핑
- esql
- MySQL
- xe애드온
- Python
- 프로씨
- KG
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |