この文章では、Emacs上のアプリケーションからSSHを経由してネットワークにアクセスする方法を述べています。無保証です。猛犬注意。濡れていて滑ります。
ほとんどの部分は 上野さんが公開していたEmacs with SSH からのパクりです。
open-network-streamの代替関数を用意するために、まずは以下の関数を考える。
(defun open-ssh-stream-internal (&rest plist)
(let ((name (or (plist-get plist :name) name))
(buffer (or (plist-get plist :buffer) buffer))
(host (or (plist-get plist :host) host))
(service (or (plist-get plist :service) service))
(process-connection-type nil))
(start-process-shell-command
name buffer
(or (plist-get plist :ssh) "ssh")
(or (plist-get plist :sshflags) "-Caxq")
(plist-get plist :relay)
(or (plist-get plist :command) "nc -w 60")
host (format "%s" service))))
上の関数open-ssh-stream-internalはそのままでは使えない。 経由するホスト(relay-host)ごとにopen-network-streamの代替になる関数を簡単に定義するためのものだ。 relay-hostをjudy.example.comとして、 関数open-ssh-stream-judyを定義するには次のようにする。
(defun open-ssh-stream-judy (name buffer host service)
(open-ssh-stream-internal :relay "judy.example.com"
:command "nc"
:name name
:buffer buffer
:host host
:service service))
この関数open-ssh-stream-judyを利用するためには、 relay-host (judy.example.com)上に netcat がインストールされており、 relay-host (judy.example.com)にパスフレーズ入力なしでログイン可能である必要がある。 パスフレーズ無しの専用鍵を用意しても、ssh-agentやgpg-agentを使用してもよい。gpg-agentを使用する場合はemacsからsshを使用した場合でも正しく動くpinentryを選択しておくこと。
ここまでで定義した関数を、各アプリケーションで open-network-streamの代わりに利用すればよい。 ここでは、アプリケーション毎に具体的な設定について述べる。
riece-server-alistでの定義に:function を指定する。 :hostはrelay-hostから見たホスト名であることは言うまでもない。
(add-to-list 'riece-server-alist
'("judy" :service 6667 :host "localhost"
:function open-ssh-stream-judy))
elmo-network-stream-type-alistにSSH 用の設定を加える。
(add-hook 'wl-init-hook
(lambda ()
(add-to-list 'elmo-network-stream-type-alist
'("!judy" judy nil open-ssh-stream-judy))))
必要ならばelmo-imap4-default-stream-typeの設定も行う。 default-stream-typeを変更した場合にopen-network-streamを使いたい場合は、 フォルダ指定時に!directを使うと便利である。
(setq elmo-imap4-default-stream-type 'judy)
POPの場合も同様にelmo-pop3-default-stream-typeを変更する。
(setq elmo-pop3-default-stream-type 'judy)
smtp-open-connection-functionを設定する。
(setq smtp-open-connection-function #'open-ssh-stream-judy)
QMTPを利用したい場合には、同様にqmtp-open-connection-functionを設定する。
(setq qmtp-open-connection-function #'open-ssh-stream-judy)
navi2ch-open-network-stream-functionを設定する。
(setq navi2ch-open-network-stream-function #'open-ssh-stream-judy)
他のアプリケーションでSSHを使うつもりがまったくなく、 navi2chでだけSSHを使いたい。 そんな場合には、自前で用意した代替関数(open-ssh-stream-judy)の代わりに navi2ch-open-network-stream-via-commandを使ってもよい。
(setq navi2ch-open-network-stream-function #'navi2ch-open-network-stream-via-command)
(setq navi2ch-open-network-stream-command
(lambda (host service)
(list "ssh" "-ax" "judy.example.com"
"nc" (format "%s" host)
(format "%s" service))))
上野乃毅さんのEmacs with SSH がなければ、そもそもこの文書は存在していないでしょう。 大部分のヒントをいただいたことに感謝します。
© 2004 TAKAHASHI Kaoru