Estou usando o org-babel para fazer programação alfabética e acho muito conveniente. Eu sou capaz de executar comandos shell em hosts remotos e comandos de banco de dados local com o cliente postgres. Para abrir um arquivo como usuário do postgres, pareceria, por exemplo,
C-x C-f /sshx:user@remotehost|sudo:postgres@remotehost:/tmp/testfile
Para fazer isso no Emacs 24.5.1, eu precisava adicionar:
(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))
Até agora, não consegui entender como se poderia executar um comando postgresql (ou mysql, se você escolher) em um servidor remoto. O servidor de banco de dados não está acessível diretamente pela rede, tenho que ssh no host remoto, su como o usuário do postgres e, em seguida, sou capaz de executar comandos através do cliente psql.
Como alguém poderia usar esse comando:
#+BEGIN_SRC sql :engine postgresql :ExtraParametersIfNeeded
SELECT * from pg_database
#+END_SRC
Em um host remoto? Conheço a opção: dir, mas até agora só consegui usá-la para scripts de shell.
Muito Obrigado!
ssh yourbox -L7590:127.0.0.1:7590
" substituir o "7590
" por qualquer porta em que seu banco de dados esteja. Em seguida, no bloco Org babel, você pode usar o:cmdline
argumento " " do cabeçalho para definir um argumento de linha de comando para definir a porta do banco de dados. A coisa toda pode ficar assim na parte superior do seu arquivo organizacional: "#+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590
". DepoisC-c C-c
disso, você pode usar qualquer bloco SQL no seu buffer assim.Respostas:
Não tenho certeza se ele está funcionando agora devido a atualizações no Emacs e tramp , mas como não há solução aceita e nenhum trecho de código exato para quem procura resposta, estou fornecendo um que esteja trabalhando no Emacs 25 e recente org-mode e vagabundo .
Como você já propôs na sua pergunta,
:dir
é a solução, basta pegar a seção src e adicionar a mesma string usada para abrir arquivos na:dir
documentação. Não há necessidade de fazer o túnel SSH, pois isso é algo que o vagabundo pode fazer imediatamente .Trabalhando basta encontrar e retornar:
fonte
Como não sou um usuário organizacional, posso responder apenas do ponto de vista do Tramp. As configurações do Tramp que você mostrou acima não são necessárias (
add-to-list
formulários), pois você está usando vários saltos ad-hoc em seu nome de arquivo. Então, suponho que um simples:dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"
deve fazer o trabalho.fonte
#+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp
whoami
#+END_SRC
Como solução alternativa, você pode fazer algo assim (não testado):#+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