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").

Другие вопросы по тегам