拦截特定可执行文件的输入和输出

拦截特定可执行文件的输入和输出

我有一个特定的 Linux 可执行文件,它被一个更大的应用程序调用来执行一些计算。我想修改执行计算的方式,因为我首先需要了解如何调用可执行文件以及以何种方式传输参数和数据。

因此,如果调用此可执行文件,我想监视命令行参数、stdin 和 stdout。可执行文件的正常运行不应受到干扰。

有没有简单的方法可以做到这一点?

更新:

我尝试使用 shell 脚本占位符想法来使用以下脚本获取所有数据:

#!/bin/bash
export LOGFILE=/tmp/logname
echo `env` > $LOGFILE-env
echo "$@" >> $LOGFILE-arguments
tee -a $LOGFILE-stdin | /path/to/real/executable 2>&1 | tee -a $LOGFILE-stdout

这对于测试输入来说效果很好,但如果真正调用它,它就会挂起。也许发生的事情比我想象的还要多。

答案1

选项 1 是修改调用应用程序的源代码并插入tee到输出管道中,以获取输出的副本以供在该阶段进行审查。

选项 2 是围绕相关可执行文件编写一个包装脚本。一个快速脚本,将标准输入和参数传递给真正的应用程序,然后将输出发送到某个位置供您查看,并将其吐出,就像应用程序应该只需几行代码即可启动一样。将其放在特殊的位置并将该位置添加到 PATH 变量的前面,然后运行您的应用程序。

#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output

答案2

您可以通过调用以下程序来获取有关程序的大量信息strace。这显示了程序进行的每个系统调用,有时信息量可能太大,但对于查找问题所在有很大帮助。

方法一是在strace.这可能会产生大量输出并减慢应用程序的速度。

strace -s9999 -efile,process -f -o bigapp.strace bigapp

如果大型应用程序是交互式的,您可能更愿意启动它,并在准备好触发计算后将 strace 连接到它。记下应用程序的进程 ID,例如 12345,然后运行

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

如果观察外部可执行文件就足够了,那么 其他 答案已经建议,用包装脚本替换该可执行文件。您可以将可执行文件移动到不同的名称并将包装器脚本放在其位置,或者将包装器脚本放在 中的常用可执行文件之前PATH,或者将应用程序配置为调用您的包装器脚本而不是常用的可执行文件,只要方便即可。制作包装脚本

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

使用的strace参数说明:

  • -e选择系统调用追踪。您可以按名称指定系统调用或使用一些类别,例如file( open, close, read, write, ...) 和process( fork, execve, ...) 。
  • -f让 strace 跟随叉子,即跟踪子流程以及原始流程。
  • -o选择包含跟踪的文件的名称。$$是一个 shell 构造,代表 shell 进程的进程 ID(由于exec在最后一个包装器脚本中使用了 ,因此它也将是辅助应用程序的进程 ID)。
  • -s9999使其显示readwrite以及其他调用的字节数。

答案3

您不应该更改路径,而应该将您感兴趣的二进制文件从“binary”移动到“binary.orig”,然后用脚本替换它。您说过您对这些参数感兴趣,因此您也想将它们写入文件中。您可能还会对命令“env”的输出感兴趣。它转储当前活动的所有环境变量。一个程序经常使用环境变量来影响它调用的另一程序的行为。

答案4

以下对我有用:

猫-|三通/tmp/in.log | /路径/到/realapp $@ |三通/tmp/out.log

相关内容