我在Linux上,我有一个Java应用程序(JAR归档),它使用exec()来完成它的工作。我需要找出哪些命令是应用程序exec()uting.我尝试了strace和j堆栈,但是没有任何结果。假设应用程序正在调用exec(" ls "),我是否可以通过对上面程序的输出进行查看就发现ls命令?
因此,问题是:是否有一种简单的方法可以观察Java应用程序如何使用exec()执行?
编辑以获得更好的情况概述:
假设在Java中,我有一个带有onclick监听器的按钮,它从另一个class.In调用静态函数,这个函数是exec("ls");
调用的。当我单击该按钮时,我会看到以下内容:
futex(0x7f14a6f799d0, FUTEX_WAIT, 4968, NULLDownload button clicked ! Trying SCP FROM... <unfinished ...>
试着从.。在打电话给exec()
之前就是我在那个按钮处理程序中的sout。
另一个编辑:谢谢你们,但我是从操作系统的角度.假设我是sysadmin并下载了JAR。我想知道(从外部)那个JAR在做什么--我只对从exec()
开始的程序感兴趣
所以我尝试了strace
,但是它并没有显示出调用来自执行层的命令.也许是因为太低的要求.
然后我尝试了jstack -m
,但是从执行部分找不到任何类似于这个命令的东西。我试过拉绳,但运气不佳。
发布于 2016-11-08 13:12:44
好的,我要提出的是一种veeeeeeeeeery基本的做事方式,但这可能是你想要的。
您可能知道,.jar
文件只是一个由.class
文件组成的ZIP归档文件。如果您只需要查看将执行哪些命令,和(如果您知道应该执行它们的类),可以使用gzip
从jar文件中提取类文件,然后在它们上使用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用于UNIX系统的本机C代码,看起来它实际上使用execvpe()
系统调用来运行用Runtime.exec()
启动的所有命令
execvpe(argv[0], argv, envv);
因此,从理论上讲,您应该能够运行strace -e execvpe <java command...>
来列出执行的每个命令(以及对execvpe()
的所有其他调用--您需要进行更多的筛选,这是事实)。
https://stackoverflow.com/questions/40486455
复制相似问题