2012-05-08 6 views
6

Несколько вопросов, в том числе this, обсудите аспекты, относящиеся к соединениям ssh из Emacs. Я не нашел ответа на свой вопрос: Как я могу ssh на удаленную машину из Emacs?Удаленное соединение ssh изнутри Emacs

Я не хочу редактировать файл на удаленной машине из Emacs. Я знаю M-xshell, который открывает оболочку на моем локальном компьютере, и мне известно использование TRAMP для редактирования файла по ssh на удаленной машине. Однако ни одна из них не связана с этим вопросом.

(вместо голосования, чтобы закрыть, может перенести вопрос на другой сайт.)

Edit: Относящиеся обсуждение here.

+0

Оба «M-x shell» и Tramp * do * относятся к вашему вопросу, как указано. Поэтому, пожалуйста, объясните конкретно, что это такое, чего они не делают. Я понимаю, что вы хотите сделать больше, чем позволяет Tramp, но что вы хотите сделать, чтобы «M-x shell» не позволял вам делать? – Stefan

+0

Я хочу ввести 'M-x ssh' или что-то подобное для создания ssh-соединения, например, я могу набрать' M-x sql-postgresql', чтобы создать соединение непосредственно с базой данных. 'M-x shell' просто открывает оболочку, из которой I * может * ssh или что-то еще. Я спрашивал, есть ли способ ssh * напрямую * из Emacs. – SabreWolfy

+0

Что вы на самом деле хотите сделать с помощью ssh, который не редактирует удаленные файлы или не открывает удаленный терминал? – Tyler

ответ

9

Во-первых, я не знаю собственного клиента elisp ssh (и не думаю, что есть много мотивации для написания одного), поэтому вам обязательно нужно будет взаимодействовать с внешним процессом ssh-клиента.

Как вы хотите использовать ssh интерактивно, для процесса ssh требуется терминал на локальной стороне соединения.

Вопрос поэтому: Будет ли Emacs реализовывать терминал, к которому может быть присоединен процесс ssh?

Ответ: yes - term.el обеспечивает надежную реализацию терминала, через которую ssh можно запускать напрямую, без требования к оболочке.

Если запустить M-хtermRET вам будет предложено ввести программу. (По умолчанию используется оболочка, но это, конечно, не единственный тип процесса, который вы можете запустить.)

По неизвестным причинам интерактивные функции termansi-term) не поддерживают передачу аргументов указанной программе, которая отображает они менее полезны, если вы хотите запустить что-то вроде ssh [email protected]. Вместо этого вы можете указать скрипт, который обрабатывал аргументы, но мы можем управлять этим также в elisp:

Функция term на самом деле является простой оболочкой, которая вызывает make-term, чтобы запустить программу, а затем устанавливает соответствующие режимы. Поскольку make-termделает принимает аргументы программы, довольно просто скопировать и изменить определение term в соответствии с вашими собственными целями.

Вот очень простая реализация:

(defun my-ssh (user host port) 
    "Connect to a remote host by SSH." 
    (interactive "sUser: \nsHost: \nsPort (default 22): ") 
    (let* ((port (if (equal port "") "22" port)) 
     (switches (list host "-l" user "-p" port))) 
    (set-buffer (apply 'make-term "ssh" "ssh" nil switches)) 
    (term-mode) 
    (term-char-mode) 
    (switch-to-buffer "*ssh*"))) 

или, возможно, это предпочтительнее:

(defun my-ssh (args) 
    "Connect to a remote host by SSH." 
    (interactive "sssh ") 
    (let ((switches (split-string-and-unquote args))) 
    (set-buffer (apply 'make-term "ssh" "ssh" nil switches)) 
    (term-mode) 
    (term-char-mode) 
    (switch-to-buffer "*ssh*"))) 

Очевидно, есть возможности для улучшения, но я думаю, что это довольно полезно, как есть.

Вы должны убедиться в том, что вы были в курсе событий term-mode.См:

  • M-:(info "(emacs) Terminal emulator")RET
  • М-:(info "(emacs) Terminal Mode")RET
  • С-чеterm-modeRET
+0

Как указать порт? Я сделал некоторые изменения в вашем примере, но я не могу найти, где указать «-p PORT». У меня нет информационных страниц, поэтому мне придется искать это в другом месте. – SabreWolfy

+0

Я добавил аргумент порта.Как вы установили Emacs? Отсутствие доступных справочных руководств является значительным недостатком. – phils

+0

Спасибо. Оба примера работают для меня сейчас. – SabreWolfy

1

Я не уверен, что понимаю. Откройте M-x ansi-term и запустите ssh [email protected]?

+0

Итак, у Emacs нет программы оболочки, которую мы должны использовать? Решение состоит в том, чтобы просто сделать оболочку (даже с «M-x shell»), а затем просто ssh оттуда? Я сравниваю его с режимом Emacs SQL, где Emacs сам делает удаленное соединение. – SabreWolfy

+0

В Elisp есть оболочка, называемая eshell, если это то, что вы имеете в виду. –

+1

Правильно, есть много реализаций оболочки, но AFAIK не существует реализации клиента ssh. – Mario

2

Оказывается, есть то, что вы хотите:

(setq rlogin-program "ssh") 
(setq rlogin-process-connection-type t) 

, а затем M-x rlogin RET <myhost> RET будет делать это.

+0

Как указать имя пользователя, пароль и порт? Ни 'M-x rlogin RET RET', ни' M-x rlogin RET <имя_пользователя @ хост: порт> RET' работал. http://emacswiki.org/emacs/RloginMode не был полезен. – SabreWolfy

+0

Те не работают, потому что ни 'ssh host username', ни' ssh username @ host: port' являются действительными вызовами. Вы можете использовать 'username @ host -p port' или' host -l username -p port'. Или используйте '(setq rlogin-explicit-args '(" -l "" username "" -p "" port "))'. Конечно, вам вообще не нужно будет указывать порт. Проверьте 'C-h f rlogin'. Поскольку 'rlogin' использует' comint-mode', вам также может понадобиться «ansi-color-for-comint-mode-on». – phils

+0

Я нахожу подход 'term' с' term-char-mode' немного более твердым, чем это. В частности, завершается завершение TAB в удаленной оболочке. Когда дело доходит до оболочек, 'comint' кажется более ориентированным на локальные, чем удаленные, тогда как' term' не делает никаких таких предположений. – phils

1

Возможно, ssh.el - это то, что вы ищете. Команда ssh обеспечивает одноэтапный способ создания удаленных оболочек в Emacs через ssh, включая естественное определение имени пользователя и включение отслеживания каталога tramp, если это необходимо.

Смежные вопросы