Я не уверен, ясно ли имя этого вопроса или нет, не стесняйтесь редактировать его.
Я пытаюсь запустить скрипт на python внутри mysql, используя UDF.Источник UDF, который я использую, можно найти здесь .
Этот 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 - затем запустите скрипт.Нет ошибок, работает как положено.
Я не уверен, что еще попробовать.