Cpanel MySQL Создать / Удалить базу данных удаленно

Используя cpanel, я смог создать пользователя FTP с ограниченным доступом, чтобы наша служба технической поддержки могла загружать файлы на сервер.

Теперь я застрял, потому что им также нужно иметь возможность запускать сценарии для создания и заполнения баз данных каждый раз, когда мы хотим создать новый поддомен, но кажется, что мы можем создавать базы данных только через cpanel.

Есть ли способ удаленного создания баз данных (и предоставить все права доступа, принадлежащие этому пользователю, к базе данных)?

Примечание. Я размещаю свой проект на HostGator ( https://www.hostgator.com/).

1 ответ

Решение

Примечание. Вам потребуется запросить у вашего хоста SSH-доступ и root-доступ к базе данных, чтобы применить следующее решение.

Примечание 2: Замените "gemhr" в следующем руководстве на свой собственный домен.

  1. Создайте две учетные записи (одна используется для установки, а другая будет назначена базе данных и использована в коде вашего сервера, например, на PHP).

cpanel создать базу данных пользователя

  1. Вам нужно будет добавить IP-адрес в белый список (для этого нужен статический IP-адрес).

Cpanel удаленный доступ к MySQL

  1. Получите доступ к 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';
  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`;
    

MySQL верстак тест

Вот ожидаемый результат (вы можете захотеть установить свою работу 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`;

Всем удачи

Другие вопросы по тегам