如何在不以root身份运行的程序中以root身份编写文件?

时间:2017-09-14 11:46:01

标签: file io racket root sudo

我有一个不应该以root身份运行的程序,因为它根据用户的名称和其他内容执行操作。但是,我可能需要编写一个(并且应该)只能以root身份写入的文件。

我能做什么,但不愿意,是将文件写入某个临时文件,然后(system "sudo mv /tmp/myfile /destination/myfile")。这将有sudo要求密码,以root身份移动文件,然后程序将继续作为普通用户运行。如果用户不能sudo他不应该使用该程序,那么这并不重要。

我希望能够在没有临时文件的情况下从程序中编写文件,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

仔细阅读setuid可执行文件(这是public interface CommunicatorProxy : ICommunicator { private readonly Func<ICommunicator> factory; public CommunicatorProxy(Func<ICommunicator> factory) { this.factory = factory; } public Task<int> SendAsync(int c, object d) => factory().SendAsync(c, d); public Task<int> SendAsync(int c, IEnumerable<byte> d) => factory().SendAsync(c, d); public Task<T> ReceiveAsync<T>() => factory().ReceiveAsync<T>(); } sudosu的工作原理)。阅读credentials(7)capabilities(7)execve(2)setreuid(2)。另请阅读Advanced Linux Programming

但要小心。您可以引入安全漏洞或vulnerabilities

BTW,login(或sudo)可以配置为避免询问任何密码(但这可能是不明智的。)