私はしばしば、GNU Screenを使用して、リモートセッションを存続させます。私はEmacsに住んでいるので、実行中のリモートシェルセッションをEmacs内から再開できるようにしたいと思っています。
GNU Screenは、端末の多重化や文字の描画など、私が本当に必要としないあらゆる種類の凝ったものを実装しています。私は本当に取り外し可能で再開可能なシェルセッションにのみ興味があるので、単純なものdtach
で十分かもしれません。
この関数を使用してSSHセッションを開き、実行dtach
中のセッションに再接続しますshell-mode
(ここから取得):
(defun ssh-dtach (host)
"Open SSH connection to remote host and attach to dtach session."
(interactive)
(let ((explicit-shell-file-name "dtach")
(explicit-dtach-args '("-A" "/tmp/emacs.dtach" "-z"
"/bin/bash" "--noediting" "-login"))
(default-directory (format "/ssh:%s:" host)))
(shell (format "*ssh %s*" host))))
マイナーな癖にもかかわらず、これはでほぼ問題shell-mode
なく動作しますが、Eshellではこれはサブプロセスを開始するだけなので、ターミナルは非常に制限されます(パスの自動補完がないなど)。
dtach
リモートサーバーに接続したときに実行中のセッションに接続するようにEshellを構成するにはどうすればよいですか?
編集: この問題についてもう一度考えたとき、私は実際に何が欲しいのかが完全に明確ではないことに気付きました。ここにリストがあります:
- 一部のサブプロセスではなく、eshellにとどまりたい
- 再接続時に、リモートセッションの出力を再生し、リモートコマンド履歴を利用できるようにしたい
- 実行中のリモートプロセス(たとえば
yum install
、入力を待っている実行中)と対話できるようにしたい
これをすべてdtachで機能させるには、少しのelispコードを記述する必要があるようです。
で
—
rekado 2014年
eshell
どのローカルであり、どのような遠隔であり、どのような外部コマンドとelispの機能がぼやけされている間の線。リモートの実行中のプロセスがローカルであるかのように透過的に対話できるように、さらにファジーにしたいと思います。それは、実行中のセッションを「再開」することとほぼ同じだと思います。
@sds:
—
rekado 2014年
screen
内部での実行は、ダム端末以上のものを必要shell-mode
とするため、うまく機能しませんscreen
。
eshell
IS シェルと対話します。つまり、概念的には、dtachセッションでeshellバッファーを使用して実行中のemacsにアクセスしない限り、望んだことを実行できないようです。または私はここで間違っていますか?