什么是 JAVA exec()uting?
What is JAVA exec()uting?
我在 Linux 并且我有一个 Java 应用程序(JAR 存档)正在使用 exec() 来做它的东西。我需要找出应用程序 exec()uting 是哪些命令...我尝试了 strace 和 jstack 但没有任何结果。假设应用程序正在调用 exec("ls"),我可以仅通过 grepping 上述程序的输出来找到 ls 命令吗?
所以问题是:
有没有一种简单的方法来观察 Java 应用程序正在使用 exec() 执行什么?
编辑以获得更好的情况概览:
假设在 Java 应用程序中我有一个带有 onclick 侦听器的按钮,它从另一个 class.In 调用静态函数,该函数被 exec("ls");
调用。
当我点击那个按钮时,我在 strace 中看到了这个:
futex(0x7f14a6f799d0, FUTEX_WAIT, 4968, NULLDownload button clicked !
Trying SCP FROM...
<unfinished ...>
尝试 SCP FROM.. 只是我在调用 exec()
.
之前在那个按钮处理程序中的声音
另一个编辑:
谢谢你们,但我是从 OS 的角度来谈的……假设我是系统管理员并且我下载了 JAR。我想知道(从外部)那个 JAR 在做什么 - 我只对从 exec()
开始的程序感兴趣
所以我尝试了 strace
但它没有显示任何有关从 exec 调用该命令的信息...也许它为此记录了太多低级别调用...
然后我尝试了 jstack -m
但我找不到任何看起来像来自 exec 的命令的东西。我尝试了 grepping 字符串,但没有成功。
好的,我要提议的是 veeeeeeeeeeery 基本的做事方式,但它可能正是您要找的。
您可能知道,.jar
文件只是一个由 Java .class
个文件组成的 ZIP 存档。如果您只需要查看将要执行的命令, 和 如果您知道应该执行的 class要执行它们,您只需使用 gzip
从 jar 文件中提取 class 文件,然后对它们使用 strings
来查找命令。
例如,这是我能想到的最简单的 class 使用 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's native C code for UNIX systems,它似乎实际上使用 execvpe()
系统调用 运行 所有使用 Runtime.exec()
:
execvpe(argv[0], argv, envv);
因此,理论上,您应该能够 运行 strace -e execvpe <java command...>
列出执行的每个命令(以及对 execvpe()
的所有其他调用——您需要再过滤一点,没错。
我在 Linux 并且我有一个 Java 应用程序(JAR 存档)正在使用 exec() 来做它的东西。我需要找出应用程序 exec()uting 是哪些命令...我尝试了 strace 和 jstack 但没有任何结果。假设应用程序正在调用 exec("ls"),我可以仅通过 grepping 上述程序的输出来找到 ls 命令吗?
所以问题是: 有没有一种简单的方法来观察 Java 应用程序正在使用 exec() 执行什么?
编辑以获得更好的情况概览:
假设在 Java 应用程序中我有一个带有 onclick 侦听器的按钮,它从另一个 class.In 调用静态函数,该函数被 exec("ls");
调用。
当我点击那个按钮时,我在 strace 中看到了这个:
futex(0x7f14a6f799d0, FUTEX_WAIT, 4968, NULLDownload button clicked !
Trying SCP FROM...
<unfinished ...>
尝试 SCP FROM.. 只是我在调用 exec()
.
另一个编辑:
谢谢你们,但我是从 OS 的角度来谈的……假设我是系统管理员并且我下载了 JAR。我想知道(从外部)那个 JAR 在做什么 - 我只对从 exec()
所以我尝试了 strace
但它没有显示任何有关从 exec 调用该命令的信息...也许它为此记录了太多低级别调用...
然后我尝试了 jstack -m
但我找不到任何看起来像来自 exec 的命令的东西。我尝试了 grepping 字符串,但没有成功。
好的,我要提议的是 veeeeeeeeeeery 基本的做事方式,但它可能正是您要找的。
您可能知道,.jar
文件只是一个由 Java .class
个文件组成的 ZIP 存档。如果您只需要查看将要执行的命令, 和 如果您知道应该执行的 class要执行它们,您只需使用 gzip
从 jar 文件中提取 class 文件,然后对它们使用 strings
来查找命令。
例如,这是我能想到的最简单的 class 使用 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's native C code for UNIX systems,它似乎实际上使用 execvpe()
系统调用 运行 所有使用 Runtime.exec()
:
execvpe(argv[0], argv, envv);
因此,理论上,您应该能够 运行 strace -e execvpe <java command...>
列出执行的每个命令(以及对 execvpe()
的所有其他调用——您需要再过滤一点,没错。