С помощью Python pymysql, подключенный к удаленной базе данных с помощью модуля sshtunnel SSH.

Недавно небольшой скрипт, чтобы изменить свои собственные, готовые отложить документ из местных, josn форматов данных, передачи в MySQL и Redis.

Сервер первоначально SHH вошли в систему, но я не хочу, чтобы открыть внешний сетевой порт MySQL, чтобы установить, боясь небезопасности, мой MySQL пароль на несколько номеров.

Я проверил информацию, Python есть третья сторона модули sshtunnel SSH Войти

Это моя ссылка ссылка: https: //www.cnblogs.com/luyingfeng/p/6386093.html

Мой первый полностраничное скопирована.

по причинам безопасности, доступ к базе данных, в основном, ограничиваются делать, поэтому существует прямая проблема часто большая часть времени, в других машинах (например, их местный), не может получить доступ к базе данных, для использования в повседневном вызвало большой неудобство. Так несколько дней назад я сделал спрос, в надежде, что любая машина может SSH в машину на столе в белый список базы данных, а затем получить доступ к базе данных.

Рекомендуется людям, инструмент запроса называется sshtunnel, должен быть установлен на компьютере, который вы хотите войти базу данных.

Основное введение sshtunnel:  http://sshtunnel.readthedocs.io/en/latest/?badge=latest

Эта сторона на фиг.2, является сценой, которую мы только что описали, базу данных на удаленном сервере, можно получить доступ только с другим сервером вместе, но нам нужен локальный SSH к этому серверу

 

Но внутри кода, связанная с соответствующим сервером, сервер удаленного подключения, то, что нам нужно, это удаленный сервер базы данных, и это тоже нужно только изменить код в последней части.

Это исходный код ниже:

Скопировать код
1 импорта paramiko
 2 из sshtunnel импорта SSHTunnelForwarder 3 4 с SSHTunnelForwarder ( 5 (REMOTE_SERVER_IP, 443 ), 6 ssh_username = "" , 7 ssh_pkey = " / Var / SSH / rsa_key " , 8 ssh_private_key_password = " секрет " , 9 remote_bind_address = (PRIVATE_SERVER_IP , 22 ), 10 local_bind_address = ( ' 0.0.0.0 ', 10022 ) 11 ) в качестве туннеля: 12 клиента = 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 # делать некоторые операции с клиентской сессии 17 client.close () 18 19 печать ( " ГОТОВО! «)
Скопировать код

подключение базы данных Mysql

При подключении базы данных MySQL, Интернет видел программист был достигнут:  модули Python связаны с использованием MySQLDb MySQL через SSH туннель

Код выглядит следующим образом:

Скопировать код
. 1 Импорт MySQLdb
 2 из sshtunnel Import SSHTunnelForwarder . 3 . 4 с SSHTunnelForwarder ( . 5 ( ' sshhost.domain.com ', 22), # В конфигурацию машины . 6 ssh_password = " sshpasswd " , . 7 = ssh_username " SSHUserName " , . 8 remote_bind_address = ( ' mysqlhost.domain.com », mysql.port)) Сервер AS: # конфигурация машины . 9 10 Conn = MySQLdb.connect (Host = ' 127.0.0.1 ', # здесь надо да 127.0.0.111 порта = server.local_bind_port, 12 пользователя = ' пользователь ' , 13 PASSWD = ' пароль ' , 14 дБ = ' имя_бда ')
Скопировать код

 Тогда что следующий запрос, написать непосредственно с краем там, и Конн выровняйте его.

Для меня есть проблема здесь, потому что мы подключены к этой части базы данных, часто в отдельной функции, вставка удаление обновлений и запросы других баз данных часто не вместе, так, с как есть особенность оставить эту область, объект будет уничтожен противник, а другая функция не используется, то это будет случай связан, но разрушение объекта издавало, когда результаты запроса напрямую показать эту ошибку: OperationalError: (2006, «MySQL сервер ушел»), и проверить в Интернете эту ошибку, многие говорили, что из-за времени работы SQL вашего запроса слишком долго, или передача данных слишком велик, но мой потому что место на самом деле выходит за рамки с в результате соединение закрывается, и выдавал, так что этот результат.

На с , как, эссе написано очень подробно. Понимание синтаксиса Python с ... , как ...

После того, как я поставил код на вершине, что SSH избавиться, как sshtunnel документов внутри зрения соответствующего кода, как SSHTunnelForwarder назначения из объекта на сервер, а затем запустить сервер, а затем выполнить ряд операций, а затем остановиться.

Первоначально соединение с базой данных мы напишем отдельную функцию, изменился после прямой, а также размещено в этой функции просто отлично, замените оригинальное заявление на соединение.

Скопировать код
1 Защиту Connect (само):
 2 ''» 3 self.client = MySQLdb.connect (хост = self.server, порт = self.port, пользователь = self.user, 4 PASSWD = self.password, дБ = self.database , 5 кодировка = self.charset) 6 # log.info ( 'Подключение к серверу MySQL:' + self.server) 7 ''» 8 9 сервер = SSHTunnelForwarder ( 10 ( ' sshhost.domain.com ', 22), # В机器的配置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 ', # здесь надо да 127,0. 0,1 18 Порт = server.local_bind_port, . 19 = Пользователь ' имя пользователя ' , 20 представляет собой PASSWD = ' пароль ' , 21 DB = ' имя_бд ')
Скопировать код

Затем сделать запрос, чтобы обновить или удалить операцию, когда первое соединение выглядят как базы данных, с self.client.

подключение к базе данных SQLServer

В соответствии с MySQL, но следует отметить, дб, SQLServer, что база данных, то pymssql.connect на ней, но это место также, как сказать, как связь после того, как я вышел на яму, я закончил SQLServer базы данных Rom только чтобы обнаружить позднюю версию проблемы, местного SQLServer после обновления его. Это всегда чувство яма

 

Выше оригинальный автор написал. На самом деле, этот модуль был первоначально входа на целевой сервер через промежуточный сервер. Но мой промежуточный сервер является целевым сервером.

pymysql Импорт 
из sshtunnel Импорт SSHTunnelForwarder 


класса DataBaseHandle: 
    '' 'определяет MySQL класс операции' '' 

    DEF __init __ (Self, host = '127.0.01', имя пользователя = 'XXX', пароль = 'XXX' 
                 , базы данных = 'XXX' , Port = 10022): 
        '' 'и создать информационную базу данных для инициализации соединения с базой данных' '' 
        self.w_server = SSHTunnelForwarder ( 
                # промежуточный адрес сервера 
                ( "xxx.64.47.xxx", 22), 
                ssh_username = "XXX", 
                ssh_pkey = " ~ / .ssh / id_rsa " 
                # ssh_private_key_password =" ~ / .ssh / id_rsa», 
                адрес и порт # цель, потому что целевой адрес является промежуточным адресом записи , так 127.0.0.1或者локальный 
                remote_bind_address = ( '127.0.0.1', 3306), 
                # локальный адрес и порт
                = Local_bind_address ( '0.0.0.0', 10022) 
                ) 
        # SSH Пример запуска, соединения последующей сети MySQL выполняются в этой среде. 
        self.w_server.start () 
        # MySQL данных начинается позже инициализирует 
        self.host = Хост 
        self.username = имя пользователя 
        self.password = пароль 
        self.database = База данных 
        self.port = Порт 
        self.db = pymysql.connect (Host self.host =, 
                                  User = self.username, 
                                  пароль = self.password, 
                                  Database = self.database, 
                                  Port = self.port, 
                                  кодировка = 'UTF - 8')

    # Здесь метод аннотация подключение к экземпляру объекта, необходимо создать соединение. Допускается быть подключен к отдельной обработке. 
    # 
    # DEF connDataBase (Self): 
    # '' 'соединение с базой данных' '' 
    # 
    # self.db = pymysql.connect (self.host, self.username, self.password, self.port, self.database) 
    # 
    # # = self.db.cursor self.cursor () 
    # 
    # Возвращение self.db 

    DEF insertDB (Self, SQL): 
        '' 'в операции с базой данных' '' 

        self.cursor = self.db.cursor () 

        попробовать: 
            # выполнить SQL 
            self.cursor.execute (SQL) 
            # ТТ = self.cursor.execute (SQL) # возвращает количество элементов данных может быть вставлен возвращаемое значение определяется в соответствии с результатом обработки 
            (ТТ) Печать # 
            self.db.commit ()
            # Откат происходит ошибка 
            self.db.rollback () 
        окончательно: 
            self.cursor.close () 

    DEF deleteDB (Self, SQL): 
        '' 'функционирование данных базы данных удаляется' '' 
        self.cursor self.db.cursor = ( ) 

        попробовать: 
            # выполнить SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # возвращает число удаленных части значений данных могут быть определены в зависимости от результата обработки возвращаемого 
            # Print (TT) 
            self.db.commit () за 
        исключением: 
            откат # ошибки 
            self.db.rollback () 
        окончательно: 
            self.cursor.close () 

    DEF updatedb (Self, SQL): 
        '' 'операции для обновления базы данных' ''

        = Self.db.cursor self.cursor () 

        Попробовать: 
            # выполнить SQL 
            self.cursor.execute (SQL) 
            # TT = self.cursor.execute (SQL) # возвращает обновленное количество значений данных может быть определена в соответствии с результатом обработки возвращается 
            # печати (тт) 
            self.db.commit () 
        , кроме информации : 
            откат при возникновении ошибки # 
            self.db.rollback () 
        финально: 
            self.cursor.close () 

    DEF SelectDB (Self, SQL): 
        '' 'запросы к базе данных' '' 
        = self.db.cursor self.cursor () 
        попробовать: 
            self.cursor.execute (SQL) запрос # возвращает количество элементов данных может быть значение определяется в зависимости от результата обработки возвращаемых 

            данных = self.cursor.fetchall () # возвращает список всех записей 

            печати ( данные)

            # Результаты обхода 
            для строки в данных: 
                SID = Строка [0] 
                Имя = Строка [1] . 
                # траверс печать результата 
                печати ( 'SID =% S, имя =% S' % (SID, имя)) 
        , кроме информации : 
            печати ( «Error : Невозможно fecth данные ') 
        окончательно: 
            self.cursor.close () 

    DEF closedb (Self): 
        ' '' соединение с базой данных является закрытым '' ' 
        self.db.close () 
        self.w_server.close () 



ЕСЛИ __name__ ==' __main__ ': 
    dbhandle = DataBaseHandle () 
    DbHandle.selectDb (' ВЫБОР ВАРИАНТ () «) 
    DbHandle.closeDb ()

 

Работа класса базы данных является то, что я получил из Интернета, я чувствую себя хорошо, чтобы написать это непосредственно используется для использования.

И, наконец, помните, помните, чтобы выключить MySQL SSH соединения на выходе.

рекомендация

отwww.cnblogs.com/sidianok/p/12571798.html
рекомендация