Estoy usando org-babel para hacer programación literaria y me parece muy conveniente. Puedo ejecutar comandos de shell en hosts remotos y comandos de bases de datos locales con el cliente postgres. Para abrir un archivo como usuario de postgres, se vería, por ejemplo, como
C-x C-f /sshx:user@remotehost|sudo:postgres@remotehost:/tmp/testfile
Para hacerlo en Emacs 24.5.1, necesitaba agregar:
(require 'tramp)
(add-to-list 'tramp-default-proxies-alist
'(nil "\\`postgres\\'" "/ssh:%h:"))
(add-to-list 'tramp-default-proxies-alist
'((regexp-quote (system-name)) nil nil))
Hasta ahora, no he podido entender cómo se podría ejecutar un comando postgresql (o mysql si así lo desea) en un servidor remoto. No se puede acceder al servidor de la base de datos directamente a través de la red, tengo que ingresar ssh en el host remoto, su como usuario de postgres y luego puedo ejecutar comandos a través del cliente psql.
¿Cómo podría uno usar tal comando?
#+BEGIN_SRC sql :engine postgresql :ExtraParametersIfNeeded
SELECT * from pg_database
#+END_SRC
En un host remoto? Conozco el interruptor: dir, pero hasta ahora solo he podido usarlo para scripts de shell.
¡Muchas gracias!
ssh yourbox -L7590:127.0.0.1:7590
" reemplazar el "7590
" con cualquier puerto en el que esté tu base de datos. Luego, en su bloque Org babel, puede usar el ":cmdline
" argumento de encabezado para establecer un argumento de línea de comando para establecer el puerto de la base de datos. Todo esto podría verse más o menos así en la parte superior de su archivo Org: "#+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590
". Después deC-c C-c
eso, puede usar cualquier bloque SQL en su búfer así.Respuestas:
No estoy seguro de si está funcionando ahora debido a las actualizaciones en Emacs y vagabundo , pero como no hay una solución aceptada ni un fragmento exacto de código para aquellos que buscan una respuesta, les estoy proporcionando una que funciona en Emacs 25 y reciente org-mode y vagabundo .
Como ya propuso en su pregunta, esta
:dir
es la solución, simplemente tome su sección src y agregue la misma cadena que usó para abrir archivos a la:dir
resolución. No hay necesidad de hacer un túnel SSH, ya que esto es algo que el vagabundo puede hacer de inmediato.Trabajando solo encuentra y devuelve:
fuente
No soy un usuario de la organización, por lo que solo puedo responder desde el punto de vista de Tramp. La configuración de Vagabundo que ha mostrado anteriormente no es necesaria (
add-to-list
formularios), ya que está utilizando saltos múltiples ad-hoc en su nombre de archivo. Así que supongo que un simple:dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"
debería hacer el trabajo.fuente
#+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp
whoami
#+END_SRC
Como solución alternativa, podría hacer algo como esto (no probado):#+BEGIN_SRC emacs-lisp
(progn
(require 'tramp)
(add-to-list 'tramp-default-proxies-alist '(nil "\`root\\'" "/ssh:%h:")))
#+END_SRC
#+BEGIN_SRC sh :dir /sudo:remotehost:/tmp
whoami
#+END_SRC