2012-03-29 3 views
6

자바 런타임 클래스를 사용하여 사용자 입력을 기다리는 쉘 스크립트를 실행하는 방법이 있습니까?Java Runtime을 사용하여 대화식 셸 스크립트를 실행하는 방법은 무엇입니까?

#!/bin/bash 

echo "Please enter your name:" 
read name 
echo "Welcome $name" 

이 작업을 수행하려면 다음 Java 코드를 사용하고 있지만 빈 콘솔 만 표시합니다. 나는 위의 프로그램 실행할 때

것입니다

public class TestShellScript { 
public static void main(String[] args) { 

     File wd = new File("/mnt/client/"); 
      System.out.println("Working Directory: " +wd); 
      Process proc = null; 

      try { 
       proc = Runtime.getRuntime().exec("sudo ./test.sh", null, wd); 

      } catch (Exception e) { 
      e.printStackTrace(); 
      } 


} 

는}, 나는 그것이 쉘 스크립트와 사용자 입력을 대기하는 쉘 스크립트를 실행합니다 생각하지만, 그것은 단지 종료 후 현재 디렉토리를 출력합니다. 이 일을 할 수있는 방법이 있습니까 아니면 그것은 자바에서 전혀 가능하지 않습니까? 사전

+0

http://stackoverflow.com/questions/4784789/call-interactive : 자바에서 외부 스크립트를 실행하는 경우 그러나 나는 매우 강력하게 가공 Exec을 살펴 가지고하는 것이 좋습니다 -perl-script-from-java –

답변

1

는 현재 디렉토리를 출력하고 종료하는 이유에

덕분에 자바 응용 프로그램을 종료하기 때문이다. 당신은 당신의 생성 과정의 입력 및 오류 스트림에 (스레드) 리스너를 추가해야합니다, 당신은 아마

예를 들어 프로세스의 출력 스트림에의 PrintStream를 추가 할 수 있습니다 :



      proc = Runtime.getRuntime().exec(cmds); 
      PrintStream pw = new PrintStream(proc.getOutputStream()); 
      FetcherListener fl = new FetcherListener() { 

       @Override 
       public void fetchedMore(byte[] buf, int start, int end) { 
        textOut.println(new String(buf, start, end - start)); 
       } 

       @Override 
       public void fetchedAll(byte[] buf) { 
       }   
      }; 
      IOUtils.loadDataASync(proc.getInputStream(), fl); 
      IOUtils.loadDataASync(proc.getErrorStream(), fl); 
      String home = System.getProperty("user.home"); 
      //System.out.println("home: " + home); 
      String profile = IOUtils.loadTextFile(new File(home + "/.profile")); 
      pw.println(profile); 
      pw.flush(); 

실행하려면 이 경우, 내 소스 포지 프로젝트 인 : http://tus.sourceforge.net/을 다운로드해야 할 것입니다. 그러나 코드 스 니펫이 충분히 유용하기 때문에 J2SE와 다른 것들을 사용할 수 있습니다.

+0

예를 들어 자세히 설명하는 웹 페이지의 링크 또는 예제 코드를 게시 할 수 있습니까? –

+0

여기에 보여주는 몇 가지 코드가 있습니다 : – ControlAltDel

+0

SVN에서 코드를 시도해 보았습니다. SVN에서 소스를 다운로드했는데, 입력을 기다리는 것과 콘솔에 입력을 입력 할 수는 있지만 쉘 스크립트와 프로그램에 입력을 전달하지 않습니다. 실행 중. 이름 셸 스크립트를 입력 한 후 이름을 출력해야하고 프로그램이 실행되어야하는 것이 이상적입니다. –

1

Java ProcessBuilder를 사용하는 경우 생성 한 프로세스의 입력, 오류 및 출력 스트림을 가져올 수 있어야합니다.

이러한 스트림을 사용하면 프로세스에서 나오는 정보 (예 : 입력 프롬프트)를 얻을 수 있지만 프로세스에 정보를 직접 입력 할 수도 있습니다. 예를 들면 다음과 같습니다.

InputStream stdout = process.getInputStream(); 
BufferedReader reader = new BufferedReader (new InputStreamReader(stdout)); 

String line; 
while(true){ 
    line = reader.readLine(); 
    //... 

이렇게하면 프로세스에서 직접 출력을 얻을 수 있습니다. 나는 직접 해본 적이 없지만, process.getOutputStream()은 직접 입력하여 프로세스에 입력 할 수있는 것을 제공합니다.

1

sudo과 같은 대화 형 프로그램을 실행할 때의 문제점은 Runtime.exec에서 stdin과 stdout을 필요한 콘솔 장치가 아닌 파이프에 연결한다는 것입니다. 당신은 redirecting the input and output to /dev/tty에 의하여 그것을 일할 수 있습니다.

ProcessBuilder 클래스를 사용하여 동일한 동작을 수행하고 ProcessBuilder.Redirect.INHERIT을 사용하여 리디렉션을 설정할 수 있습니다.

관련 문제