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

7

我有一堆远程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 shell。

是否可以调整sql-mysql,使其通过ssh连接到外部机器并使用该机器上的mysql程序,这样我就可以从Emacs连接到任何地方?

3个回答

11

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:"替换为该函数调用的结果。


它会出现一个错误:“apply: Symbol's function definition is void: sql-get-login” - user4035
sql-get-login在sql.el中定义。您是否加载了它?在定义建议之前,请尝试(require 'sql)。 - Alex Vorobiev

2
自 Emacs 25.1 开始,sql-connection-alist 中有一个新的 sql-default-directory 选项。为每个需要它的服务器设置此选项允许您在没有任何 defadvice 或产品特定技巧的情况下使用来自任何给定服务器的后端程序。只需像以下设置连接即可:
(sql-default-directory "/host.myhost.com:")

或者,如果由于某些原因需要指定ssh:

(sql-default-directory "/ssh:host.myhost.com:")

(setq sql-default-directory "/host.myhost.com:") 工作得非常完美,谢谢! - Peter Becich

2

请看 '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”)。


好的,我们先选择更简单的选项。只需在您的路径中创建一个名为“mysql_host”的shell脚本,其中包含ssh -t your_host $*。然后执行(setq sql-mysql-program "mysql_host")。如果这对您有用,请告诉我们。 - juanleon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接