Мой сервер Apache работает с учетной записью, отличной от учетной записи по умолчанию (не root). Когда он пытается запустить скрипт python, который, в свою очередь, выполняет команду проверки подрывной деятельности, svn checkout завершается с ошибкой со следующим сообщением об ошибке:
svn: Can't open file '/root/.subversion/servers': Permission denied
В то же время запуск этого скрипта python с командой проверки подрывной деятельности внутри из командной строки под той же учетной записью пользователя проходит отлично.
Сервер Apache 2.2.6 с mod_python 3.2.8 работает на машине Fedora Core 6.
Кто-нибудь может мне помочь? Большое спасибо.






Попробуйте предоставить пользователю Apache (пользователю, под которым работает служба apache) разрешения r + w для этого файла.
Похоже, среда, в которой работает процесс apache, немного необычна. По какой-то причине svn, похоже, думает, что файлы конфигурации пользователя, которые ему нужны, находятся в / root. Вы можете избежать использования svn корневых версий файлов, указав в командной строке, какой каталог конфигурации использовать, например:
svn --config-dir /home/myuser/.subversion checkout http://example.com/path
Не исправляя вашу среду, это, по крайней мере, позволит вам правильно запустить ваш скрипт ...
Вы можете указать конфигурацию для всего сайта, используя svn --config-dir /etc/subversion.
Разве журнал ошибок Apache не дает вам подсказки?
Может, дело в SELinux. Проверьте /var/log/audit/audit.log и соответствующим образом настройте конфигурацию SELinux, если файл audit.log указывает, что это SELinux, который запрещает доступ Apache.
Ошибка Permission Denied показывает, что сценарий выполняется с учетными данными root, поскольку он ищет файлы в домашнем каталоге root.
Я предлагаю вам изменить сценарий перехвата на что-нибудь, что делает:
id > /tmp/id
так что вы можете проверить результаты, чтобы убедиться, что это за uid / gid и euid / egid. Вы, вероятно, обнаружите, что на самом деле он не работает так, как вы думаете.
Мое первое предположение, как и Troels, также было SELinux, но это было бы только моим предположением, если вы абсолютно уверены, что скрипт через Apache работает с тем же пользователем / группой, что и ваш ручной тест.
Что ж, спасибо всем, кто ответил на вопрос. В любом случае, я думаю, что разгадал загадку.
SELinux полностью отключен на машине, поэтому проблема определенно заключается в том, что 'svn co' не может найти config_dir для учетной записи пользователя, под которой он работает.
Apache / mod_python не читает в среде оболочки учетной записи пользователя, на которой работает apache. Таким образом, например, mod_python не видит $ HOME, когда apache работает под каким-то реальным пользователем (а не под ником)
Теперь у svn co есть флаг --config-dir, который указывает на каталог конфигурации, из которого нужно читать параметры. По умолчанию это $ HOME / .subversion, т.е. соответствует домашнему каталогу учетной записи пользователя. Очевидно, когда $ HOME не существует, mod_python переходит в корневой домашний каталог (/ root) и пытается возиться с содержимым .subversion там - что, очевидно, с треском терпит неудачу.
положить
SetEnv HOME / home / qa
в /etc/httpd/conf/httpd.conf не решает проблему из-за того, что SetEnv не имеет ничего общего со средой оболочки - он устанавливает только среду, связанную с apache
Аналогично PythonOption - устанавливает только переменные, связанные с mod_python, которые после этого можно прочитать с помощью req.get_options ()
Запуск 'svn co --config-dir / home / ...' определенно дает обходной путь для запуска из mod_python, но мешает тем, кто попытается запустить скрипт из командной строки.
Итак, предлагаемое (и рабочее) решение - установить переменную среды HOME до запуска appache.
Например, в скрипте /etc/init.d/httpd
QAHOME=/home/qa
...
HOME=$QAHOME LANG=$HTTPD_LANG daemon $httpd $OPTIONS
Что происходит, так это то, что apache запускается с переменными среды root, поэтому он думает, что он должен найти свои файлы конфигурации в / root /. Это не тот случай. что происходит, если вы выполняете sudo apache2ctl start, он извлекает вашу переменную $ HOME из sudo $ HOME = / root /
Я только что сам нашел решение этой проблемы (правда, с помощью mod_perl, но то же самое)
запустите эту команду (если это apache 1, удалите 2):
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start
Когда /etc/init.d/apache2 запускает apache, он устанавливает все правильные переменные среды, под которыми должен работать apache.
Я очень признателен, Дуглас, это быстро решило ту же проблему, что и я.