Cpanel MySQL Create/Drop 远程数据库
Cpanel MySQL Create/Drop database remotely
使用 cpanel,我能够创建一个具有有限访问权限的 FTP 用户,以允许我们的技术支持团队将文件上传到服务器。
现在,我有点卡住了,因为每次我们想创建一个新的子域时,他们还需要能够 运行 脚本来创建和填充数据库,但似乎我们只能创建数据库通过控制面板。
有没有办法远程创建数据库(并授予该用户对数据库拥有的所有访问权限)?
注意:我在 HostGator 上托管我的项目 (https://www.hostgator.com/)
注意:您需要向主机请求 SSH 访问权限和对数据库的根访问权限才能应用以下解决方案。
注2:将以下教程中的“gemhr”替换成自己的域
- 创建两个帐户(一个用于安装,一个将分配给数据库并在您的服务器代码中使用,例如 PHP)。
- 您需要将 ip 地址添加到白名单中(您需要一个静态 ip 地址才能这样做)。
- 使用 put 和 open 访问 SSH MySQL。然后运行下面的查询。
将以“gemhr_”(此处使用您的域名)开头的数据库完全添加到安装程序帐户:
GRANT ALL PRIVILEGES ON `gemhr\_%`.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
将在 table "mysql" 上执行存储过程的权限授予安装程序帐户:
GRANT EXECUTE ON mysql.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
以下存储过程必须在创建或删除数据库后 运行。它将 g运行t 或撤销对 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 ;
为了安全起见,您还应该 g运行t 远程和本地主机访问所有子域数据库。
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 workbench 以测试是否一切正常:
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 创建给您的技术。漂亮的网络界面背后的团队。
如果您想还原此 post 中显示的更改,请使用该编码:
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`;
祝大家成功
使用 cpanel,我能够创建一个具有有限访问权限的 FTP 用户,以允许我们的技术支持团队将文件上传到服务器。
现在,我有点卡住了,因为每次我们想创建一个新的子域时,他们还需要能够 运行 脚本来创建和填充数据库,但似乎我们只能创建数据库通过控制面板。
有没有办法远程创建数据库(并授予该用户对数据库拥有的所有访问权限)?
注意:我在 HostGator 上托管我的项目 (https://www.hostgator.com/)
注意:您需要向主机请求 SSH 访问权限和对数据库的根访问权限才能应用以下解决方案。
注2:将以下教程中的“gemhr”替换成自己的域
- 创建两个帐户(一个用于安装,一个将分配给数据库并在您的服务器代码中使用,例如 PHP)。
- 您需要将 ip 地址添加到白名单中(您需要一个静态 ip 地址才能这样做)。
- 使用 put 和 open 访问 SSH MySQL。然后运行下面的查询。
将以“gemhr_”(此处使用您的域名)开头的数据库完全添加到安装程序帐户:
GRANT ALL PRIVILEGES ON `gemhr\_%`.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
将在 table "mysql" 上执行存储过程的权限授予安装程序帐户:
GRANT EXECUTE ON mysql.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca';
以下存储过程必须在创建或删除数据库后 运行。它将 g运行t 或撤销对 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 ;
为了安全起见,您还应该 g运行t 远程和本地主机访问所有子域数据库。
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 workbench 以测试是否一切正常:
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 创建给您的技术。漂亮的网络界面背后的团队。
如果您想还原此 post 中显示的更改,请使用该编码:
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`;
祝大家成功