【问题标题】:Cpanel MySQL Create/Drop database remotelyCpanel MySQL 远程创建/删除数据库
【发布时间】:2016-11-26 20:41:12
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    1. 您需要在白名单中添加 IP 地址(您需要一个静态 IP 地址才能这样做)。

    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”的访问权限。 p>

    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 中不可见)。 cron 作业在我的 cpanel 用户执行时似乎不起作用,所以我直接在 SSH 中创建了它。

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

    crontab -e
    

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

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

    CTRL + X 保存。

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

    祝大家成功

    【讨论】:

    • 你真的需要这些吗?有一种叫做 API 的东西可以完美运行,并且不需要太多混乱。 confluence2.cpanel.net/display/SDK/Guide+to+WHM+API+1 在 API 之外的 WHM / CPanel 中做事是大惊小怪的最佳方式。例如,BD 及其备份由 WHM 内部控制。在 api 之外创建 bd 肯定是备份的出路。
    • 房东的技术人员告诉我,我想要的东西是不可能的,所以我自己解决了问题并提出了一个解决方案。明天我会检查你的链接。
    • 对不起。我很明显你是系统的根。当然,与拥有 root 访问权限相比,在这个问题上以用户身份工作要复杂一些。
    猜你喜欢
    • 2018-11-12
    • 2012-12-20
    • 1970-01-01
    • 2011-10-02
    • 2014-10-17
    • 2013-07-24
    • 2022-06-20
    • 2021-01-09
    • 2018-10-15
    相关资源
    最近更新 更多