Подключите к запущенной удаленной оболочке с помощью eshell / TRAMP / dtach

11

Я часто использую 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.

rekado
источник
Режим оболочки взаимодействует с процессом оболочки, eshellто есть с оболочкой - так что концептуально мне кажется, что вы не можете делать то, что хотите, если вы не обращаетесь к работающему emacs с буфером eshell в сеансе dtach. Или я здесь ошибаюсь?
Том Регнер
В eshellлинии между тем, что местные и что такое дистанционное и что является внешней командой и Elisp функции размыты. Я бы хотел сделать его еще более размытым, чтобы с удаленно работающими процессами можно было прозрачно взаимодействовать, как если бы они были локальными. Я думаю, это было бы почти то же самое, что «возобновление» сеанса бега.
rekado
@sds: работа screenвнутри shell-modeне будет работать хорошо, потому что screenнужно больше, чем тупой терминал.
Рекадо

Ответы:

2

Возможно, неудовлетворительно, но эта проблема есть в списке желаний Бродяги. Возможно, это когда-нибудь будет реализовано.

Смотрите обсуждение Emacs Devel ML http://thread.gmane.org/gmane.emacs.devel/174131

Майкл Альбинус
источник