Cpanel MySQL Создать / Удалить базу данных удаленно
Используя cpanel, я смог создать пользователя FTP с ограниченным доступом, чтобы наша служба технической поддержки могла загружать файлы на сервер.
Теперь я застрял, потому что им также нужно иметь возможность запускать сценарии для создания и заполнения баз данных каждый раз, когда мы хотим создать новый поддомен, но кажется, что мы можем создавать базы данных только через cpanel.
Есть ли способ удаленного создания баз данных (и предоставить все права доступа, принадлежащие этому пользователю, к базе данных)?
Примечание. Я размещаю свой проект на HostGator ( https://www.hostgator.com/).
1 ответ
Примечание. Вам потребуется запросить у вашего хоста SSH-доступ и root-доступ к базе данных, чтобы применить следующее решение.
Примечание 2: Замените "gemhr" в следующем руководстве на свой собственный домен.
- Создайте две учетные записи (одна используется для установки, а другая будет назначена базе данных и использована в коде вашего сервера, например, на PHP).
- Вам нужно будет добавить IP-адрес в белый список (для этого нужен статический IP-адрес).
- Получите доступ к SSH с помощью установки и открытия MySQL. Затем выполните следующие запросы.
Добавьте полное право к базе данных, начинающейся с "gemhr_" (используйте ваше доменное имя здесь) к учетной записи установщика:
GRANT ALL PRIVILEGES ON `gemhr\_%`.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
Дайте право на выполнение хранимой процедуры в таблице "mysql" учетной записи установщика:
GRANT EXECUTE ON mysql.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
Следующая хранимая процедура должна быть запущена после создания или удаления базы данных. Он предоставит или аннулирует доступ к учетной записи, используемой в PHPMyAdmin, и к учетной записи поддержки, используемой кодом сервера (например, PHP).
Измените "gemhr" для вашего доменного имени и измените права доступа "gemhr_support" в зависимости от того, что вам нужно сделать в коде вашего сервера.
USE mysql;
DELIMITER //
CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `manageSubDomain`
(
sdName VARCHAR(50),
created BOOLEAN
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
IF ((SELECT
CASE WHEN sdName REGEXP '^gemhr_[A-Za-z0-9_]+$'
THEN TRUE
ELSE FALSE END
) = TRUE AND
IFNULL(
(
SELECT `SCHEMA_NAME`
FROM `information_schema`.`SCHEMATA`
WHERE `SCHEMA_NAME` = (sdName COLLATE utf8_unicode_ci)
),
''
) <> ''
) THEN
SET sdName = INSERT(
sdName,
INSTR(sdName, '_'),
1,
'\_'
);
START TRANSACTION;
IF (created = true) THEN
SET @query = CONCAT(
'GRANT ALL PRIVILEGES ON `',
sdName, '`.* TO ''gemhr''@''localhost'''
);
ELSE
SET @query = CONCAT(
'REVOKE ALL PRIVILEGES ON `',
sdName, '`.* FROM ''gemhr''@''localhost'''
);
END IF;
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF (created = true) THEN
SET @query = CONCAT(
'GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `',
sdName,
'`.* TO ''gemhr_support''@''localhost'''
);
ELSE
SET @query = CONCAT(
'REVOKE ALL PRIVILEGES ON `',
sdName,
'`.* FROM ''gemhr_support''@''localhost'''
);
END IF;
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @query = REPLACE(
@query,
'localhost',
'modemcable134.79-70-69.static.videotron.ca'
);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
COMMIT;
SET @query = '';
ELSE
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'INVALID_SUBDOMAIN_NAME';
END IF;
END //
DELIMITER ;
Чтобы быть в безопасности, вы также должны предоставить доступ ко всем базам данных вашего субдомена удаленно и для localhost.
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `gemhr\_%`.* TO 'gemhr_support'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `gemhr\_%`.* TO 'gemhr_support'@'modemcable134.79-70-69.static.videotron.ca';
- Создайте задание cron для обновления отображения базы данных (в противном случае ваша база данных будет видна в PHPMyAdmin, но не в Cpanel). Задание cron, похоже, не сработало при выполнении моим пользователем cpanel, поэтому я создал его непосредственно в SSH.
Используйте эту команду, чтобы открыть редактор crontab:
crontab -e
Используйте эту команду для обновления сопоставления базы данных один раз в час:
0 * * * * /usr/local/cpanel/scripts/rebuild_dbmap gemhr
CTRL + X, чтобы сохранить.
Войдите в MySQL с вашим установщиком, чтобы проверить, что все в порядке:
CREATE DATABASE IF NOT EXISTS `gemhr_test123`; USE mysql; CALL `manageSubDomain`('gemhr_test123', true); -- CALL `manageSubDomain`('gemhr_test123', false); -- DROP DATABASE IF EXISTS `gemhr_test123`;
Вот ожидаемый результат (вы можете захотеть установить свою работу cron каждую минуту для тестирования, чтобы быстро увидеть результат в cpanel):
Оттуда я предлагаю создать код, чтобы полностью скрыть создание SQL для вашей технологии. команда за хороший веб-интерфейс.
Используйте эту кодировку, если вы хотите отменить изменения, представленные в этом посте:
REVOKE ALL PRIVILEGES ON `gemhr\_%`.* from 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
REVOKE ALL PRIVILEGES ON `mysql`.* from 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
REVOKE ALL PRIVILEGES ON `gemhr\_%`.* from 'gemhr_support'@'modemcable134.79-70-69.static.videotron.ca';
REVOKE ALL PRIVILEGES ON `gemhr\_%`.* from 'gemhr_support'@'localhost';
USE mysql;
DROP PROCEDURE IF EXISTS `manageSubDomain`;
Всем удачи