web-dev-qa-db-de.com

MySQL nicht ordnungsgemäß konfigurierter Grund: unsichere Verwendung des relativen Pfads

Ich verwende Django und wenn ich python manage.py runserver starte, erhalte ich die folgende Fehlermeldung: 

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

Ich bin nicht ganz sicher, wie ich das beheben kann. Ich habe MySQL-Python über Pip installiert. Und ich folgte diesem Schritt früher. 

Ich möchte auch darauf hinweisen, dass dies bei El Capitan Beta 3 der Fall ist.

27
wkcamp

In OS X El Capitan (10.11) fügte Apple Systemintegritätsschutz hinzu.

Dies verhindert, dass Programme an geschützten Orten wie /usr eine gemeinsam genutzte Bibliothek aufrufen, die einen relativen Verweis auf eine andere gemeinsam genutzte Bibliothek verwendet. Im Fall von _mysql.so enthält es einen relativen Verweis auf die gemeinsam genutzte Bibliothek libmysqlclient.18.dylib

In Zukunft kann die gemeinsam genutzte Bibliothek _mysql.so aktualisiert werden. Bis dahin können Sie mit dem Dienstprogramm install_name_tool die Verwendung einer absoluten Referenz erzwingen.

Angenommen, libmysqlclient.18.dylib befindet sich in/usr/local/mysql/lib /, dann führen Sie den Befehl aus:

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

Wenn es viele relative Pfade gibt, die für etwas festgelegt werden müssen (wie bei mir für die opencv-Bibliothek geschehen) Sie können das folgende Snippet verwenden:

Ändern Sie ABSPATH und LIBPATHS entsprechend. Es wird rPathChangeCmd.txt erstellt, das Sie in das Terminal einfügen können. Im Fehlerfall wird auch rPathChangeErr.txt erstellt. Ich würde vor dem Einfügen der Befehle die Fehlerdatei überprüfen (falls erstellt).

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