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

Есть ли способ обойти ошибку «Permission denied» из urllib2.urlopen?

Я запускаю код Python, который использует urllib2.urlopen который отлично работает при запуске от имени пользователя, root (Linux).

Однако он не работает при запуске от имени пользователя. apache (мы запускаем его через apache версии 1) - я получаю такую ​​ошибку:

Traceback (most recent call last):
  File "/srv/www/vm/custom/ipn.py", line 118, in ?
    a = confirm_paypal(f, f1)
  File "/srv/www/vm/custom/ipn.py", line 47, in confirm_paypal
    response = urllib2.urlopen(PP_URL, params)
  File "/usr/lib64/python2.4/urllib2.py", line 130, in urlopen
    return _opener.open(url, data)
  File "/usr/lib64/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/urllib2.py", line 1040, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib64/python2.4/urllib2.py", line 1006, in do_open
    raise URLError(err)
URLError: <urlopen error (13, 'Permission denied')>

Есть ли способ дать пользователю apache, доступ к этой функции?

Обновление 1

Запуск Python 2.4.3 и Apache 2.2.3

Оказывается, SELinux не позволял apache использовать порты; после выключения SELinux проблема исчезла.

Я не уверен, каков ответ, но я бы попытался снять это вот так.

Используйте su, чтобы перейти в контекст пользователей apache, а затем запустите скрипт python с помощью strace. Я бы предположил, что он пытается получить доступ к файлу или создать временный файл или что-то еще.

Если бы я сделал безумное предположение, я бы увидел, что похоже, что вы пытаетесь использовать https. Возможно, он пытается загрузить сертификаты CA и не имеет доступа?

Он не запускается от имени пользователя apache, будет ли ваш скрипт python запускаться от имени другого пользователя без полномочий root?