且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-10-17 22:41:19

Sql模式使用 default-directory 当它建立到数据库的连接时,所以如果变量是TRAMP格式,ssh(或任何)将被用来连接到远程主机,然后使用数据库客户端本地要自动执行,您可以执行类似

 (defadvice sql-mysql(围绕sql-mysql-around activate))
SSH到linux,然后连接
(let((default-directory/ssh:host.myhost.com:))
ad-do-it))

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


I have a bunch of remote MySQL servers, that allow connection only from localhost. To connect to them I do the following:

ssh host
mysql -uuser -psecret -hhost.myhost.com

In emacs I configured the connection to local MySQL, using 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)

So, every time I click F10, I get MySQL shell.

Is it possible to tune sql-mysql, so it connected to external machine via ssh and used mysql program on that machine, so I could connect from Emacs to everywhere?

Sql mode uses default-directory when it establishes the connection to the database, so if the variable is in TRAMP format, ssh (or whatever) will be used to connect to the remote host first, then use the database client locally. To automate that you can do something like

(defadvice sql-mysql (around sql-mysql-around activate)
  "SSH to linux, then connect"
  (let ((default-directory "/ssh:host.myhost.com:"))
    ad-do-it))

You can of course replace "/ssh:host.myhost.com:" with the function call that would ask you which host to connect, etc.