Я часто использую 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 это просто запускает подпроцесс, поэтому терминал становится очень ограниченным (например, нет автодополнения пути).
Как настроить Eshell для подключения к запущенному dtach
сеансу при подключении к удаленному серверу?
РЕДАКТИРОВАТЬ: Когда я снова подумал об этой проблеме, я понял, что не совсем понятно, что я на самом деле хочу. Вот список:
- Я хочу остаться в eshell, а не в каком-то подпроцессе
- после повторного подключения я хочу, чтобы вывод удаленного сеанса был воспроизведен, а история удаленных команд была доступна
- Я хочу иметь возможность взаимодействовать с запущенным удаленным процессом (например, с
yum install
ожидающим моего ввода)
Кажется, мне нужно написать немного кода elisp, чтобы все это работало с dtach.
eshell
линии между тем, что местные и что такое дистанционное и что является внешней командой и Elisp функции размыты. Я бы хотел сделать его еще более размытым, чтобы с удаленно работающими процессами можно было прозрачно взаимодействовать, как если бы они были локальными. Я думаю, это было бы почти то же самое, что «возобновление» сеанса бега.
screen
внутри shell-mode
не будет работать хорошо, потому что screen
нужно больше, чем тупой терминал.
eshell
то есть с оболочкой - так что концептуально мне кажется, что вы не можете делать то, что хотите, если вы не обращаетесь к работающему emacs с буфером eshell в сеансе dtach. Или я здесь ошибаюсь?