web-dev-qa-db-fra.com

Raison mal configurée avec MySQL: utilisation non sécurisée du chemin relatif

J'utilise Django et quand j'exécute python manage.py runserver je reçois le message d'erreur suivant: 

ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Library/Python/2.7/site-packages/_mysql.so
  Reason: unsafe use of relative rpath libmysqlclient.18.dylib in /Library/Python/2.7/site-packages/_mysql.so with restricted binary

Je ne sais pas trop comment résoudre ce problème. J'ai installé MySQL-python via pip. Et j'ai suivi ceci étape plus tôt. 

Je tiens également à préciser que c’est avec El Capitan Beta 3.

27
wkcamp

Dans OS X El Capitan (10.11), Apple a ajouté Protection de l'intégrité du système .

Cela empêche les programmes situés dans des emplacements protégés tels que /usr d'appeler une bibliothèque partagée utilisant une référence relative à une autre bibliothèque partagée. Dans le cas de _mysql.so, il contient une référence relative à la bibliothèque partagée libmysqlclient.18.dylib

À l'avenir, la bibliothèque partagée _mysql.so pourra être mise à jour. Jusque-là, vous pouvez le forcer à utiliser une référence absolue via l'utilitaire install_name_tool.

En supposant que libmysqlclient.18.dylib se trouve dans/usr/local/mysql/lib /, exécutez la commande suivante:

Sudo install_name_tool -change libmysqlclient.18.dylib \
  /usr/local/mysql/lib/libmysqlclient.18.dylib \
  /Library/Python/2.7/site-packages/_mysql.so
76
Greg Glockner

S'il y a beaucoup de chemins relatifs à corriger pour quelque chose (comme ce fut le cas avec la bibliothèque ouverte) Vous pouvez utiliser l'extrait suivant:

Modifiez les paramètres ABSPATH et LIBPATHS en conséquence. Il créera rPathChangeCmd.txt que vous pourrez coller dans le terminal. Il créera également rPathChangeErr.txt en cas d'erreur. Je suggère de vérifier le fichier d'erreur (si créé) avant de coller les commandes.

import glob
import subprocess
import os.path

ABSPATH = "/usr/local/lib/"  # absolute path to relative libraries
# libraries to correct
LIBPATHS = ['/usr/local/lib/python2.7/site-packages/cv2.so', '/usr/local/lib/libopencv*'] 

PREFIX = 'Sudo install_name_tool -change '

assert(ABSPATH.startswith('/') and ABSPATH.endswith('/'), 
    'please provide absolute library path ending with /')

libs = []
for path in LIBPATHS:
  libs += glob.glob(path)

cmd =  []
err = []
for lib in libs:
  if not os.path.isfile(lib):
    err.append(lib+" library not found") # glob should take care
  datastr = subprocess.check_output(['otool','-l','-v', lib])
  data = datastr.split('\n') 
  for line in data:
    ll = line.split()
    if not ll: continue
    if (ll[0] == 'name' and ll[1].endswith('.dylib') and not ll[1].startswith('/')):
      libname = ll[1].split('/')[-1]
      if os.path.isfile(ABSPATH+libname):  
        cmd.append(PREFIX+ll[1]+" "+ABSPATH+libname+' '+lib)
      else:
        err.append(ABSPATH+libname+" does not exist, hence can't correct: "+ll[1]+" in: "+lib)

ohandle = open("rpathChangeCmd.txt", 'w')
for lib in cmd:
  ohandle.write(lib+'\n')
ohandle.close()

if err:
  ehandle = open("rpathChangeErr.txt", 'w')
  for e in err:
    ehandle.write(e+'\n')
  ehandle.close()
0
Utkarsh Bhardwaj