在没有重定向的情况下写入文件?

zou*_*oul 15 shell security root sudo io-redirection

我正在编写一个常规编译的应用程序,它需要创建一个特殊的文件并向其中写入一个魔法 cookie。我无法直接从应用程序写入文件,系统安全模型要求我启动一个具有提升权限的帮助工具来完成此操作。我可以为辅助工具提供任意数量的参数。现在我想选择一些非常简单的系统命令作为辅助工具并为我创建文件。像这样的东西:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Simpletouch不会削减它,因为我需要将 cookie 写入文件,echo没有 shell 包装器的 simple不起作用,因为它需要重定向来写入文件。我不喜欢用 root 权限调用 shell 来完成这样一个微不足道的任务。是否有一些非常简单的、受约束的系统命令可以调用来为我编写文件?

str*_*ika 11

这个怎么样:

echo -n 'magic' | sudo tee /some/where/file > /dev/null
Run Code Online (Sandbox Code Playgroud)

当然有重定向,但只有 tee 以 root 身份运行,而不是 shell。工程与dd of=...太。

  • 抱歉,我最近显然很难解释自己。问题是,当我想以提升的权限运行某些东西时,我必须通过一个特殊的库调用(类似于`doCommandAsRoot`)。而且这个函数只接受命令及其参数的路径,所以我无法立即使用输出重定向。我可以通过 shell(如问题所示),但我不喜欢这种安全性。 (2认同)

小智 11

没有输出重定向,没有管道,但有“这里的字符串”:

dd of=/some/where/file <<<'magic'
Run Code Online (Sandbox Code Playgroud)

  • 这在我无法使用输出重定向或管道的异常情况下对我有用。`status=none` 将抑制现代版本的 GNU coreutils `dd` 的所有其他输出。 (3认同)

mat*_*tdm 6

还有另一个考虑,即您不想将魔法 cookie 的值放在命令行上,因为其他用户可以观察到。即使程序是短暂的(包括如果程序将命令行字符串清零),也有被攻击的机会。所以,一个理论:

writestringtofile 'magic' /some/where/file
Run Code Online (Sandbox Code Playgroud)

是一种危险的做法。因此,我赞同@stribika 的建议:将值写入临时文件并将其复制到位。确保使用安全函数来创建临时文件 ( mkstemp()),这样那里也不会出现竞争条件。