org-babelおよびリモートsqlコマンド


8

私はorg-babelを使って文字通りプログラミングを行っていますが、とても便利だと思います。リモートホストでシェルコマンドを実行でき、postgresクライアントでローカルデータベースコマンドを実行できます。postgresユーザーとしてファイルを開くには、次のようになります。

C-x C-f /sshx:user@remotehost|sudo:postgres@remotehost:/tmp/testfile

Emacs 24.5.1でこれを行うには、以下を追加する必要があります。

(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))

これまでのところ、リモートサーバーでpostgresql(または選択した場合はmysql)コマンドを実行する方法を理解できていません。データベースサーバーはネットワーク経由で直接アクセスできません。リモートホストにsshし、postgresユーザーとしてsuする必要があります。そうすれば、psqlクライアントを介してコマンドを実行できます。

どのようにこのようなコマンドを使用できますか?

#+BEGIN_SRC sql :engine postgresql :ExtraParametersIfNeeded
SELECT * from pg_database
#+END_SRC

リモートホスト上で?私は:dirスイッチを知っていますが、これまでのところシェルスクリプトにしか使用できません。

どうもありがとう!


1
いくつかのSSHトンネリングを実行できます... データベースのポートが何であってもssh yourbox -L7590:127.0.0.1:7590、「7590」を「」に置き換えるようなものを実行します。次に、Org babelブロックで、 " :cmdline"ヘッダー引数を使用してコマンドライン引数を設定し、データベースポートを設定できます。全体は、Orgファイルの先頭に次のように表示される場合があります: " #+PROPERTY: header-args:sql :engine mysql :dbhost 127.0.0.1 :dbuser someone :dbpassword somepassword :database database :cmdline -P7590 "。それを実行した後C-c C-c、そのようなバッファーでSQLブロックを使用できます。
Archenoth、2015

こんにちは、私はそれについて考えました、そして私も他に方法を見つけることができませんでした。答えていただければ、喜んでお受けいたします。
KookieMonster 2015

ええと...私はそれをコメントとして投稿しました。なぜなら、それはあなたの問題を解決しますが、あなたの質問には実際には答えないからです。Emacs側では何も変更されていません。Emacsにヘッダー引数または任意の設定を通じてプロセス全体を制御させるのではなく、データベースに直接アクセスできるように、SSHトンネルを手動で作成するだけなので、答えはないと思いますそれ。たぶん、誰か他の誰かがOrg-babelにこのトンネルを手動で変更することなく作成するように伝える方法を知っています。
Archenoth、2015

回答:


4

Emacstrampの更新が原因で現在機能しているかどうかはわかりませんが、回答を探している人に受け入れられる解決策や正確なコードスニペットがないため、Emacs 25で機能するソリューションを提供しますそして最近のorg-modetramp

あなたはすでにあなたの質問で提案されているように、:dirちょうどあなたの取る、ソリューションですSRCのセクションを、あなたがにファイルを開くために使用したのと同じ文字列を追加します:dirarugment。これはトランプが箱から出してできるものなので、SSHトンネルを実行する必要はありません。

#+BEGIN_SRC sql :engine postgresql :dir /sshx:user@remotehost|sudo:postgres@remotehost:
SELECT * FROM pg_database
#+END_SRC

ただ検索して返すだけです:

#+RESULTS:
| datname             | datdba | encoding | datcollate  | datctype    | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace | datacl                              |
|---------------------+--------+----------+-------------+-------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-------------------------------------|
| postgres            |     10 |        6 | C.UTF-8     | C.UTF-8     | f             | t            |           -1 |         12408 |          545 |          1 |          1663 |                                     |
| template0           |     10 |        6 | C.UTF-8     | C.UTF-8     | t             | f            |           -1 |         12408 |          545 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres} |

1
これがemacs 26(.1)、org 9.1.9、tramp 2.3.3.26.1でも機能することを確認
Andrea Reina

2

私は組織ユーザーではないので、トランプの観点からしか答えることができません。add-to-listファイル名にアドホックマルチホップを使用しているため、上記のTramp設定は必要ありません(フォーム)。だから私は単純な:dir "/sshx:user@remotehost|sudo:postgres@remotehost:/path/to/dir"仕事をすべきだと思います。


コメントありがとうございます。(:dirコマンドを使用して)シェルスクリプトを実行するために、「sudoはローカルホストでのみ許可されています」というスタイルのメッセージが表示されるため、上記の行を使用する必要がありました。
KookieMonster 2015

そうです、トランプには微妙なエラーがあります。私は次のコードスニペットで問題を再現でき#+BEGIN_SRC sh :dir /ssh:remotehost|sudo:postgres@remotehost:/tmp whoami #+END_SRC ます:回避策として、次の ような(テストされていない)ことができます:#+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
Michael Albinus '27
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.