MySQL 配置不当原因:不安全使用相对路径
Posted
技术标签:
【中文标题】MySQL 配置不当原因:不安全使用相对路径【英文标题】:MySQL Improperly Configured Reason: unsafe use of relative path 【发布时间】:2015-09-29 08:27:13 【问题描述】:我正在使用 Django,当我运行 python manage.py runserver
时收到以下错误:
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
我不完全确定如何解决这个问题。我已经通过 pip 安装了 MySQL-python。我更早地关注了this。
我还想指出这是 El Capitan Beta 3。
【问题讨论】:
你有没有解决这个问题?我也有同样的问题 我目前正在使用 Beta 2。昨天升级了,但这仍然是一个问题。 【参考方案1】:在 OS X El Capitan (10.11) 中,Apple 添加了System Integrity Protection。
这可以防止受保护位置(如 /usr
)中的程序调用使用对另一个共享库的相对引用的共享库。对于_mysql.so
,它包含对共享库libmysqlclient.18.dylib
的相对引用。
未来可能会更新共享库_mysql.so
。在此之前,您可以通过 install_name_tool
实用程序强制它使用绝对引用。
假设libmysqlclient.18.dylib
在/usr/local/mysql/lib/,那么运行命令:
sudo install_name_tool -change libmysqlclient.18.dylib \
/usr/local/mysql/lib/libmysqlclient.18.dylib \
/Library/Python/2.7/site-packages/_mysql.so
【讨论】:
这也让我解决了 ruby 中 mysql2 gem 的问题。只需要使用我的模块而不是_mysql.so。谢谢。 原发帖人能否将这个答案选为正确答案? 仅供参考,如果您使用 virtualenv,则站点包路径位于 virtualenv 文件夹内。 在压力很大的 4 天后,这救了我的培根。困扰我的是我不知道如何找出我不知道的东西——有人能建议将来如何为这种事情做准备吗?我从未听说过 install_name_tool 或系统完整性保护。我应该浏览网络的哪些角落才能为此类事情做好准备? @tomcam 你不可能知道一切 :) j/k 我觉得你在这个。就我而言,我只知道谷歌搜索“不安全地使用相对 rpath libmysqlclient.18.dylib”会给我答案。您只需要在整个错误跟踪中寻找确切的问题。【参考方案2】:如果有很多相对路径需要修复(就像我在 opencv 库中发生的那样)。可以使用下面的sn-p:
相应地更改 ABSPATH 和 LIBPATHS。它将创建 rPathChangeCmd.txt,您可以将其粘贴到终端中。如果出现任何错误,它还将创建 rPathChangeErr.txt。我建议在粘贴命令之前检查错误文件(如果已创建)。
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()
【讨论】:
以上是关于MySQL 配置不当原因:不安全使用相对路径的主要内容,如果未能解决你的问题,请参考以下文章