写入文件而不进行重定向?


12

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

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

touch因为我需要将cookie写入文件,所以Simple 不能将其剪切,echo没有shell包装器的Simple 不能正常工作,因为它需要重定向才能写入文件。我不愿意以root权限调用shell来完成这样的琐碎任务。我可以调用一些真正简单,受约束的系统命令来为我编写文件吗?


有什么原因/bin/sh -c 'echo magic > /path/to/magic/file'不起作用吗?那将是一个可执行文件和两个参数。您将需要将最后一个参数构建为字符串(使用sprintf或等效参数)。是否有理由对您不起作用?从您的问题听起来,doCommandAsRoot()不会接受输入以流式传输到命令,对吗?否则,您可以将最后一个参数替换为'cat > /path/to/magic/file'并传递数据,而不是构造一个字符串。
弓箭2011年

该shell示例可以工作,但是我不想以root特权调用该shell,只是为了创建一个简单的文件。该库确实接受了一个通信管道参数(它是AuthorizationExecuteWithPrivileges),该参数可用于使用编写Cookie tee。谢谢!
zoul 2011年

Answers:


11

这个怎么样:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

当然,这里有重定向,但只有tee作为root运行而不是shell。工程与dd of=...太。


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

@zoul:我以为您正在编写Shell脚本。是否可以将魔术cookie写入非特权进程可访问的文件?如果是,则将其写入该文件并调用doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
2011年

不,这是一个常规的已编译应用程序(问题已更新)。我只是在寻找“ shell”命令作为帮助程序,因此我不必自己编写它。是的,cookie并不敏感。这个dd例子非常接近我想要的,谢谢。您能想到更简单的方法吗?
zoul 2011年

当然-您可以使用cpmv代替dd
mattdm 2011年

我的意思是更简单,无需复制 :)
zoul 2011年

9

没有输出重定向,没有管道,但是带有“ here string”:

dd of=/some/where/file <<<'magic'

这种方法的一个缺点是dd将一些统计信息写入stdout。您可以使用> / dev / null来隐藏它们,但此时最好也使用tee。
studgeek '18

1
在无法使用输出重定向或管道的异常情况下,这对我有用。status=none将取消GNU coreutils的现代版本的所有其他输出dd
迈克尔·汉普顿

5

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

writestringtofile 'magic' /some/where/file

是一种危险的方法。因此,我赞同@stribika的建议:将值写入临时文件并将其复制到位。确保使用安全功能创建临时文件(mkstemp()),以便那里也没有争用条件。


谢谢,这是一个有用的讨论。幸运的是,“魔术曲奇”不是安全设备,任何人都可以清楚地看到它。
zoul 2011年

0

来自moreutils的海绵 -吸收标准输入并写入文件:

echo -n 'magic' | sponge /some/where/file

与Shell重定向不同,海绵在写入输出文件之前先吸收所有输入。如果可能,海绵通过将临时文件重命名到原位来自动创建或更新输出文件。

查看更多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.