Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Emacs から SSH をコキ使う
[go: Go Back, main page]

Emacs から SSH をコキ使う

まえおき

この文章では、Emacs上のアプリケーションからSSHを経由してネットワークにアクセスする方法を述べています。無保証です。猛犬注意。濡れていて滑ります。

ほとんどの部分は 上野さんが公開していたEmacs with SSH からのパクりです。

準備

open-network-stream の代替

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

riece-server-alistでの定義に:function を指定する。 :hostはrelay-hostから見たホスト名であることは言うまでもない。

(add-to-list 'riece-server-alist
      '("judy" :service 6667 :host "localhost"
         :function open-ssh-stream-judy))

Wanderlust

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)
    

FLIM

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

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

その他の手段

References

謝辞

上野乃毅さんのEmacs with SSH がなければ、そもそもこの文書は存在していないでしょう。 大部分のヒントをいただいたことに感謝します。

© 2004 TAKAHASHI Kaoru
$Date: 2008-03-05 10:29:38 +0900 (Wed, 05 Mar 2008) $