Usando Python pymysql, ligado ao banco de dados remoto via sshtunnel módulo ssh.

Recentemente, um pequeno script para mudar a sua própria, pronto para arquivar o documento dos, formatos de dados josn locais, a transferência para MySQL e Redis.

Servidor originalmente por SHH logado, mas eu não quero abrir a porta de rede externa MySQL a ser definido, com medo da insegurança, minha senha MySQL em vários números.

Eu verifiquei as informações, Python há de terceiros módulos sshtunnel ssh de login

Este é o meu link de referência: https: //www.cnblogs.com/luyingfeng/p/6386093.html

Minha primeira página inteira copiados.

razões de segurança, o acesso ao banco de dados é mais restrito a fazer, por isso não é um problema direto é muitas vezes a maior parte do tempo, em outras máquinas (como seu próprio local), não pode acessar o banco de dados, para o uso diário tem causado grande inconveniente. Então, alguns dias atrás eu fiz uma demanda, na esperança de que qualquer máquina pode ssh para a máquina sobre uma mesa no banco de dados whitelist, e, em seguida, acessar o banco de dados.

Recomendado pelo povo, uma ferramenta de consulta chamado sshtunnel, precisa ser instalado na máquina que você deseja fazer logon banco de dados.

Introdução Básica de sshtunnel:  http://sshtunnel.readthedocs.io/en/latest/?badge=latest

Este lado da Figura 2, é a cena que acabamos de descrever, um banco de dados em um servidor remoto, só pode ser acessado com outro servidor juntos, mas precisamos do ssh local para esse servidor

 

Mas o interior é o código relacionado com o servidor relevante, servidor de conexão remota, o que precisamos é um servidor de banco de dados remoto, e isso também, só precisa mudar o código na última parte dele.

Este é o código original abaixo:

Copie o código
1 importação paramiko
 2 de sshtunnel importação SSHTunnelForwarder 3 4 com 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 ', 10022 ) 11 ) na forma de túnel: 12 cliente = 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 # fazer algumas operações com sessão de cliente 17 client.close () 18 19 print ( ' ACABAMENTO! ')
Copie o código

conexão de banco de dados mysql

Ao conectar banco de dados mysql, a Internet tem visto um programador foi alcançado:  módulos Python são conectados usando mysqldb mysql através do túnel ssh

Código é a seguinte:

Copie o código
. 1 importação MySQLdb
 2 de sshtunnel importação SSHTunnelForwarder . 3 . 4 com SSHTunnelForwarder ( . 5 ( ' sshhost.domain.com ', 22, é), # configuração B da máquina . 6 ssh_password = " sshpasswd " , . 7 = ssh_username " sshusername " , . 8 remote_bind_address = ( ' mysqlhost.domain.com ', mysql.port)) Server AS: # uma configuração da máquina . 9 10 Conn = MySQLdb.connect (host = ' 127.0.0.1 ', # aqui deve sim 127.0.0.111 = porta server.local_bind_port, 12 usuário = ' utilizador ' , 13 passwd = ' palavra-passe ' , 14 db = ' nome_do_bd ')
Copie o código

 Então o que está próximo de consulta, escrever diretamente com a borda lá, e alinhar conn-lo.

Para mim não é um problema aqui, é porque estamos conectados a esta parte do banco de dados, muitas vezes em uma função separada, a atualização de exclusão de inserção e consulta outros bancos de dados não são muitas vezes juntos, assim, com que haja um recurso de deixar este escopo, o objeto é destruído o inimigo, a outra função não estiver em uso, será um caso está ligado, mas a destruição do objeto emitia, quando os resultados da consulta diretamente mostrar esse erro: OperationalError: (2006, 'servidor MySQL foi embora'), e verificar on-line este erro, muitos disseram que, devido à operação de SQL tempo de sua consulta é muito longa, ou a transferência de dados é muito grande, mas meu porque o lugar é realmente fora do escopo com, como resultado, a conexão é fechada e deu o fora, então este resultado.

Com como, um ensaio escrito muito detalhada. Compreensão da sintaxe Python com ... como ...

Depois que eu colocar o código no topo que ssh se livrar, como documentos sshtunnel Vista interna de um código correspondente, como o SSHTunnelForwarder atribuição fora do objeto para o servidor e, em seguida, iniciar o servidor, e, em seguida, realizar uma série de operações, em seguida, parar.

Originalmente uma conexão de banco de dados que escrever uma função separada, mudou depois direto e também colocou nesta função muito bem, substituir o comando de conexão originais.

Copie o código
1 def conexão (auto):
 2 ''' 3 self.client = MySQLdb.connect (host = self.server, porta = self.port, usuário = self.user, 4 passwd = self.password, db = self.database , 5 de conjunto de caracteres = self.charset) 6 # log.info ( 'Ligação para o MySQL:' + 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 é ( ' mysqlhost.domain.com ' , mysql.port) 14 ) 15 server.start () 16 . 17 self.client = MySQLdb.connect (Host = ' 127.0.0.1 ', # aqui deve sim 127,0. 0,1 18 é Port = server.local_bind_port, . = 19 Utilizador ' nome de utilizador ' , 20 é a = passwd ' palavra-passe ' , 21 é DB = ' nome_do_bd ')
Copie o código

Em seguida, fazer uma consulta para atualizar ou operação de exclusão quando o primeiro olhar de conexão como um banco de dados, com self.client.

conexão de dados SQLServer

Consistente com mysql, mas deve-se notar db, SQLServer esse banco de dados, então pymssql.connect sobre ele, mas este lugar também gostaria de dizer como a conexão depois eu pisei em um buraco, eu banco de dados Rom sqlserver acabado apenas para descobrir versão posterior do problema, o SQLServer local após I atualizado. É sempre um sentimento pit

 

A descrição acima é o autor original escreveu. Na verdade, este módulo foi originalmente se para o servidor de destino através de um servidor intermediário. Mas o meu servidor intermediário é o servidor de destino.

pymysql Importação 
de sshtunnel Import SSHTunnelForwarder 


classe DataBaseHandle: 
    '' 'define uma classe operação MySQL' '' 

    DEF o __init __ (self, Host = '127.0.01', username = 'XXX', password = 'XXX' 
                 , banco de dados = 'XXX' , Port = 10022): 
        '' 'e criar um banco de dados de informações para inicializar a conexão de banco de dados' '' 
        self.w_server = SSHTunnelForwarder ( 
                # endereço do servidor intermediário 
                ( "xxx.64.47.xxx", 22 é), 
                ssh_username = "XXX", 
                ssh_pkey = " ~ / .ssh / id_rsa " 
                # ssh_private_key_password =" ~ / .ssh / id_rsa", 
                o endereço e a porta # alvo, porque o endereço de destino é o endereço de escrita intermediário assim 127.0.0.1或者localhost 
                remote_bind_address = ( '127.0.0.1', 3306), 
                # o endereço local e a porta
                = Local_bind_address ( '0.0.0.0', 10022) 
                ) 
        # ssh exemplo início, MySQL conexões posterior de rede são executados neste ambiente. 
        self.w_server.start () 
        dados # MySQL começa mais tarde inicializa 
        self.host = Anfitrião 
        self.username = username 
        self.password = senha 
        self.database = Banco de Dados 
        Porto self.port = 
        self.db = pymysql.connect (Host self.host =, 
                                  Usuário = self.username, 
                                  password = self.password, 
                                  banco de dados = self.database, 
                                  porta = self.port, 
                                  charset = 'UTF-8')

    # Aqui método de anotação conexão com uma instância de um objeto, você cria uma conexão. Que podem ser ligados a um tratamento separado. 
    # 
    # DEF connDataBase (self): 
    # '' 'conexão com o banco' '' 
    # 
    # self.db = pymysql.connect (self.host, self.username, self.password, self.port, self.database) 
    # 
    # # = self.db.cursor self.cursor () 
    # 
    # retorno self.db 

    DEF insertDB (Self, sql): 
        '' 'para a operação de banco de dados' '' 

        self.cursor = self.db.cursor () 

        o try: 
            # executar sql 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # retorna o número de peças de dados podem ser inseridos no processo de decisão com base no valor de retorno 
            # impressão (TT) 
            self.db.
            erro # reversão ocorre 
            self.db.rollback () 
        finally: 
            self.cursor.close () 

    DEF deleteDB (Self, SQL): 
        '' 'operação dos dados do banco de dados é eliminada' '' 
        self.cursor self.db.cursor = ( ) 

        a tentativa: 
            # executar SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # devolve o número de peças excluído de valores de dados pode ser determinado de acordo com o resultado de processamento devolvido 
            # impressão (TT) 
            self.db.commit () 
        exceto: 
            rollback # erro 
            self.db.rollback () 
        finally: 
            self.cursor.close () 

    DEF updatedb (Self, SQL): 
        '' 'operação para atualizar o banco de dados' ''

        = Self.cursor self.db.cursor () 

        o try: 
            # executar SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # retorna o número atualizada de valores de dados podem ser determinadas de acordo com o resultado de processamento devolvido 
            # impressão (tt) 
            self.db.commit () 
        da exceção: 
            rollback quando ocorre um erro # 
            self.db.rollback () 
        uma finalmente: 
            self.cursor.close () 

    DEF SelectDB (Self, SQL): 
        '' 'consultas de banco de dados' '' 
        = self.cursor self.db.cursor () 
        os tentar: 
            self.cursor.execute (SQL) consulta # retorna o número de peças de dados pode ser um valor determinado de acordo com o resultado de processamento devolvido 

            de dados = self.cursor.fetchall () # retorna uma lista de todos os registros de 

            imprimir ( dados)

            # Resultados TRAVERSAL 
            para Fila em dados: 
                SID = Fila [0] 
                nome = Fila [1.] 
                # transversal imprimir resultado 
                da impressão ( 'SID =% S, nome =% S' % (SID, nome)) 
        a excepção de: 
            impressão ( 'Erro : Incapaz de fecth dados ') 
        a finalmente: 
            self.cursor.close () 

    DEF closedb (auto): 
        ' '' conexão de dados é fechado '' ' 
        self.db.close () 
        self.w_server.close () 



se o __name__ ==' __main__ ': 
    dbhandle = DataBaseHandle () 
    DbHandle.selectDb (' SELECT VERSÃO () ') 
    DbHandle.closeDb ()

 

A operação da classe de banco de dados é o que eu tenho a partir da Internet, eu me sinto bem para escrevê-lo directamente utilizado para uso.

Finalmente, lembre-se, lembre-se de desligar as conexões do MySQL ssh na saída.

Acho que você gosta

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