system(“ / path / to / bash.sh”)返回file.txt:仅当c ++程序作为root运行时,权限被拒绝

时间:2019-09-06 12:46:33

标签: c++ linux raspberry-pi

该项目位于运行Linux raspberrypi 4.19.58-v7l +的Raspberry Pi 4上。

我有以下get_page.sh脚本:

#!/bin/bash

line=$(head -n 1 ../configuration.txt)
wget -q -i $line -O url_response.txt

我有一个名为Big_ppd_display_try1的c ++程序,它会调用上述脚本:

int readConfig(std::ifstream& configFile, std::string (&string)[10]) {
  std::cout<<"Inside int readConfig\n";
  int counter=0;
  if(!configFile) {
    std::cout<<"configuration.txt couldn't be opened\n";
  } else {
      // Get content line by line of txt file
      int i = 0;
      while(getline(configFile, string[i++]));
      //for debug only      
      for(int k = 0; k<i; k++) std::cout<<"string["<<k<<"]= "<<string[k]<<"\n";
      counter = i-1;
    }
    return counter;
}

int main() {
  while(true) {
    std::cout<<"-------------------------------------------"<<std::endl;
    system("/var/www/html/4panel/get_page.sh");

    char urlResponsePath[]="url_response.txt";
    std::ifstream urlResponseFile;
    urlResponseFile.open(urlResponsePath, std::ifstream::in);
    if(urlResponseFile.is_open()) {
      std::cout<<"Successfully opened file: "<<urlResponsePath<<std::endl;
      std::string inputs[10];
      int lines;
      lines = readConfig(urlResponseFile, inputs);
      std::cout<<"# of lines: "<<lines<<std::endl;
    } else {
      std::cout<<"Error, Could not open file: "<<urlResponsePath<<std::endl;
    }
    usleep(2000*1050);
  }

 return 0;
}

此c ++程序的执行方式如下:sudo ./Big_ppd_display_try1

上面编写的代码应:

  • 调用脚本;
  • 脚本应使用url_response.txt中的URL正文重写configuration.txtline=$(head -n 1 ../configuration.txt);
  • 打开url_response.txt
  • url_response.txt中逐行复制std::string inputs[10];的内容

问题是出现以下错误:

url_response.txt: Permission denied

所有文件都位于/var/www/html/4panel中 这些是权限:

drwxr-xr-x 3 www-data pi  4096 Aug 24 01:57 4panel

-rwxrwxrwx  1 pi pi 1080684 Aug 24 01:57 Big_ppd_display_try1
-rw-rw-r--  1 pi pi    5739 Aug 24 01:57 Big_ppd_display_try1.cc
-rw-r--r--  1 pi pi  255660 Aug 24 01:57 Big_ppd_display_try1.o
-rw-r--r--  1 pi pi    1082 Aug 23 21:33 Makefile
-rwxrwxrwx  1 pi pi      90 Aug 24 01:46 get_page.sh
-rw-rw-rw-  1 pi pi      56 Aug 23 20:26 url.txt
-rw-r--r--  1 pi pi       0 Aug 24 01:52 url_response.txt

我不是Linux多产用户,因此我对文件权限,命令以及-n -i -l -a等之类的知识知之甚少。

编辑:

在不使用sudo的情况下执行c ++程序:./Big_ppd_display_try1不会返回url_response.txt: Permission denied错误。 但是我需要使用sudo运行该程序,因为其余的代码包含使用hzeller's rgb led matrix library,并且要求该程序以root身份运行:“不是以root身份运行,这意味着我们可以除非是实时内核,否则不能正确控制时序。这将严重破坏颜色稳定性和矩阵闪烁。”

EDIT2:

在初始化硬件以最小化安全问题之后,程序将特权从root降到daemon。但是当被迫继续以root的身份运行时,不会显示Permission denied错误,有效地解决了我的问题。

0 个答案:

没有答案