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:
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! ')
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:
. 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 ')
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.
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 ')
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.