总结Linux系统中system()函数的用法

我们来谈谈Linux系统上的system()函数。
这是相当实用的。
它对于在命令行上执行操作非常有用,就像我们通常会喊“给我来咖啡”一样。

首先,system()函数只是一个语句,类似于:int system(const char command);。
该命令只是一个字符串,告诉系统您想要它做什么,例如“ls-l”,它是目录的详细列表。

要使用该函数,必须首先声明该函数,然后编写一个指示要执行的命令的字符串。
当您运行命令时,您会得到一个返回值。
该值(通常为0)表示成功; 0 以外的任何值都表示出现问题。

请注意,此 system() 函数需要 fork() 子进程。
然后子进程加载 shell /bin/sh 并执行命令。
父进程等待子进程退出,然后再通知子进程结果。

例如,我之前写过以下代码。
包括 包括 int main() { int result = system("ls-l"); if (result == 0) { printf("命令执行成功。
\n"); } else { printf("命令失败,状态:%d\n", result);返回 0。
这使用 system() 来执行命令并根据返回值确定成功或失败。

但是,system()函数也存在风险。
例如,用户输入可用于插入命令,因此要小心。
我们建议您不要直接使用用户输入。
您应该先检查或使用白名单过滤。

此外,使用绝对路径可以防止攻击者更改您的 PATH 环境变量并劫持您的命令。
参数包含特殊字符,必须转义。
例如,如果目录名称包含空格,则必须将其括在引号中。

为了安全起见,直接使用execve()系列函数调用你的程序比使用system()更安全。

总之,system()函数非常有用,但应谨慎使用,以免成为安全风险。

execve的返回值是什么

execve() 函数用于运行程序。
简单来说,你告诉系统你要运行什么程序以及如何运行它。
参数文件名是程序路径,argv是程序的参数列表,envp是环境变量。

操作失败并返回-1 有关错误信息,请参阅 errno。
例如,EACCES表示该文件不可执行; EPERM,可能是进程被跟踪,或者文件有特殊权限而你无权执行; E2 BIG,有很多参数; ENOEXEC,文件格式不正确,无法播放; EFAULT,文件路径有问题; ENAMETOOLONG,文件名太长; ENOENT,文件不存在; ENOMEM,内存不足; ENOTD IR,路径不是目录; EACCES,目录访问权限不足; ELOOP,符号链接过多; ETXTBUSY,文件被另一个进程写入; EIO,I/O错误; ENFILE,多个文件描述符; EMFILE,多进程文件描述符; EINVAL,参数错误; EISDIR,ELF翻译器是一个目录; Alibad,ELF 翻译器有问题。

亲自检查这些错误,看看哪一个可能是您的问题。
这是第一个。

Linux strace 使用入门

这在Linux中非常实用。
专门用于跟踪系统调用;即程序执行过程中调用了哪些系统函数。
简单来说,只要在命令前直接添加 strace 就可以看到这个命令做了什么。

1 .直接使用。
例如,如果您想查看 ls 命令调用了什么,只需查看 strace ls 即可。
例如,如果您在输出中看到 execve;这意味着 ls 进程已启动。
openat表示打开根目录; getdents6 4 ,这意味着读取目录内容。
write 表示将结果输出到终端。

2 如果要跟踪正在运行的进程(例如 PID 1 2 3 4 的进程),请使用 strace -p 1 2 3 4 按 Ctrl+C 停止。

3 有很多选择。
例如,如果要跟踪特定的系统调用,例如文件操作,请使用 -etrace=file。
使用 -etrace=network 进行网络通信。
如果您想计算调用次数并执行性能分析,请使用 -c。

4 真实事件,例如。
如果程序找不到文件,请使用 strace ./myprog。
如果遇到 ENOENT,openat 返回 -1 您将知道文件路径无效。
分析网络通信;使用strace -etrace=networkcurl https://...socket connect如果看到sendto和recvfrom就知道联网的过程了。
使用 strace ./myprog 解决权限问题。
如果 openat 返回 -1 EACCES。
你就会知道权限不够了。

5 综上所述,该路线具有显着的优势。
无需编码即可追踪;覆盖面广,能快速发现问题。
常见的组合有 strace -etrace=file; strace -etrace=网络; strace -c strace -p PID。
这四种组合基本上可以解决大部分问题。
使用起来方便吗?