3

標準ユーザーとして次の操作を実行するかなり複雑な C++ コードに取り組んでいます

fd = open("/dev/port",O_WRONLY);
...
lseek(fd, 0x2E,SEEK_SET);
...
write(fd,&buf,1);

ファイルを chmod したにもかかわらず、ファイルを開くときに「操作が許可されていません」というエラーが表示されます。

crwxrwxrwx 1 root kmem 1, 4 Sep 12 14:32 /dev/port

chmodding /dev/port のセキュリティ上の問題については知っていますが、私たちに関する限り、システムは閉じた LAN 上で実行されます。


簡単にするために、次のようにします。

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$ ./main 
/dev/port -1
/dev/port Operation not permitted
Open ok: /dev/tty0

これらの許可権を持つ

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
4

1 に答える 1

2

開くには、ファイルを開く権限に加えて/dev/port、機能が必要です。CAP_SYS_RAWIO

drivers/char/mem.c:730

static int open_port(struct inode * inode, struct file * filp)
{
    return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
}

これは、root になるか、setcap.

http://linux.die.net/man/8/setcap

于 2012-09-12T13:54:38.023 に答える