加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

当文件路径中有空格时,如何使用“system()”执行bash脚本?

发布时间:2020-12-15 21:35:40 所属栏目:安全 来源:网络整理
导读:我创建了一个名为“myscript.h”的简单bash脚本.我给它一个.h扩展名,原因我不会在这里透露.这个bash脚本位于“/ var / ftp / something with spaces”中. 从终端,我可以输入“/ var / ftp / something with space / myscript.h”,脚本运行完美. 但是,从我的C
我创建了一个名为“myscript.h”的简单bash脚本.我给它一个.h扩展名,原因我不会在这里透露.这个bash脚本位于“/ var / ftp / something with spaces”中.

从终端,我可以输入“/ var / ftp / something with space / myscript.h”,脚本运行完美.

但是,从我的C程序中,我输入

system("/var/ftp/something with spaces/myscript.h")

并且它抱怨找不到“/ var / ftp / something”.我已使用正斜杠将系统调用更改为以下内容:

system("/var/ftp/something with spaces/myscript.h")

但是,它仍然抱怨找不到“/ var / ftp / something”.假设我无法更改目录名称,我该如何解决这个问题呢?

谢谢!

解决方法

要运行单个脚本,您可以避免使用 system(3)库函数(并使用较低级别的系统调用,如 system(3),execve(2),waitpid(2) ……由 system(3)的实现使用),或者您可以在将脚本名称传递给 system(3).

有关详细信息,请参阅Advanced Linux Programming.

在Linux上,记录了system(3)来分叉a / bin / sh -c进程.请参阅sh(1p).并且POSIX shell有一些quoting rules.您可以适当地使用双引号和反斜杠.因此,您将构建(并且可能检查)传递给system(3)的字符串(可能需要谨慎使用asprintf(3)或snprintf(3)).请注意,C编译器还具有(不同的)string literals的引用约定.

一般来说,你应该避免使用code injection(想象一个顽皮的用户给出一些; rm -rf $HOME&amp ;;输入作为“目录”名称;你不想在奇怪的“/ var / ftp / a上运行system(3) ; rm -rf $HOME&amp ;; / myscript.h“string”

在您的特定情况下,我建议使用fork(2),execve(2)(可能通过一些仔细选择exec(3)功能),waitpid(2) …适当.这有一点点优点,可以避免依赖和运行/ bin / sh,因此可能稍微快一点(毫秒).

更多地了解Unix shell的作用;例如,阅读bash中的各种shell expansions(它们类似于POSIX sh规定的那些)并注意globbing.参见glob(7)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读