1

我尝试安装“mysqludf_sys”。但我得到了这个错误:

ERROR 1126 (HY000) at line 29: Can't open shared library 'lib_mysqludf_sys.so' (errno: 0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so: cannot open shared object file: No such file or directory)
ERROR: unable to install the UDF

因此,我尝试在 Makefile 中使用以下修改来解决它:

LIBDIR=/usr/lib to LIBDIR=/usr/lib/mysql/plugin

还要确保 gcc 具有 -fPIC 选项,即:

gcc -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

但是当我测试 sys_eval 时,我得到:

mysql> SELECT sys_eval('id');
+----------------+
| sys_eval('id') |
+----------------+
|                |
+----------------+
1 row in set (0.02 sec)

我应该得到:

mysql> SELECT sys_eval('id');
+-------------------------------------------------+
| sys_eval('id')                                  |
+-------------------------------------------------+
| uid=105(mysql) gid=108(mysql) groups=108(mysql) |
+-------------------------------------------------+
1 row in set (0.01 sec)

我也测试了“sys_exec”来创建一个文件,但没有结果

那么,我应该怎么做才能正确运行这些功能?问候

4

2 回答 2

3

谢谢罗兰。

所以,我的问题的答案是“AppArmor”。

来自维基百科:

AppArmor 允许系统管理员为每个程序关联一个限制该程序功能的安全配置文件。它通过提供强制访问控制 (MAC) 来补充传统的 Unix 自主访问控制 (DAC) 模型。

由于 Ubuntu Hardy,MySQL 5.0 服务器包还包含一个 AppArmor 配置文件 (/etc/apparmor.d/usr.sbin.mysqld),它限制了 MySQL 服务器功能,例如调用 UDF 来执行命令。

所以,为了让 MySQL 运行 Linux 命令,我应该在 AppArmor 中更改 MySql 的安全级别。

[root@xxx ~]# aa-complain /usr/sbin/mysqld 

查看 AppArmor 的状态:

 [root@xxx ~]# aa-status 

通过这种配置,我可以执行 sys_eval 和 sys_exec。但这仍然仅限于 mysql 目录。所以我不能从任何目录创建文件或运行脚本。

所以解决办法就是给apparmor添加权限,让mysql可以访问新的数据目录。

sudo vi /etc/apparmor.d/usr.sbin.mysqld

添加:

/newdir/ r,
/newdir/** rwk,

重启服务器:

sudo /etc/init.d/apparmor restart
sudo /etc/init.d/mysql restart

如果这仍然不起作用,请检查 nix 权限以确保 mysql 是递归新目录的所有者和组。

chown -R mysql:mysql “new datadir path”

我希望这对某人有所帮助。

投标

于 2013-08-16T07:30:52.083 回答
1

id你调用的应该是一个可执行文件。脚本本身通常不是可执行的,您可能应该修改要读取的行bash path/to/script.sh,使其成为有效的可执行命令行。

此外,有很多关于 sys_exec 和朋友由于应用程序装甲设置而无法工作的报告。检查是否启用了应用程序装甲,如果已启用,请修改其配置以允许 udfs 运行。

HTH。

于 2013-08-15T08:36:22.577 回答