Я нахожусь в 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, но не повезло.
Хорошо, то, что я собираюсь предложить, это очень простой элементарный способ ведения дел, но это может быть то, что вы ищете.
Как вы, вероятно, знаете, файл .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()
- вам нужно будет отфильтровать немного больше, это правда).
strace
и jstack -m
...
new_user
, написать скрипт, который запускает ps -U new_user > output.txt
в цикле в одном терминале, и запустить jar как new_user
в другом терминале. , Каждая команда exec()
d от jar также должна запускаться как new_user
, поэтому, когда Java-программа завершает свою работу, просто убейте скрипт ps
и output.txt
файл output.txt
.
ls
процессls
должен иметь процесс Java в качестве родителя, например, при просмотре выводаps
и т. Д.?