Emacs, как использовать SSH туннель для подключения к удаленному MySQL
У меня есть несколько удаленных серверов MySQL, которые разрешают соединение только с локального хоста. Для подключения к ним я делаю следующее:
ssh host
mysql -uuser -psecret -hhost.myhost.com
В emacs я настроил соединение с локальным MySQL, используя sql-mysql-mode:
(setq sql-connection-alist
'((pool-a
(sql-product 'mysql)
(sql-server "localhost")
(sql-user "user")
(sql-password "secret")
(sql-database "")
(sql-port 3306))
))
(defun sql-connect-preset (name)
"Connect to a predefined SQL connection listed in `sql-connection-alist'"
(eval `(let ,(cdr (assoc name sql-connection-alist))
(flet ((sql-get-login (&rest what)))
(sql-product-interactive sql-product)))))
(defun sql-local ()
"Connect to the local MySQL server"
(interactive)
(sql-connect-preset 'pool-a)
(delete-other-windows))
(define-key global-map [f10] 'sql-local)
Итак, каждый раз, когда я нажимаю F10
Я получаю оболочку MySQL.
Можно ли настроить sql-mysql, чтобы он подключался к внешнему компьютеру через ssh и использовал программу mysql на этом компьютере, чтобы я мог подключаться из Emacs повсюду?
3 ответа
Режим Sql использует default-directory
когда он устанавливает соединение с базой данных, поэтому, если переменная имеет формат TRAMP, ssh (или что-то еще) будет сначала использоваться для подключения к удаленному хосту, а затем использовать клиент базы данных локально. Для автоматизации этого вы можете сделать что-то вроде
(defadvice sql-mysql (around sql-mysql-around activate)
"SSH to linux, then connect"
(let ((default-directory "/ssh:host.myhost.com:"))
ad-do-it))
Вы можете, конечно, заменить "/ssh:host.myhost.com:"
с помощью вызова функции, которая спросит вас, к какому хосту подключиться и т. д.
Начиная с Emacs 25.1, в sql-connection-alist появилась новая опция sql-default-directory. Установка этого для каждого сервера, который нуждается в этом, позволяет вам использовать бэкэнд-программу с любого данного сервера без каких-либо хитростей или специфических уловок продукта. Просто настройка вашего соединения, как:
(sql-default-directory "/host.myhost.com:")
Или, если вам нужно указать ssh по какой-то причине:
(sql-default-directory "/ssh:host.myhost.com:")
Взгляните на 'sql-mysql-program' на 'и'sql-mysql-options'. Вы можете связать первое с "ssh", а второе с "host mysql". Если emacs не вставляет "sql-mysql- login-params 'между ними, вы будете в открытом доступе. Если это не так, вам нужно создать скрипт, который просто выполняет "ssh host mysql", а затем указать' sql-mysql-program 'на этот скрипт.
Если вам нужно одновременно использовать туннелированные и не туннелированные подключения mysql, вы можете рассмотреть возможность добавления нового элемента в sql-product-alist (что-то вроде "tunneled-mysql").