2013-06-22 2 views
6

У меня есть куча удаленных серверов MySQL, которые разрешают подключение только с localhost. Для того, чтобы подключиться к ним я следующее:Emacs как использовать туннель ssh для подключения к удаленному MySQL

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

В Emacs Я настроил подключение к локальной MySQL, используя SQL-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 во все стороны?

ответ

10

Режим Sql использует default-directory, когда он устанавливает соединение с базой данных, поэтому, если t его переменная находится в формате 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:" с вызовом функции, которая будет просить вас, какой хост для подключения и т.д.

+0

Он дает ошибку "apply: определение функции Symbol void: sql-get-login" – user4035

+0

sql-get-login определяется в sql.el. Вы загрузили его? Попробуйте (требуется «sql») до определения совета. –

+0

Я не загрузил его. Теперь он работает – user4035

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

+0

Нет, я не могу это сделать. Можете ли вы дать некоторые фрагменты кода? – user4035

+0

Хорошо, давайте сначала рассмотрим более простой вариант. Просто создайте сценарий оболочки в вашем пути с именем «mysql_host», который содержит 'ssh -t your_host $ *'. Затем выполните команду '(setq sql-mysql-program" mysql_host ")'. Сообщите нам, если это сработает для вас. – juanleon

1

По состоянию на Emacs 25.1 существует новый sql- default-directory в sql-connection-alist. Установка этого для каждого сервера, который в нем нуждается, позволяет использовать бэкэнд-программу с любого сервера без каких-либо оплошностей или специальных трюков. Просто установка для вашего соединения, как:

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

Или, если вам нужно указать SSH по некоторым причинам:

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

 Смежные вопросы

  • Нет связанных вопросов^_^