ssh + smtp
TSUCHIYA Masatoshi
tsuchiya @ pine.kuee.kyoto-u.ac.jp
2002年 7月 23日 (火) 16:34:33 JST
>> On Tue, 23 Jul 2002 15:55:45 +0900
>> 「山」== yamaoka @ jpl.org (Katsumi Yamaoka) said as follows:
山> これは遠隔地の SMTP サーバーに接続するのに生の SMTP コネクションを
山> 使う代わりに、まず SSH でサーバーに接続し、そこからローカルホスト
山> の SMTP ポートにつなぐというもので、こういうのってアホらしいですか?
山> またはもっとスマートな方法がありますか? というのが質問です。
ssh を使うのでしたら,何も telnet をわざわざ呼び出さなくても
port-forwarding を使うのが正しい解じゃないかなあ,と思う次第です.
山> 実はこういう接続では改行が CRLF ではなくて LF だけになってしまうの
山> で smtp.el を少し改造する必要があるのですが、それをやる価値がある
山> ものかどうかわからないのでした。
こういう弊害も避けられると思いますし.
サンプルコードを本メールの末尾に添付しました.使い方ですが,
ssh-start-proxy-connection() を呼び出して,port-forwarding による通信
経路を確立しておきます.その上で,localhost の ssh-local-port に対して,
open-network-stream() すれば,遠隔地のサーバーに安全に接続することがで
きます.
なお,同じことは既に Mew によって実現されていますから,より頑健なコー
ドを書く場合には,そちらを参考にされるといいんじゃないかと思います.
--
土屋 雅稔 ( TSUCHIYA Masatoshi )
(defvar ssh-command "ssh")
(defvar ssh-local-port 8025)
(defvar ssh-connection-wait-flag nil)
(defun ssh-start-proxy-connection (ssh-server remote-server remote-port)
(with-current-buffer (generate-new-buffer " *ssh*")
(let ((proc (start-process
"ssh"
(current-buffer)
ssh-command
ssh-server
"-n" "-x" "-o" "BatchMode yes"
(format "-L%d:%s:%d" ssh-local-port remote-server remote-port)
"echo ssh_proxy_connection_established; sleep 300")))
(set (make-local-variable 'ssh-connection-wait-flag) t)
(set-process-filter proc 'ssh-proxy-connection-filter)
(set-process-sentinel proc 'ssh-proxy-sentinel)
(while ssh-connection-wait-flag
(sit-for 0.1))
(goto-char (point-min))
(if (search-forward "bind: Address already in use" nil t)
(progn
(setq ssh-local-port (1+ ssh-local-port))
(ssh-start-proxy-connection ssh-server remote-server remote-port))
ssh-local-port))))
(defun ssh-proxy-connection-filter (process string)
(when (buffer-name (process-buffer process))
(with-current-buffer (process-buffer process)
(let ((buffer-read-only nil)
(case-fold-search nil))
(goto-char (process-mark process))
(insert string)
(set-marker (process-mark process) (point))
(when (search-backward "ssh_proxy_connection_established" nil t)
(setq ssh-connection-wait-flag nil))))))
(defun ssh-proxy-sentinel (process event)
(when (buffer-name (process-buffer process))
(let ((buffer (process-buffer process)))
(delete-process process)
(kill-buffer buffer))))
More information about the Emacs-mime-ja
mailing list