Команды оболочки Linux ведут себя странно с Runtime.exec () (экранная команда) - PullRequest
1 голос
/ 27 января 2012

Я сижу здесь, потому что, по крайней мере, всегда над проблемой, которая действительно побеждает меня!

Я пишу о простой и небольшой Java-программе, которая легко передает любую команду сеансу экрана (linux).

Shell command: bash -c "screen -p 0 -S sessionname -X eval 'stuff \"some command\"\015'"

Когда я ввожу это в командной оболочке, все работает нормально! Но если я позволю Java-программе сделать это, ничего не произойдет! Даже не сообщение или ошибка или подсказка! Просто ничего! Я позволил программе повторить сгенерированную экранную команду, и если я возьму этот вывод и вставлю его в оболочку, он будет работать.

Вот мой код Java:



    static public void screenCmd() throws IOException
    {
     String command = "bash -c \"screen -p 0 -S screenname -X eval 'stuff \\\"cmd\\\"\\015'\"";

     System.out.println("debug: '" + command + "'"); //output would work
                                                     //when copy and paste it to the shell

     InputStreamReader isr = new InputStreamReader(
        Runtime.getRuntime().exec(command).getInputStream()
     );

     //for debug output
     BufferedReader br = new BufferedReader(isr);
     String line = "";
     while ((line = br.readLine()) != null)
       System.out.println(line);
    }

Самое смешное, что все остальные команды оболочки работают. Я пробовал Java на exec tail, whoi, cp, ls, ... без проблем. Почему не экран?

Java-программа запускается тем же пользователем, который начал сеанс экрана.

Если у кого-то есть хоть маленькая идея, пожалуйста, сообщите! Я схожу с ума здесь!

p.s .: Сеанс экрана также запускает Java-программу! (это может быть частью проблемы?)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Я бы порекомендовал вам попробовать более современный ProcessBuilder класс.

И прочитать это:

  1. Five Common Java.lang.Process Pitfalls
  2. Когда Runtime.exec () не
  3. Из Runtime.exec () в ProcessBuilder
0 голосов
/ 27 января 2012

Настоящая проблема заключается в анализе командной строки: Java Runtime.exec не следует тем же правилам цитирования, что и Bash. Вместо этого вы должны использовать массив API-версии:

String[] command = {"bash", "-c", 
    "screen -p 0 -S screenname -X eval 'stuff \\\"cmd\\\"\\015'"};
Runtime.getRuntime().exec(command);

Вы можете уменьшить часть беспорядка цитирования, если выполняете экран напрямую, не проходя через bash:

String[] command = {"screen", "-p", "0", 
    "-S", "10624.pts-2.koivu", "-X", "eval", "stuff \"cmd\"\\015"};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...