Что такое JAVA exec ()?

2

Я нахожусь в Linux, и у меня есть приложение Java (архив JAR), в котором используется exec(), чтобы сделать это. Мне нужно выяснить, какие команды это приложение exec() ut... Я пробовал strace и jstack, но без каких-либо результатов. Предположим, что приложение вызывает exec ("ls"), могу ли я найти команду ls только путем вывода grepping из вышеперечисленных программ?

Поэтому возникает вопрос: есть ли простой способ посмотреть, что выполняется Java-приложением с exec()?

Изменить для лучшего обзора ситуации:

Предположим, что в приложении Java у меня есть кнопка с onclick-слушателем, которая вызывает статическую функцию из другого класса. В этой функции используется exec("ls"); называется. Когда я нажимаю эту кнопку, я вижу это в strace:

futex(0x7f14a6f799d0, FUTEX_WAIT, 4968, NULLDownload button clicked ! Trying SCP FROM... <unfinished...>

Попытка SCP FROM.. является только моим sout в этом обработчике кнопок прямо перед вызовом exec().

Другое редактирование: Спасибо, ребята, но я говорю с точки зрения OS... Предположим, что я сисадмин, и я скачал JAR. Я хочу знать (извне), что делает JAR - меня интересуют только программы, запущенные с exec()

Поэтому я попробовал strace но он ничего не говорит о вызове этой команды из exec... Может быть, это слишком много запросов на низкий уровень для этого...

Затем я попробовал jstack -m но я не могу найти ничего подобного этой команде от exec. Я пробовал строку grepping, но не повезло.

  • 0
    ls процесс ls должен иметь процесс Java в качестве родителя, например, при просмотре вывода ps и т. Д.?
  • 0
    @ Томас: Но этот процесс будет жить только в течение нескольких миллисекунд.
Показать ещё 3 комментария
Теги:
exec
trace

1 ответ

2
Лучший ответ

Хорошо, то, что я собираюсь предложить, это очень простой элементарный способ ведения дел, но это может быть то, что вы ищете.

Как вы, вероятно, знаете, файл .jar - это просто ZIP-архив, состоящий из файлов Java .class. Если вам просто нужно посмотреть, какие команды будут выполняться, и если вы знаете класс, который должен их выполнять, вы можете просто извлечь файлы классов из jar файла с помощью gzip а затем использовать strings для них ищите команды.

Например, вот самый простой класс, о котором я мог подумать, который использует exec():

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec("/bin/ls");
        } catch (IOException ignored) {}
    }
}

Если вы делаете strings Main.class вы должны получить что-то вроде этого:

[...]$ strings Main.class
<init>
Code
LineNumberTable
LocalVariableTable
this
LMain;
main
([Ljava/lang/String;)V
args
[Ljava/lang/String;
StackMapTable
SourceFile
        Main.java
/bin/ls
java/io/IOException
Main
java/lang/Object
java/lang/Runtime
getRuntime
()Ljava/lang/Runtime;
exec
'(Ljava/lang/String;)Ljava/lang/Process;

Как видите, /bin/ls можно идентифицировать как строку. Это должно работать в большинстве случаев, если только ваша Java-программа не создает команды странным образом, как, например, использование массива char для создания командных строк во время выполнения, просто чтобы скрыть выполняемые команды (в этом случае я бы очень подозрительно относился к такому программа).

Однако, если вы хотите, чтобы команды выполнялись в режиме реального времени, я боюсь, что вам придется прибегнуть к какой-либо утилите мониторинга, так как большинство команд будут слишком короткими, чтобы даже появиться top и тому подобное.

РЕДАКТИРОВАТЬ: Относительно strace: я посмотрел на Java-код C для систем UNIX, и кажется, что он на самом деле использует системный вызов execvpe() для запуска всех команд, запущенных с Runtime.exec():

    execvpe(argv[0], argv, envv);

Таким образом, теоретически, вы должны иметь возможность запустить strace -e execvpe <java command...> чтобы strace -e execvpe <java command...> список всех выполненных команд (а также всех остальных вызовов execvpe() - вам нужно будет отфильтровать немного больше, это правда).

  • 0
    Хм, спасибо Это интересно ... Вы знаете хотя бы названия этих утилит? Я пробовал strace и jstack -m ...
  • 2
    Я посмотрел вокруг и нашел это: superuser.com/questions/222912/… . В качестве альтернативы, и теперь я просто размышляю вслух, вы можете: создать пользователя new_user , написать скрипт, который запускает ps -U new_user > output.txt в цикле в одном терминале, и запустить jar как new_user в другом терминале. , Каждая команда exec() d от jar также должна запускаться как new_user , поэтому, когда Java-программа завершает свою работу, просто убейте скрипт ps и output.txt файл output.txt .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню