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

Emacs如何使用ssh隧道连接到远程MySQL,emacs,sql-mode,Emacs,Sql Mode,我有一堆远程MySQL服务器,只允许从本地主机进行连接。要连接到它们,请执行以下操作: ssh host mysql -uuser -psecret -hhost.myhost.com 在emacs中,我使用sql MySQL模式配置了与本地MySQL的连接: (setq sql-connection-alist '((pool-a (sql-product 'mysql) (sql-server "localhost") (s

我有一堆远程MySQL服务器,只允许从本地主机进行连接。要连接到它们,请执行以下操作:

ssh host
mysql -uuser -psecret -hhost.myhost.com
在emacs中,我使用sql MySQL模式配置了与本地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)
所以,每次我点击F10,我就会得到MySQL外壳


是否可以调整sql mysql,使其通过ssh连接到外部机器,并在该机器上使用mysql程序,以便我可以从Emacs连接到everywhere?

查看“sql mysql程序”到“sql mysql选项”和“sql mysql选项”。您可以将第一个绑定到“ssh”,第二个绑定到“主机mysql”。如果emacs没有在它们之间插入“sql mysql登录参数”,您将处于清除状态。如果不是这样,您需要创建一个只执行“ssh-host-mysql”的脚本,然后将“sqlmysql-program”指向该脚本


如果您需要同时使用隧道和非隧道MySQL连接,您可以考虑向“SQL产品IDER”添加一个新的元素(例如“隧道MySQL”)。当/> P> SQL模式在建立与数据库的连接时使用<代码>默认目录< /代码>,因此如果变量为TRAP格式,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连接列表中有一个新的sql默认目录选项。为每个需要它的服务器设置此选项,允许您从任何给定的服务器使用后端程序,而无需任何损坏或特定于产品的技巧。只需对连接进行如下设置:

(sql-default-directory "/host.myhost.com:")
或者,如果出于某种原因需要指定ssh:

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

它给出了一个错误“apply:Symbol的函数定义为void:sql get login”sql get login是在sql.el中定义的。你装了吗?在定义通知之前,请尝试使用(require'sql)。好的,让我们先使用更简单的选项。只需在名为“mysql\u host”的路径中创建一个shell脚本,其中包含
ssh-t您的\u host$*
。然后做一个
(setqsqlmysql程序“mysql\u host”)
。让我们知道这是否对您有效。