Как создать внешнюю, файловую систему, entrypoint только для чтения для внутренней памяти процесса?

Возможно, что сервер настраивается для использования списков управления доступом, который является расширением нормальных полномочий файла Unix, или SELinux основывал роли.

Можно проверить ACL на каталоге как это...

> getfacl /path/to/your/tmp

Необходимо получить что-то вроде этого, если все нормально...

# file: tmp
# owner: apache
# group: apache
user::rw-
group::r--
other::r--

Если Вы видите строки как следующее...

user:someotheruser:---
group:someothergroup:---

... Вы имеете дело с файлом/dir ACL'd. Как можно, вероятно, предположить, это позволяет Вам установить права для определенных пользователей и групп. Можно изменить их (разрешение полномочий) с командой setfacl. Существует также множество значений по умолчанию, возможных в ACL на каталоге, который заставил бы новые файлы быть созданными с неожиданными полномочиями.


Если это не делает этого для Вас, Вы могли бы иметь дело с безопасностью на уровне ролей в SELinux. Выполните команду getenforce. Если это будет установлено на осуществление Apache, то только сможет считать файлы в контексте HTTP.

> /usr/sbin/getenforce
Enforcing

Вы должны были бы chcon (измените контекст), Ваш tmp каталог...

> chcon -R -t httpd_sys_content_t /path/to/your/tmp

Вот хороший FAQ SELinux

Надежда, которая помогает!

5
24.08.2012, 13:59
1 ответ

Это на самом деле кажется на описание общей памяти POSIX.

Вот быстрая пара примеров программы, чтобы показать, как она работает. В моей системе файлы создаются в/run/shm (который является tmpfs). Другие системы используют/dev/shm. Ваша программа не должна заботиться, shm_open заботится об этом.

server.c:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    int fd;
    long pagesize;
    char *region;

    if (-1 == (pagesize = sysconf(_SC_PAGE_SIZE))) {
        perror("sysconf _SC_PAGE_SIZE");
        exit(1);
    }

    if (-1 == (fd = shm_open("/some-name", O_CREAT|O_RDWR|O_EXCL, 0640))) {
        perror("shm_open");
        exit(1);
    }

    if (-1 == ftruncate(fd, pagesize)) {
        perror("ftruncate");
        shm_unlink("/some-name");
        exit(1);
    }

    region = mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (!region) {
        perror("mmap");
        shm_unlink("/some-name");
        exit(1);
    }

    // PAGESIZE is guaranteed to be at least 1, so this is safe.
    region[0] = 'a';

    sleep(60);

    shm_unlink("/some-name");
}

client.c

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    int fd;
    long pagesize;
    char *region;

    if (-1 == (pagesize = sysconf(_SC_PAGE_SIZE))) {
        perror("sysconf _SC_PAGE_SIZE");
        exit(1);
    }

    if (-1 == (fd = shm_open("/some-name", O_RDONLY, 0640))) {
        perror("shm_open");
        exit(1);
    }

    region = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, 0);
    if (!region) {
        perror("mmap");
        shm_unlink("/some-name");
        exit(1);
    }

    // PAGESIZE is guaranteed to be at least 1, so this is safe.
    printf("The character is '%c'\n", region[0]);
}

Make-файл

LDFLAGS += -lrt

all: server client
6
27.01.2020, 20:39
  • 1
    POSIX может иметь эффект, который хочет корреспондент, но он попросил полученный объект появляться в файловой системе. name параметр для shm_open(2) не соответствует никакой записи файловой системы. Действительно, на Linux, это не могло встроить наклонные черты, таким образом, это нельзя назвать /tmp/my_entry_point, поскольку корреспондент указан. Снова, это может быть вопрос сверхспецификации в вопросе, но вопрос должен быть поднят. –  Warren Young 24.08.2012, 21:40
  • 2
    @WarrenYoung, который определенно верен, это - просто маркер, который может быть передан другому вызову к shm_open. Конечно, на Linux, это - файл (как я упомянул), но обычно не находится в/tmp. Но да, я предположил, что вопрос немного чрезмерно определен. –  derobert 24.08.2012, 21:44

Теги

Похожие вопросы