Назад | Перейти на главную страницу

Сценарий Apache CGI не может перезаписать файл в каталоге, для которого он имеет полные разрешения

Возникла странная проблема с коробкой Solaris 10. У меня есть cgi-скрипт (Perl), который должен перезаписать файл. У нас нет suexec, запущенного на Apache, поэтому целевой каталог имеет полный (777) доступ, чтобы Apache мог писать в него.

Проблема в том, что сценарий CGI может записать новый файл в каталог, но не перезаписать существующий файл.

**Directory permissions for file destination:** 

drwxrwxrwx 146 myuser white      32768 Jun  2 20:46 dest-dir

**File Permissions of file that needs to be over written:** 

-rw-r--r--   1 myuser white      0 Jun  2 20:50 cgitestfile

Кто-нибудь знает простое решение для решения этой проблемы ??

Похоже, что apache может перезаписать файл, только если он ему принадлежит.

В Solaris 10 по умолчанию apache запускается как User nobody, Group nobody (чек /etc/apache/httpd.conf User и Group директивы). Учитывая ваш пример, apache не сможет писать в cgitestfile поскольку у него нет доступа на запись к нему.

Сменить владельца: группа dest-dir и файлы, в которые Apache должен перезаписать nobody

-rw-r - r-- 1 myuser white 0 2 июня 20:50 cgitestfile

У вас есть права на запись в файл только для владельца (myuser). Apache работает от имени пользователя myuser? или как apache или www.data или что-то в этом роде? Возможно, вам нужно добавить доступ на запись для других?

Я столкнулся с этим из-за конфигурации "SELinux". Если SELinux запущен, вам необходимо явно разрешить Apache возможность записи в файлы. Чтобы использовать это, вам также необходимо установить дополнительные разрешения для тех каталогов и файлов, для которых вы предоставляете доступ на запись.

Чтобы определить, включен ли SELinux, выполните:

sestatus

Чтобы включить логические значения SE, которые позволяют cgi записывать в файлы:

sudo setsebool -P allow_httpd_anon_write 1
sudo setsebool -P allow_httpd_sys_script_anon_write 1

Затем, наконец, чтобы установить файл / каталог «Тип контекста безопасности SELinux» в «системный» файл / каталог для чтения / записи (вы также можете сделать его «общедоступным» типом - Google «chcon» для информации), выполните следующее:

sudo chcon -R -t httpd_sys_rw_content_t /some/write/path

(Измените / some / write / путь к вашему пути.)