首页 > 解决方案 > 在 Linux 系统调用序列中区分 execve() 的解释器

问题描述

当 execve() 在 Debian Linux 上执行文件时,如何从其 strace 系统调用日志中知道它使用哪个解释器?

例如,如何知道文件是作为 bash 脚本(#!/bin/bash)、python 脚本(#!/usr/bin/env python)还是纯 ELF 文件执行的?

假设我们没有正确的文件后缀,所以我们不能简单地从 execve() 的参数中分辨出来。

如果它不能从 strace 系统调用日志中获取,可以使用哪些其他方法?

标签: linuxshellsystem-callsinterpreterexecve

解决方案


为此使用文件

$ echo '#!/bin/python' > 1
$ file 1
1: a /bin/python script, ASCII text executable

$ echo '#!/bin/sh' > 2
$ file 2
2: POSIX shell script, ASCII text executable

$ echo '#!/usr/bin/env python' > 3
$ file 3
3: Python script, ASCII text executable

$ echo 'int main() { return 0; } ' | gcc -xc -o4 -
$ file 4
4: ELF 64-bit LSB pie executable x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d2f65ad2fe7b73bd5f4acc9fc9da25f748fe9915, not stripped

推荐阅读