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