在bash中是否有一个命令可以列出linux上所有的系统调用名称和编号?

3phpmpom  于 2023-03-07  发布在  Linux
关注(0)|答案(3)|浏览(92)

我知道syscall 1的意思,
但是在bash中是否有一个命令可以列出所有在Linux上实现的syscall名称和编号?

t0ybt7op

t0ybt7op1#

man页面指向头文件sys/syscall.h,它包含所有定义的常量,位于/usr/include/sys/syscall.h(这是我使用的OSX上的位置,但我认为大多数Linux发行版也是一样的)。

dly7yett

dly7yett2#

这是我刚刚写的一个oneliner。它至少可以在Linux上工作,并且需要在机器上安装C编译器,因为它使用/usr/bin/cpp和系统包含文件。

{ echo -e '#include <sys/syscall.h>\n#define X(c) #c c'; sed -n 's/#define \(SYS_[^ ]*\).*/X(\1)/p' $(echo -e '#include <sys/syscall.h>' | cpp | sed -n 's/# [0-9]* "\([^<"]*\)".*/\1/p') | sort -u; } | cpp -P | grep ' [0-9]*$'
rsl1atfo

rsl1atfo3#

我尝试@dolmen's answer,但它对我不起作用,所以我做了类似的事情,如下所示(linux mint x86_64)

echo -e '#include <sys/syscall.h>' | \
cpp -dM | grep "#define __NR_.*[0-9]$" | \
cut -d' ' -f 2,3 | cut -d_ -f 4-

..输出大约500行,如:

waitid 247
fdatasync 75
mq_getsetattr 245
sched_getaffinity 204
connect 42
epoll_pwait 281
init_module 175
....

我可以使用以下命令创建一个 * sed * 命令文件:

echo -e '#include <sys/syscall.h>' | cpp -dM | grep "#define __NR_.*[0-9]$" | cut -d' ' -f 2,3 | cut -d_ -f 4- | sed 's|\(.*\) \(.*\)|s/syscall=\2 /syscall=\1 /|' > syscalls.sed

我可以把这些数字从日志中翻译出来,就像这样:

dmesg | grep ' audit:' | sed -f syscalls.sed

它看起来像:

[171511.625242] audit: type=AUDIT_AVC audit(1677790613.406:135): apparmor="DENIED" operation="capable" profile="/usr/bin/man" pid=211339 comm="nroff" capability=1  capname="dac_override"
[173576.575868] audit: type=AUDIT_SECCOMP audit(1677847162.251:136): auid=4294967295 uid=33 gid=33 ses=4294967295 pid=200272 comm="apache2" exe="/usr/sbin/apache2" sig=31 arch=c000003e syscall=madvise compat=0 ip=0x7f5cf03eea7b code=0x80000000
[173593.434960] audit: type=AUDIT_SECCOMP audit(1677847179.107:137): auid=4294967295 uid=33 gid=33 ses=4294967295 pid=200266 comm="apache2" exe="/usr/sbin/apache2" sig=31 arch=c000003e syscall=madvise compat=0 ip=0x7f5cf03eea7b code=0x80000000

(it将"28"转换为"madvise")

相关问题