Linux kernel 以非root用户身份写入/dev/port 我正在研究一个相当复杂的C++代码,它执行标准用户的以下操作 fd = open("/dev/port",O_WRONLY); ... lseek(fd, 0x2E,SEEK_SET); ... write(fd,&buf,1);

Linux kernel 以非root用户身份写入/dev/port 我正在研究一个相当复杂的C++代码,它执行标准用户的以下操作 fd = open("/dev/port",O_WRONLY); ... lseek(fd, 0x2E,SEEK_SET); ... write(fd,&buf,1);,linux-kernel,parallel-port,Linux Kernel,Parallel Port,我在打开文件时遇到“不允许操作”错误,尽管已对文件进行了chmoded crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port drivers/char/mem.c:730 static int open_port(struct inode * inode, struct file * filp) { return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; } 我知道chmodding/dev/port存

我在打开文件时遇到“不允许操作”错误,尽管已对文件进行了chmoded

crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port
drivers/char/mem.c:730

static int open_port(struct inode * inode, struct file * filp)
{
    return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
}
我知道chmodding/dev/port存在安全问题,但就我们而言,该系统将在封闭的局域网上运行


为简化此过程,请执行以下操作:

using namespace std;
int main(int argc, char *argv[])
{
  int fd=-1;

  //  fd1=open("/dev/port",O_RDWR|O_NDELAY);
  vector<string> fnames;
  fnames.push_back("/dev/port");
  fnames.push_back("/dev/tty0");

  string fname;


  for(int i=0;i<fnames.size();i++)
    {
      fname = fnames[i];
      fd=open(fname.c_str(),O_RDWR | O_NDELAY);
      if(fd<0)
    {
      cout << fname << " "  << fd << endl;
      cout << fname << " "  << strerror(errno) << endl;
    }
      else
    {
      cout << "Open ok: " << fname << endl;
    }
    }


  return 0;
}
拥有这些许可权

me@myPC:~/test$ ll /dev/tty /dev/port 
crw-rw-rw- 1 root kmem 1, 4 Sep 12 14:32 /dev/port
crw-rw-rw- 1 root tty  5, 0 Sep 12 15:51 /dev/tty

要打开
/dev/port
,除了打开文件的权限外,您还需要具备
CAP_SYS_RAWIO
功能

crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port
drivers/char/mem.c:730

static int open_port(struct inode * inode, struct file * filp)
{
    return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
}
您可以通过成为root用户或使用
setcap
为单个可执行文件(类似于set-uid)设置它来获得此权限


您有问题吗?您是否尝试以root用户身份运行程序?问题在标题中:如何以简单用户身份执行代码?我可以以root用户身份执行代码,没有任何问题,但代码的其余部分必须以非root用户身份运行(文件读/写)。好的,我应该写“以root用户身份运行时它是否工作”,然后将其设置为suid或使用sudo。@malber:请不要。标题是总结页面,但是一旦有人打开了问题,他们就不需要努力去发现你在问什么。改为写一个独立的主体。它起作用了。通过执行sudo setcap cap\u sys\u rawio=ep EXECUTABLE\u NAME我能够访问/dev/port。有没有可能将这种权限扩展到用户而不是单个可执行文件?您可以通过使用pam_cap.so(一个pam模块)为单个用户授予功能来实现这一点。查看我编辑的答案中的最后一个链接。我正在检查你是否可以不使用setcap就完成这项工作。据我所知,rawIO上的用户特定功能目前还没有简单的解决方案。看起来是这样的。看起来你可以做的另一件事是set=ei,然后使用pam_cap.so,但是如果你这样做的话,你最好还是设置=ep。再次感谢你的回复,最后我修复了
sudo setcap
和init.d脚本中的一些其他调用。Stackoverflow策略阻止我向上投票(我的声望不足15)。一旦我不再是一个傻瓜,我会尽快解决的:)