mysql - Cpanel MySQL 远程创建/删除数据库

标签 mysql cpanel remote-access drop-database database-create

使用 cpanel,我能够创建一个具有有限访问权限的 FTP 用户,以允许我们的技术支持团队将文件上传到服务器。

现在,我有点卡住了,因为每次我们想要创建一个新的子域时,他们还需要能够运行脚本来创建和填充数据库,但似乎我们只能通过 cpanel 创建数据库。

有没有办法远程创建数据库(并授予该用户对数据库拥有的所有访问权限)?

注意:我在 HostGator ( https://www.hostgator.com/ ) 上托管我的项目

最佳答案

注意:您需要向主机请求 SSH 访问权限和对数据库的根访问权限才能应用以下解决方案。

注意2:将以下教程中的“gemhr”替换为您自己的域。

  1. 创建两个帐户(一个用于安装,一个将分配给数据库并用于您的服务器代码,例如 PHP)。

cpanel create database user

  1. 您需要将 IP 地址添加到白名单中(为此您需要一个静态 IP 地址)。

Cpanel remote MySQL access

  1. 通过放置和打开 MySQL 来访问 SSH。然后运行以下查询。

将以“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 ;

为了安全起见,您还应该授予远程和本地主机访问所有子域数据库的权限。

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';
  1. 创建一个 cron 作业来刷新数据库映射(否则您的数据库将在 PHPMyAdmin 中可见,但在 Cpanel 中不可见)。当我的 cpanel 用户执行时,cron 作业似乎不起作用,所以我直接在 SSH 中创建它。

使用此命令打开 crontab 编辑器:

crontab -e

使用此命令每小时刷新一次数据库映射:

0 * * * * /usr/local/cpanel/scripts/rebuild_dbmap gemhr

CTRL + X 保存。

enter image description here

  1. 使用安装程序登录 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`;
    

MySQL workbench test

这是预期的结果(您可能希望每分钟设置一次 cron 作业以进行测试以在 cpanel 中快速查看结果):

Expected results

从那里,我建议创建一些代码,以完全隐藏 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`;

祝大家成功

关于mysql - Cpanel MySQL 远程创建/删除数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38534993/

相关文章:

MYSQL:列计数与第 1 行的值计数不匹配无法弄清楚

php - 如何使用 cPanel API 访问电子邮件帐户列表?

php - Composer 安装 - 需要 ext-mbstring

java - 防止未经授权的软件访问mysql数据库

由于磁盘空间不足,Hadoop fs getmerge 到远程服务器/机器

java - XenServer Java 远程访问

php - 检查 MySql 数据库中的值范围,如果为空则返回

php - 从xml文件中检索后,将数据插入不同行的mysql php

php - 每天用 PHP 重置 MySQL 值

docker - 我应该在已经具有Cpanel的服务器上安装Docker吗?