linux下udf光盘权限问题,linux - 关于mysql udf权限的问题?

该篇博客讨论了在Linux服务器上遇到的MySQL UDF(用户定义函数)sys_exec和sys_eval权限问题,重点在于如何为UDF函数赋予执行系统命令的权限,包括sys_get、sys_set和sys_exec等函数的初始化与使用方法,以及如何正确处理权限设置以确保安全和功能性。
摘要由CSDN通过智能技术生成

linux - 关于mysql udf权限的问题?

6484d079e493d97f03487117e31efefd.png

ringa_lee2017-04-17 15:05:25 0 0 171

昨天在服务器上执行mysql udf函数sys_exec和sys_eval都很成功,今天重启了一下服务器 打开mysql 用exec执行任意命令都是返回32512 对应linux的127 也就是无权限或者路径错误..

想问一下怎么解决,怎么给udf函数赋予权限啊?我用的是 lib_mysqludf_sys version 0.0.3

/*

lib_mysqludf_sys - a library with miscellaneous (operating) system level functions

Copyright (C) 2007 Roland Bouman

Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G.

web: http://www.mysqludf.org/

email: mysqludfs@gmail.com, bernardo.damele@gmail.com

This library is free software; you can redistribute it and/or

modify it under the terms of the GNU Lesser General Public

License as published by the Free Software Foundation; either

version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public

License along with this library; if not, write to the Free Software

Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

*/

#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)

#define DLLEXP __declspec(dllexport)

#else

#define DLLEXP

#endif

#ifdef STANDARD

#include

#include

#include

#ifdef __WIN__

typedef unsigned __int64 ulonglong;

typedef __int64 longlong;

#else

typedef unsigned long long ulonglong;

typedef long long longlong;

#endif /*__WIN__*/

#else

#include

#include

#endif

#include

#include

#include

#include

#include

#ifdef HAVE_DLOPEN

#ifdef __cplusplus

extern "C" {

#endif

#define LIBVERSION "lib_mysqludf_sys version 0.0.3"

#ifdef __WIN__

#define SETENV(name,value) SetEnvironmentVariable(name,value);

#else

#define SETENV(name,value) setenv(name,value,1);

#endif

DLLEXP

my_bool lib_mysqludf_sys_info_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

);

DLLEXP

void lib_mysqludf_sys_info_deinit(

UDF_INIT *initid

);

DLLEXP

char* lib_mysqludf_sys_info(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

);

/**

* sys_get

*

* Gets the value of the specified environment variable.

*/

DLLEXP

my_bool sys_get_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

);

DLLEXP

void sys_get_deinit(

UDF_INIT *initid

);

DLLEXP

char* sys_get(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

);

/**

* sys_set

*

* Sets the value of the environment variables.

* This function accepts a set of name/value pairs

* which are then set as environment variables.

* Use sys_get to retrieve the value of such a variable

*/

DLLEXP

my_bool sys_set_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

);

DLLEXP

void sys_set_deinit(

UDF_INIT *initid

);

DLLEXP

long long sys_set(

UDF_INIT *initid

, UDF_ARGS *args

, char *is_null

, char *error

);

/**

* sys_exec

*

* executes the argument commandstring and returns its exit status.

* Beware that this can be a security hazard.

*/

DLLEXP

my_bool sys_exec_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

);

DLLEXP

void sys_exec_deinit(

UDF_INIT *initid

);

DLLEXP

my_ulonglong sys_exec(

UDF_INIT *initid

, UDF_ARGS *args

, char *is_null

, char *error

);

/**

* sys_eval

*

* executes the argument commandstring and returns its standard output.

* Beware that this can be a security hazard.

*/

DLLEXP

my_bool sys_eval_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

);

DLLEXP

void sys_eval_deinit(

UDF_INIT *initid

);

DLLEXP

char* sys_eval(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

);

#ifdef __cplusplus

}

#endif

/**

* lib_mysqludf_sys_info

*/

my_bool lib_mysqludf_sys_info_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

){

my_bool status;

if(args->arg_count!=0){

strcpy(

message

, "No arguments allowed (udf: lib_mysqludf_sys_info)"

);

status = 1;

} else {

status = 0;

}

return status;

}

void lib_mysqludf_sys_info_deinit(

UDF_INIT *initid

){

}

char* lib_mysqludf_sys_info(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

){

strcpy(result,LIBVERSION);

*length = strlen(LIBVERSION);

return result;

}

my_bool sys_get_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

){

if(args->arg_count==1

&& args->arg_type[0]==STRING_RESULT){

initid->maybe_null = 1;

return 0;

} else {

strcpy(

message

, "Expected exactly one string type parameter"

);

return 1;

}

}

void sys_get_deinit(

UDF_INIT *initid

){

}

char* sys_get(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

){

char* value = getenv(args->args[0]);

if(value == NULL){

*is_null = 1;

} else {

*length = strlen(value);

}

return value;

}

my_bool sys_set_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

){

if(args->arg_count!=2){

strcpy(

message

, "Expected exactly two arguments"

);

return 1;

}

if(args->arg_type[0]!=STRING_RESULT){

strcpy(

message

, "Expected string type for name parameter"

);

return 1;

}

args->arg_type[1]=STRING_RESULT;

if((initid->ptr=malloc(

args->lengths[0]

+ 1

+ args->lengths[1]

+ 1

))==NULL){

strcpy(

message

, "Could not allocate memory"

);

return 1;

}

return 0;

}

void sys_set_deinit(

UDF_INIT *initid

){

if (initid->ptr!=NULL){

free(initid->ptr);

}

}

long long sys_set(

UDF_INIT *initid

, UDF_ARGS *args

, char *is_null

, char *error

){

char *name = initid->ptr;

char *value = name + args->lengths[0] + 1;

memcpy(

name

, args->args[0]

, args->lengths[0]

);

*(name + args->lengths[0]) = '\0';

memcpy(

value

, args->args[1]

, args->lengths[1]

);

*(value + args->lengths[1]) = '\0';

return SETENV(name,value);

}

my_bool sys_exec_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

){

unsigned int i=0;

if(args->arg_count == 1

&& args->arg_type[i]==STRING_RESULT){

return 0;

} else {

strcpy(

message

, "Expected exactly one string type parameter"

);

return 1;

}

}

void sys_exec_deinit(

UDF_INIT *initid

){

}

my_ulonglong sys_exec(

UDF_INIT *initid

, UDF_ARGS *args

, char *is_null

, char *error

){

return system(args->args[0]);

}

my_bool sys_eval_init(

UDF_INIT *initid

, UDF_ARGS *args

, char *message

){

unsigned int i=0;

if(args->arg_count == 1

&& args->arg_type[i]==STRING_RESULT){

return 0;

} else {

strcpy(

message

, "Expected exactly one string type parameter"

);

return 1;

}

}

void sys_eval_deinit(

UDF_INIT *initid

){

}

char* sys_eval(

UDF_INIT *initid

, UDF_ARGS *args

, char* result

, unsigned long* length

, char *is_null

, char *error

){

FILE *pipe;

char line[1024];

unsigned long outlen, linelen;

result = malloc(1);

outlen = 0;

pipe = popen(args->args[0], "r");

while (fgets(line, sizeof(line), pipe) != NULL) {

linelen = strlen(line);

result = realloc(result, outlen + linelen);

strncpy(result + outlen, line, linelen);

outlen = outlen + linelen;

}

pclose(pipe);

if (!(*result) || result == NULL) {

*is_null = 1;

} else {

result[outlen] = 0x00;

*length = strlen(result);

}

return result;

}

#endif /* HAVE_DLOPEN */

75095.html

回答

0

0

分享

全部回复 (0)

ee0399eddf6a5bc7f3fcf88dee11e1b7.png还没有回复,楼主喊你快去抢前排~~~我来回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值