我不确定此问题的名称是否明确,请随时对其进行编辑。
我正在尝试使用UDF在mysql内部运行python脚本。我使用的UDF的来源可以在here中找到。
此UDF提供了mysql函数sys_eval()
,您可以使用它来运行命令。
首先,我将引导您解决问题。
设置UDF之后,我在mysql中运行了一个简单的测试命令:
select sys_eval('whoami');
> mysql
好的,这可以正常工作,并且用户符合预期。现在让我们运行一个测试python脚本。
/var/lib/mysql/scripts/test.py
print("success!")
在mysql中运行脚本:
select sys_eval('python3 /var/lib/mysql/scripts/test.py');
> success!
太好了。这里没有问题。现在该运行真实的脚本了。
/var/lib/mysql/scripts/queue_update.py
import sys
import json
import os
create_path = "/tmp/mysql_updates/temp/"
filename_begin = "ip_username_update_"
filename_end = ".upd"
move_path = "/tmp/mysql_updates/"
def create_filename():
# Generate random id
rnd_id = uuid.uuid4()
return filename_begin + str(rnd_id) + filename_end
def open_file(filename):
return os.open(path=create_path + filename, flags=(os.O_CREAT | os.O_APPEND | os.O_WRONLY | os.O_EXCL))
if __name__ == '__main__':
json_dict = {}
json_dict['type'] = "test"
json_string = json.dumps(json_dict)
while True:
try:
filename = create_filename()
fd = open_file(filename)
os.write(fd, bytearray(json_string, 'utf-8'))
os.close(fd)
os.rename(create_path + filename, move_path + filename)
break
except FileExistsError as e:
continue # Make a new filename and try again
except Exception as e:
print("caught random except")
print(e)
break
此脚本非常简单。 首先,它会生成一个uuid并使用它来构建文件名。
然后,它使用生成的文件名将json字符串写入/tmp/mysql_updates/temp
中的文件中。如果文件名已被使用,它将生成一个新的文件名,然后重试直到生成唯一的文件名。
创建并写入文件后,将其移至/tmp/mysql_updates/
现在,让我们首先测试该脚本,因为在这里先写一个问题而不先做那个问题是很愚蠢的。
[root@localhost scripts]# python3 queue_update.py
[root@localhost scripts]# ls /tmp/mysql_updates/
ip_username_update_c8849c0b-e774-4a87-acfb-0b06b8499970.upd temp
太好了,按预期工作。现在,在mysql上执行此操作之前,让我们确保mysql用户和组都具有执行目录/tmp/mysql_updates/
和/tmp/mysql_updates/temp/
的权限。
[root@localhost scripts]# rm -f /tmp/mysql_updates/ip_username_update_c8849c0b-e774-4a87-acfb-0b06b8499970.upd
[root@localhost scripts]# ls -la /tmp/mysql_updates/
drwxrwxrwx. 3 mysql mysql 83 Jun 27 14:03 .
drwxrwxrwt. 11 root root 4096 Jun 27 13:32 ..
drwxrwxrwx. 2 mysql mysql 6 Jun 27 13:59 temp
最后,让我们在mysql中执行脚本:
select sys_eval('/var/lib/mysql/scripts/queue_update.py');
> caught random execpt
[Errno 13] Permission denied: '/tmp/mysql_updates/temp/ip_username_update_7f5f471b-717a-43cd-959a-d6b5f199fb6e.upd'
如您所见,尝试创建文件时,我们拒绝了权限。
我们知道创建文件的时间到了,因为我们可以检查/tmp/mysql_updates/temp/
中的文件:
[root@localhost scripts]# ls /tmp/mysql_updates/temp/
(no output)
没有文件。
所以这是我的问题。解决此拒绝权限问题的任何帮助都将非常有用。
我尝试过的事情:
sudo -u mysql / bin / bash-然后执行脚本。没有错误,按预期方式工作。
我不确定还能尝试什么。