[안드로이드] 리눅스 커맨드를 실행하고 결과값을 받아오기

(SELinux 상태 확인하기)


Viper4Android Installer 앱을 만들면서 SELinux의 상태를 확인하는 부분을 넣으면서 리눅스 커맨드를 실행, 결과값을 받아와야했다. ProcessBuilder만으로는 실행은 가능하나 결과를 반환할 수 없었기 때문에 BufferReader를 이용하였다.

ProcessBuilder를 이용해 커맨드를 실행하고 BufferReader를 이용해 결과값을 받아올 수 있다.


예시

뜬금없지만 아래는 완성된 코드예시이다.

1
2
3
4
5
6
7
8
9
10
11
public static String SelinuxStatus() {
    String line = null;
    try {
        Process p = Runtime.getRuntime().exec(“getenforce”);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        line = br.readLine();
        return line;
    } catch (Exception e) {
        return null;
    }
}
cs



요약하자면,

SelinuxStatus()를 실행하면 (Process) p가 "getenforce" 명령어를 실행하고, (BufferedReader) br이 (String) line에 p를 실행하고나서의 결과값을 입력한다.

내가 썼지만 무슨 말을 하는지 모르겠다. 그냥 한줄한줄 읽어보자.

설명

line 2 > String line;

문자열 line을 초기화한다. getenforce 명령어를 실행하면 결과값이 문자열로 나오기 때문에 문자열로 초기화하였다.

line 4 > Process p = Runtime.getRuntime.exec(“getenforce”);

“getenforce”라는 명령어를 가져와서 실행한다는 뜻이다. 설정 앱의 휴대전화 정보 (또는 태블릿 정보)에서도 SELinux 상태를 확인할 수 있다.

참고로 “setenforce” 명령어는 SELinux 상태를 변경할 수 있다.
ex) setenforce 0 또는 setenforce 1

line 5 > BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

BufferReader가 프로세스 p의 실행 결과를 받아오도록 초기화, 실행한다.

line 6 > line = br.readLine();

br이 읽은 결과 값을 line에 저장한다.

line 7 > return line;

문자열 line을 반환한다.

line 9 > return null;

try문을 실행도중 에러가 발생시 catch문에서 null을 반환한다.

주요 부분

line 4 > Process p = Runtime.getRuntime.exec(“getenforce”);

line 5 > BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

line 6 > line = br.readLine();

DesignOZ

,