c - execlp 命令中的“/bin/sh”代表什么?
问题描述
我想用 execlp 执行一个 shell 命令,我尝试了以下指令:
execlp("sh", "sh", "-c", p_command, (char*)NULL);
p_command 是指向 a 的指针,const char
表示 shell 命令行。
我的最小测试告诉我程序按预期成功。我首先选择使用"/bin/sh"
而不是,"sh"
但我了解到p ( ath ) inexeclp
允许我们避免编写完整路径,就好像 exec 会为我们完成路径一样;所以我删除了“/bin/”。我担心的是,我从来没有见过只使用“sh”的 execlp 的代码,因为它有效地用于 ls 示例,我们可以直接使用"ls"
而不是"/bin/ls"
.
作为一个初学者,我想知道什么代表什么,在这种情况下和"/bin/sh"
之间有什么区别,为什么我们必须编写完整的路径来执行 shell?"sh"
"/bin/sh"
execlp
解决方案
当传递给的路径execlp
是sh
时,在环境变量execlp
中列出的目录中搜索它。PATH
如果攻击者能够PATH
在运行您的程序的环境中修改变量,他们可以将其设置为列出他们选择的目录,并且他们可以将自己的程序命名sh
在该目录中。然后你的程序将执行他们的程序而不是执行系统sh
程序。在某些情况下(取决于文件模式位中的某个位),程序是以其所有者的权限而不是执行程序的用户的权限来执行的。必须仔细编写此类程序,以避免出现这样的情况,即攻击者可以利用该程序。
当传递给的路径execlp
是时/bin/sh
,在从文件系统的根开始execlp
的路径中查找它,称为. 这将始终使用系统管理员放在目录中的程序(通常作为系统安装的一部分完成)。/bin/sh
/
sh
/bin
推荐阅读
- identityserver4 - 如何在 webapi 中验证 Identityserver4 令牌验证?
- c# - 覆盖单元测试的类依赖项的最佳方法?
- clojure - 在 repl 中识别依赖项和函数的问题
- reactjs - 清单:行:1,列:1,语法错误。即使在删除 index.html 中清单的链接之后
- python - 此正则表达式的对抗性输入
- ubuntu - 下载基因组文件,但 Ubuntu 说文件不存在
- java - 基于行的文件处理和扫描方法
- jquery - 单击href链接(wordpress)时如何在灯箱中加载php文件而不是window.open?
- sql - 循环选择和更新 PostgreSQL
- reactjs - 如何在 framer-motion 可扩展卡片示例中添加滚动?