Mediante el uso de pymysql Python, conectado a la base de datos remota a través de SSH sshtunnel módulo.

Recientemente, un pequeño script para cambiar su propio, listo para archivar el documento de los formatos de datos, JOSN locales, la transferencia a MySQL y Redis.

Servidor originalmente por SHH conectado, pero no quiero abrir el puerto de red externa MySQL que desea ajustar, miedo a la inseguridad, mi contraseña MySQL en varios números.

Revisé la información, Python hay terceros módulos de inicio de sesión ssh sshtunnel

Este es mi enlace de referencia: https: //www.cnblogs.com/luyingfeng/p/6386093.html

Mi primera página completa copiado.

razones de seguridad, el acceso a la base de datos en su mayoría se limitan a hacer, por lo que no es un problema directo es a menudo la mayor parte del tiempo, en otras máquinas (como su propio local), no puede acceder a la base de datos, para el uso diario ha causado un gran inconveniente. Así que hace unos días hice una demanda, con la esperanza de que cualquier máquina puede ssh en la máquina en una tabla en la base de datos de lista blanca, y luego acceder a la base de datos.

Recomendado por la gente, una herramienta de consulta llamado sshtunnel, necesita ser instalado en la máquina que desea registrar la base de datos.

Introducción básica de sshtunnel:  http://sshtunnel.readthedocs.io/en/latest/?badge=latest

Este lado de la figura 2, es la escena que acabamos de describir, una base de datos en un servidor remoto, sólo se puede acceder con otro servidor juntos, pero necesitamos el local ssh a este servidor

 

Pero el interior es el código relacionado con el servidor correspondiente, el servidor de conexión remota, lo que necesitamos es un servidor de base de datos remota, y esto, también, sólo se necesita cambiar el código en la última parte de la misma.

Este es el código original a continuación:

Copiar el código
1 importación paramiko
 2 de sshtunnel importación SSHTunnelForwarder 3 4 con SSHTunnelForwarder ( 5 (REMOTE_SERVER_IP, 443 ), 6 ssh_username = "" , 7 ssh_pkey = " / var / ssh / rsa_key " , 8 ssh_private_key_password = " secreta " , 9 remote_bind_address = (PRIVATE_SERVER_IP , 22 ), 10 local_bind_address = ( ' 0.0.0.0 ', 10 022 ) 11 ) como túnel: 12 client = paramiko.SSHClient () 13client.load_system_host_keys () 14 client.set_missing_host_key_policy (paramko.AutoAddPolicy ()) 15 client.connect ( ' 127.0.0.1 ', 10022 ) 16 # hacer algunas operaciones con la sesión de cliente 17 client.close () 18 19 print ( ' ACABADO! ')
Copiar el código

conexión de base de datos MySQL

Al conectar la base de datos MySQL, Internet ha visto un programador se ha logrado:  módulos de Python se conectan usando mysql MySQLdb a través del túnel ssh

Código es el siguiente:

Copiar el código
. 1 Importación MySQLdb
 2 de sshtunnel importación SSHTunnelForwarder . 3 . 4 con SSHTunnelForwarder ( . 5 ( ' sshhost.domain.com ', 22 es), # configuración B de la máquina . 6 ssh_password = " sshpasswd " , . 7 = ssh_username " sshusername " , . 8 remote_bind_address = ( ' mysqlhost.domain.com ', mysql.port)) Server como: # una configuración de máquina . 9 10 Conn = MySQLdb.connect (Host = ' 127.0.0.1 ', # aquí debe sí 127.0.0.111 port = server.local_bind_port, 12 user = ' usuario ' , 13 passwd = ' contraseña ' , 14 db = ' dbname ')
Copiar el código

 Entonces qué es lo siguiente consulta, escribir directamente con el borde allí, y align conn él.

Para mí no es un problema aquí, es porque estamos conectados a esta parte de la base de datos, a menudo en una función separada, la actualización de eliminación de inserción y consulta de otras bases de datos a menudo no están juntos, así que, con el ya que es una característica de dejar este ámbito, el objeto se destruye al enemigo, la otra función no está en uso, será un caso está conectado, pero la destrucción del objeto desprendía, cuando los resultados de la consulta directamente muestra este error: OperationalError: (2006, 'servidor MySQL se ha ido'), y comprobar en línea este error, muchos dijeron que debido a la operación de SQL momento de la consulta es demasiado largo, o la transferencia de datos es demasiado grande, pero mi porque el lugar es en realidad fuera de alcance con como resultado, la conexión se cierra y se entregó a cabo, por lo que este resultado.

En la mayor, un ensayo escrito muy detallado. La comprensión de la sintaxis de Python con ... como ...

Después de poner el código en la parte superior que ssh deshacerse de, al igual que los documentos sshtunnel Vista interior de un código correspondiente, como el SSHTunnelForwarder asignación fuera del objeto al servidor, y luego iniciar el servidor, y luego realizar una serie de operaciones, a continuación, hacer una parada.

Originalmente una conexión de base de datos se escribe una función separada, cambiado después directa y también colocado en esta función muy bien, reemplace la sentencia de conexión originales.

Copiar el código
1 def connect (self):
 2 ''' 3 self.client = MySQLdb.connect (host = self.server, port = self.port, user = self.user, 4 passwd = self.password, db = self.database , 5 charset = self.charset) 6 # log.info ( 'Conexión a MySQL Server:' + self.server) 7 ''' 8 9 servidor = SSHTunnelForwarder ( 10 ( ' sshhost.domain.com ', 22), # B机器的配置11 ssh_password = ' ssh_password ' , 12 ssh_username = ' ssh_username ' ,Remote_bind_address = 13 es ( ' mysqlhost.domain.com ' , mysql.port) 14 ) 15 server.start () 16 . 17 self.client = MySQLdb.connect (Host = ' 127.0.0.1 ', # aquí debe sí 127,0. 0,1 18 es el puerto = server.local_bind_port, . 19 = usuario ' nombre de usuario ' , 20 es el = passwd ' contraseña ' , 21 es DB = ' dbname ')
Copiar el código

Luego de hacer una consulta para actualizar o operación de eliminación cuando el primer aspecto de la conexión como una base de datos, con self.client.

conexión de la base de datos sqlserver

En consonancia con MySQL, pero debe tenerse en cuenta db, SQLServer esa base de datos, entonces pymssql.connect en él, pero este lugar también como para decir cómo la conexión después de que entró en un pozo, que la base de datos SQL Server Rom acabada sólo para descubrir versión posterior del problema, el SQL Server local después de que he actualizado. Siempre es un pozo de sensación

 

Lo anterior es el autor original escribió. De hecho, este módulo se entra originalmente para el servidor de destino a través de un servidor intermedio. Pero mi servidor intermedio es el servidor de destino.

pymysql importación 
de sshtunnel importación SSHTunnelForwarder 


clase DataBaseHandle: 
    '' 'define una clase de operación MySQL' '' 

    DEF la __init __ (self, Host = '127.0.01', nombre de usuario = 'XXX', password = 'XXX' 
                 , la base de datos = 'XXX' , Puerto = 10022): 
        '' 'y crear una base de datos de la información para inicializar la conexión de base de datos' '' 
        self.w_server = SSHTunnelForwarder ( 
                # dirección del servidor intermedio 
                ( "xxx.64.47.xxx", 22 es), 
                ssh_username = "XXX", 
                ssh_pkey = " ~ / .ssh / id_rsa " 
                # ssh_private_key_password =" ~ / .ssh / id_rsa", 
                la dirección y el puerto # objetivo, debido a que la dirección de destino es la dirección intermedia de modo de escritura 127.0.0.1 o localhost 
                remote_bind_address = ( '127.0.0.1', 3306), 
                # la dirección local y el puerto
                = Local_bind_address ( '0.0.0.0', 10022) 
                ) 
        # ssh inicio ejemplo, MySQL conexiones de red posteriores se ejecutan en este entorno. 
        self.w_server.start () 
        de datos MySQL # comienza más tarde inicializa 
        self.host = Host 
        self.username = nombre de usuario 
        self.password = contraseña 
        self.database = Base de datos 
        self.port = Puerto 
        self.db = pymysql.connect (Host self.host =, 
                                  usuario = self.username, 
                                  password = self.password, 
                                  Base de datos = self.database, 
                                  Puerto = self.port, 
                                  charset = 'UTF-8')

    # Aquí anotación método de conexión a una instancia de un objeto, se crea una conexión. Que se pueden conectar a un tratamiento distinto. 
    # 
    # DEF connDataBase (Ser): 
    # '' 'conexión de base' '' 
    # 
    # self.db = pymysql.connect (self.host, self.username, self.password, self.port, self.database) 
    # 
    # # = self.db.cursor self.cursor () 
    # 
    # retorno self.db 

    DEF insertDB (Ser, sql): 
        '' 'en la operación de base de datos' '' 

        self.cursor = self.db.cursor () 

        el try: 
            # ejecutar SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # devuelve el número de elementos de datos pueden ser insertados en el proceso de decisión basada en el valor de retorno 
            # impresión (TT) 
            self.db.
            error # Rollback se produce 
            self.db.rollback () 
        el último: 
            self.cursor.close () 

    DEF deleteDB (Ser, SQL): 
        '' 'funcionamiento de la base de datos de los datos se elimina' '' 
        self.cursor self.db.cursor = ( ) 

        el try: 
            # ejecutar SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # devuelve el número de borrado piezas de valores de datos pueden ser determinadas de acuerdo con el resultado de procesado 
            # de impresión (TT) 
            self.db.commit () 
        excepto: 
            reversión de error # 
            self.db.rollback () 
        el último: 
            self.cursor.close () 

    DEF updatedb (Ser, SQL): 
        '' 'operación para actualizar la base de datos' ''

        = Self.cursor self.db.cursor () 

        el try: 
            # ejecutar SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # devuelve el número actualizado de valores de datos pueden ser determinados de acuerdo con el resultado de procesado 
            # impresión (tt) 
            self.db.commit () 
        la excepción: 
            rollback cuando se produce un error # 
            self.db.rollback () 
        un fin: 
            self.cursor.close () 

    DEF SelectDB (Ser, SQL): 
        '' 'consultas a la base' '' 
        = self.cursor self.db.cursor () 
        los Proveedores: 
            self.cursor.execute (SQL) consulta # devuelve el número de piezas de datos puede ser un valor determinado de acuerdo con el resultado de procesado 

            de datos = self.cursor.fetchall () # devuelve una lista de todos los registros de 

            imprimir ( datos)

            # Resultados de recorrido 
            para la fila en datos: 
                SID = Fila [0] 
                name = Fila [1.] 
                # traverse resultado de la impresión 
                de impresión ( 'SID =% S, nombre =% S' % (SID, nombre)) 
        la excepción de: 
            Imprimir ( 'Error : No se puede fecth de datos ') 
        del último: 
            self.cursor.close () 

    DEF closedb (Ser): 
        ' '' de conexión de base de datos está cerrado '' ' 
        self.db.close () 
        self.w_server.close () 



SI el __name__ ==' __main__ ': 
    dbhandle = DataBaseHandle () 
    DbHandle.selectDb (' el SELECT VERSION () ') 
    DbHandle.closeDb ()

 

La operación de la clase de base de datos es lo que tengo a través de Internet, me siento bien escribirlo utilizar directamente para su uso.

Por último, recuerde, recuerde apagar las conexiones ssh en el MySQL salida.

Supongo que te gusta

Origin www.cnblogs.com/sidianok/p/12571798.html
Recomendado
Clasificación