Emacs如何使用ssh隧道连接到远程MySQL

use*_*035 6 emacs sql-mode

我有一堆远程MySQL服务器,只允许从localhost连接.要连接到它们,我执行以下操作:

ssh host
mysql -uuser -psecret -hhost.myhost.com
Run Code Online (Sandbox Code Playgroud)

在emacs中,我使用sql-mysql-mode配置了与本地MySQL的连接:

(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)
Run Code Online (Sandbox Code Playgroud)

所以,每次点击F10,我都会获得MySQL shell.

是否有可能调整sql-mysql,所以它通过ssh连接到外部机器并在该机器上使用mysql程序,所以我可以从Emacs连接到任何地方?

Ale*_*iev 10

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))
Run Code Online (Sandbox Code Playgroud)

您当然可以"/ssh:host.myhost.com:"用函数调用替换,该函数调用会询问您要连接哪个主机等.