2010-01-18 3 views
6

파이프로 연결된 명령 행 프로그램을 호출하고 있습니다. 이 모든 것은 Linux에서 확실히 작동합니다. Java exec()가 파이프 연결된 명령의 예상 결과를 반환하지 않습니다.

내 방법 :

protected String execCommand(String command) throws IOException { 
    String line = null; 
    if (command.length() > 0) { 
     Process child = Runtime.getRuntime().exec(command); 
     InputStream lsOut = child.getInputStream(); 
     InputStreamReader r = new InputStreamReader(lsOut); 
     BufferedReader in = new BufferedReader(r); 

     String readline = null; 
     while ((readline = in.readLine()) != null) { 
      line = line + readline; 
     } 
    } 

    return line; 
} 

고양이 파일을 호출하고있어 경우 | grep asd, 예상되는 결과가 나타납니다. 그러나 모든 명령이 올바르게 작동하는 것은 아닙니다.

cat /proc/cpuinfo | wc -l 

나이 :이와 예를 들어

cat /proc/cpuinfo | grep "model name" | head -n 1 | awk -F":" '{print substr($2, 2, length($2))} 

방법은 null를 돌려줍니다. 나는이 문제를 짐작하고있다. 머리, 꼬리, wc 등 머리글을 출력 형식에 따라 다릅니다. 어떻게이 문제를 해결하고 출력 결과를 얻을 수 있습니까?

+1

는 cat''의 (* 3 사용)이 시도. –

+0

@Dennis - 실제로. 잘 목격되었다! –

+0

@Bobby 시도해 보았지만 도움이되지 않습니다. – Pawka

답변

2

Runtime.exec와 함께 파이프 된 명령을 실행하기위한 적절한 해결책을 찾지 못했으나 해결 방법을 찾았습니다. bash 파일을 분리하기 위해이 스크립트를 작성했습니다. 그런 다음 Runtime.exec은이 bash 스크립트를 호출하고 예상 된 결과를 얻습니다.

+0

Google을 통해 찾은 유일한 해결책입니다. 당신은 당신 자신의 대답을 받아 들일 수 없습니까? 어쨌든, 고마워. –

+0

내가 할 수있는 것처럼 보입니다 :-) – Pawka

8

파이프 (리디렉션 또는 >)는 쉘의 함수이므로 Java에서 직접 실행하는 기능은 작동하지 않습니다. (따옴표)를 -c 후 지정 (파이프 포함) 명령 줄 셸 프로세스를 실행

/bin/sh -c "your | piped | commands | here" 

: 당신은 같은 것을 할 필요가있다. 또한 당신이 그렇지 않으면 생성 된 프로세스는 출력 (또는 오류)를 소비하는 프로세스를 기다리는 차단합니다 stdout동시에stderr, 소비해야한다는

참고. 더 많은 정보 here.

+0

응답을위한 Thx 그러나 이것은 여전히 ​​문제를 해결하지 못합니다. – Pawka

2

Runtime.exec을 사용하는 사람은 모두 this이어야합니다.

0

것 할 수있는 빠른 - 및 - 더러운 일 :

command = "/bin/sh -c '" + command.replaceAll("'", "'\''") + "'" 

일반적으로, 당신은 (즉, 사람이 명령에 "; rm -rf /;"을 몰래) 쉘 주입 조심해야합니다. 그러나 명령의 일부가 다른 사용자 입력에서 제공 될 수있는 경우에만 문제가됩니다.

느리고 고통스러운 접근 방식은 Java에서 Bash 파이핑을하는 것입니다. 이 길로 가면 Process.exec (파이프, 리디렉션, 복합 명령, 변수 확장, 산술 계산 등)에서 직접 사용할 수없는 wonderful things that Bash gives you을 모두 찾을 수 있습니다.

  1. | 문자에 대한 명령 구문을 분석하십시오. || 및 따옴표 붙은 문자열에주의하십시오.
  2. 모든 파이프 명령에 대해 새 Process을 생성합니다.
  3. 한 명령의 출력을 읽고 다음 명령의 입력에 쓰는 Thread을 만듭니다. 너무 늦었지만 솔루션을 찾고 다른 사람에 대한
0

아마 조금

String[] cmd = { 
         "/bin/sh", 
         "-c", 
         "cat /proc/cpuinfo | wc -l" 
        }; 

Process process = Runtime.getRuntime().exec(cmd); 

모든 최고는 ... 쓸모없는

관련 문제