2016-07-22 33 views
0

Mit cpanel konnte ich einen FTP-Benutzer mit eingeschränktem Zugriff erstellen, damit unser Team für technischen Support Dateien auf den Server hochladen kann.Cpanel MySQL Datenbank remote erstellen/löschen

Jetzt bin ich irgendwie fest, da sie auch Script ausführen müssen, um Datenbanken zu erstellen und zu füllen jedes Mal wenn wir eine neue Subdomain erstellen möchten, aber es scheint, dass wir Datenbanken nur über das cpanel erstellen können.

Gibt es eine Möglichkeit, Datenbanken remote zu erstellen (und alle Zugriffsrechte dieses Benutzers für die Datenbank zu gewähren)?

Hinweis: Ich bin mein Projekt auf HostGator (https://www.hostgator.com/)

Hosting

Antwort

0

Hinweis: Sie werden Ihr Gastgeber für einen SSH-Zugang und einem Root-Zugriff auf die Datenbank müssen bitten, die folgenden anzuwenden Lösung.

Anmerkung 2: Ersetzen Sie "gemhr" im folgende Tutorial von Ihrer eigenen Domain.

  1. Erstellen Sie zwei Konten (eines für die Installation und eines, das der Datenbank zugewiesen und in Ihrem Servercode verwendet wird, z. B. PHP).

cpanel create database user

  1. Sie müssen die IP-Adresse in der Whitelist (wenn Sie eine statische IP-Adresse, dies zu tun) hinzuzufügen.

Cpanel remote MySQL access

  1. Zugang SSH mit dem Setzen und offener MySQL. Führen Sie dann die folgenden Abfragen aus.

full rechts die die Datenbank von „gemhr_“ ab (verwenden Sie Ihren Domain-Namen hier) an den Installateur Konto:

GRANT ALL PRIVILEGES ON `gemhr\_%`.* TO 'gemhr_installer'@'modemcable134.79-70-69.static.videotron.ca'; 

das Recht geben, zu gespeicherte Prozedur auf dem Tisch „mysql ausführen "zum Installateur-Konto:

Die folgende gespeicherte Prozedur muss nach dem Erstellen oder Löschen einer Datenbank ausgeführt werden. Es gewährt oder entzieht den Zugriff auf das Konto, das in PHPMyAdmin verwendet wird, und den Support-Account, der vom Server-Code verwendet wird (wie PHP).

Ändern Sie den „gemhr“ für Ihren Domain-Namen und die Zugriffsrechte ändern von „gemhr_support“ auf, was Sie es brauchen in Ihrem Server-Code zu tun.

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 ; 

auf der sicheren Seite zu sein, sollten Sie auch Zugriff auf alle Ihre Sub-Domain-Datenbank der Ferne und für localhost gewähren.

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. einen cron-Job Erstellen Sie das Datenbank-Mapping zu aktualisieren (sonst wird Ihre Datenbank im PHPMyAdmin sichtbar sein, aber nicht in Cpanel). Der Cron-Job schien nicht zu funktionieren, wenn er von meinem cpanel-Benutzer ausgeführt wurde, also habe ich ihn direkt in SSH erstellt.

Verwenden Sie diesen Befehl, um den Crontabeditor zu öffnen:

crontab -e 

Verwenden Sie diesen Befehl, die Datenbank-Mapping einmal pro Stunde zu aktualisieren:

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

CTRL + X zu speichern.

enter image description here

  1. Log in MySQL Workbench mit Ihrem Installateur, dass alles zu testen, in Ordnung ist:

    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

Hier die ist erwartetes Ergebnis (Sie könnten Ihren Cron-Job jede Minute zum Testen einstellen, um das Ergebnis schnell in cpanel zu sehen):

Expected results

Von dort schlage ich einige Codierung zu schaffen, um vollständig die SQL-Erzeugung auf Ihre Tech zu verstecken. Team hinter einem netten Webinterface.

verwenden, die Codierung, wenn Sie jemals die Änderungen in diesem Beitrag vorgestellt zurückkehren möchten:

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`; 

Guter Erfolg jeder

+0

Sie wirklich alles, was brauchen? Es gibt eine API, die perfekt funktioniert und nicht viel Unordnung erfordert. https://confluence2.cpanel.net/display/SDK/Guide+to+WHM+API+1 Doing Dinge in WHM/CPanel außerhalb der API ist der beste Weg, um sich zu kümmern. Zum Beispiel werden BD und ihre Backups intern von WHM gesteuert. Create bd außerhalb der API ist sicher der Weg aus den Backups. – abkrim

+0

Die Techniker meiner Gastgeber erzählten, dass das, was ich wollte, unmöglich war, also arbeitete ich herum und kam mit einer eigenen Lösung. Ich schaue dir morgen deinen Link an. –

+0

Es tut mir leid. Ich bin offensichtlich, dass Sie root für System sind. Sicherlich ist die Arbeit als Benutzer bei dieser Frage etwas komplizierter als bei Root-Zugriffen. – abkrim