我正在尝试为网络和其他一些在linux上运行的嵌入式设备的东西配备一个几乎无懈可击的配置器。应用程序在root运行时保存到/ etc / network / interfaces而没有问题,但返回"分段错误"由标准用户运行时。 strace回来了:
打开(" / etc / network / interfaces",O_WRONLY | O_CREAT | O_TRUNC,0666)= -1 EACCES(权限被拒绝) --- SIGSEGV {si_signo = SIGSEGV,si_code = SEGV_MAPERR,si_addr = 0} ---
如何允许任何人启动它并写入/ etc / network / interfaces?
保存到文件的代码:
FILE *saveFile;
saveFile = fopen("/etc/network/interfaces","w");
// loopback
fprintf(saveFile, "auto lo \niface lo inet loopback\n\n");
// eth0
fprintf(saveFile, "auto eth0\niface eth0 inet static\n\taddress %s\n\tnetmask %s\n\tgateway %s\n",
address,netmask,gateway);
fclose(saveFile);
答案 0 :(得分:1)
如何允许任何人启动它并写入/ etc / network / interfaces?
嗯...通过给/ etc / network / interfaces上的任何人提供写权限?
答案 1 :(得分:1)
在您发表评论之后,您的要求是允许非root用户执行需要root权限的特定管理任务。传统的方法是使程序由root和setuid拥有。现在这已经过时了,因为应该针对任何潜在的安全问题彻底审查setuid程序(su或sudo):缓冲区溢出或其他允许以root身份执行任意代码 。 / p>
对于您的示例,如果它是一个简单的程序,它可能有意义,但至少应该测试每个操作(此处fopen
和fwrite
)的返回值!
现在推荐的方法是使用sudo
并在/etc/sudoers
文件中设置特定条目,以允许任何用户(或特定的组和/或用户列表)执行该特定条目以root身份命令。实现几乎与setuid命令相同但提示用户输入他/她的密码以注意他/她的管理任务:
ALL local_host_name = (root) /full/path/to/command
但是sudoers语法允许更精细的授权。
(注意:你仍需要两次控制你的代码)
答案 2 :(得分:0)
这样,当人们尝试执行除程序之外的任何命令时,它将被拒绝。
现在,您的程序将以sudo rigth运行,因此请确保您的程序不能被其他程序(如chmod 700和chown root)修改或替换,并确保您的程序不会弄乱/ etc / network / interface < / p>