我知道syscall 1的意思,但是在bash中是否有一个命令可以列出所有在Linux上实现的syscall名称和编号?
syscall 1
t0ybt7op1#
man页面指向头文件sys/syscall.h,它包含所有定义的常量,位于/usr/include/sys/syscall.h(这是我使用的OSX上的位置,但我认为大多数Linux发行版也是一样的)。
man
sys/syscall.h
/usr/include/sys/syscall.h
dly7yett2#
这是我刚刚写的一个oneliner。它至少可以在Linux上工作,并且需要在机器上安装C编译器,因为它使用/usr/bin/cpp和系统包含文件。
/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]*$'
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")
3条答案
按热度按时间t0ybt7op1#
man
页面指向头文件sys/syscall.h
,它包含所有定义的常量,位于/usr/include/sys/syscall.h
(这是我使用的OSX上的位置,但我认为大多数Linux发行版也是一样的)。dly7yett2#
这是我刚刚写的一个oneliner。它至少可以在Linux上工作,并且需要在机器上安装C编译器,因为它使用
/usr/bin/cpp
和系统包含文件。rsl1atfo3#
我尝试@dolmen's answer,但它对我不起作用,所以我做了类似的事情,如下所示(linux mint x86_64)
..输出大约500行,如:
我可以使用以下命令创建一个 * sed * 命令文件:
我可以把这些数字从日志中翻译出来,就像这样:
它看起来像:
(it将"28"转换为"madvise")