Как я могу сказать БРОДЯГЕ Emacs использовать определенные аргументы ssh?

Я пытаюсь настроить своего БРОДЯГУ Emacs для доступа к удаленным файлам через ssh, и я хотел бы добавить, что некоторые дополнительные аргументы ssh управляют, чтобы бродяга использовал для соединения. Существует ли способ сделать это?

Я мог сделать это путем прямого управления переменной tramp-methods, но это неприглядно.

7
задан 30.11.2010, 23:57

2 ответа

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


Править: Вот мое решение, согласно просьбе.

Теперь, настройте некоторые функции для добавления к встроенным спискам аргументов, сохраненным в tramp-methods:

(defun tramp-get-method-parameter (method param)
  "Return the method parameter PARAM.
If the `tramp-methods' entry does not exist, return NIL."
  (let ((entry (assoc param (assoc method tramp-methods))))
    (when entry (cadr entry))))

(defun tramp-set-method-parameter (method param newvalue)
  "Set the method paramter PARAM to VALUE for METHOD.

If METHOD does not yet have PARAM, add it.
If METHOD does not exist, do nothing."
  (let ((method-params (assoc method tramp-methods)))
    (when method-params
          (let ((entry (assoc param method-params)))
        (if entry
            (setcar (cdr entry) newvalue)
          (setcdr (last method-params) '(param newvalue)))))))

(defun tramp-add-args (programs newargs)
  "Append NEWARGS to the argument list for any of PROGRAMS in `tramp-methods'.

PROGRAMS can be a list of strings, or a single string."
  ;; Allow a single program string or a list of matching programs.
  (when (stringp programs)
    (setq programs (list programs)))
  (message "%s" (list programs newargs))
  (loop for method in (mapcar 'car tramp-methods) do
        (let ((login-program (tramp-get-method-parameter method 'tramp-login-program))
              (copy-program (tramp-get-method-parameter method 'tramp-copy-program))
              (login-args (tramp-get-method-parameter method 'tramp-login-args))
              (copy-args (tramp-get-method-parameter method 'tramp-copy-args)))
          (message "Handling %s" method)
          (message "  Handling login program %s" login-program)
          (when (find login-program programs :test 'string=)
            (message "    Adding to login program %s" login-program)
            (tramp-set-method-parameter method 'tramp-login-args (append login-args newargs)))
          (message "  Handling copy program %s" login-program)
          (when (find copy-program programs :test 'string=)
            (message "    Adding to copy program %s" copy-program)
            (tramp-set-method-parameter method 'tramp-copy-args (append copy-args newargs))))))

Наконец, использовать tramp-add-args для добавления аргументов, Вы хотите ко всем находящимся в ssh методам:

(tramp-add-args
 '("scp" "scp1" "scp2" "scp1_old" "scp2_old" "sftp" "rsync" "ssh" "ssh1" "ssh2" "ssh1_old" "ssh2_old" "scpx" "sshx")
 '(("-o" "ControlPath=~/.ssh/control/emacs-master-%%r@%%h:%%p" "-o" "ControlMaster=auto")))

Премия вокруг

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

Во-первых, создайте названный сценарий ssh-cleanup и вставленный в него Ваш $PATH и помещенный следующее в него:

#!/bin/sh
CONTROL_DIR="$HOME/.ssh/control"
find "$CONTROL_DIR" -type s | xargs --no-run-if-empty -- rm -f

Этот сценарий очищает устаревшие файлы управления, так как они будут оставлены позади, когда ssh умрет, потому что Вы отключили свой сетевой кабель или разъединили Вашу беспроводную связь.

Теперь настроенный emacs для запущения этого скрипта в appripriate время:

(defun ssh-cleanup ()
  (ignore-errors
    (call-process "ssh-cleanup")))

(defadvice tramp-cleanup-all-connections (after cleanup-control-files activate)
  (ssh-cleanup))

Теперь, когда Вы работаете tramp-cleanup-all-connections, Вы также очистите каталог сокета ssh. Необходимо выполнить это каждый раз, когда Вы разъединяетесь и снова соединяетесь с Интернетом.

Или, Вы могли настроить свой компьютер, чтобы сделать это для Вас автоматически.

Супер премия вокруг

При использовании Администратора сети на Linux у Вас может быть emacs, делают вещи для Вас, когда Вы соединяетесь или разъединяетесь.

(defcustom network-manager-connect-hook nil
  "List of functions to execute upon successful establishment of
  a network connection."
  :type 'hook
  :group 'network-manager)

(defcustom network-manager-disconnect-hook nil
  "List of functions to execute upon disconnection from the
  network."
  :type 'hook
  :group 'network-manager)

;; Only enable all of this if dbus is found
(when (require 'dbus nil nil)

  (defun network-manager-dbus-signal-handler (nmstate)
    "Execute the appropriate hook when Network Manager connects or
  disconnects."
    (case nmstate
      ((4 1) (run-hooks 'network-manager-disconnect-hook))
      (3 (run-hooks 'network-manager-connect-hook))))

  (defvar network-manager-dbus-registration nil)

  (defun network-manager-integration-enable ()
    (interactive)
    (network-manager-integration-disable) ; Make sure to clean up first
    (setq network-manager-dbus-registration
          (dbus-register-signal :system
                                "org.freedesktop.NetworkManager" "/org/freedesktop/NetworkManager"
                                "org.freedesktop.NetworkManager" "StateChanged"
                                'network-manager-dbus-signal-handler)))

  (defun network-manager-integration-disable ()
    (interactive)
    (when network-manager-dbus-registration
      (dbus-unregister-object network-manager-dbus-registration)
      (setq network-manager-dbus-registration nil)))

  ;; Finally, enable it
  (network-manager-integration-enable))

Теперь добавьте набор tramp-cleanup-all-connections работать, когда Вы разъединяетесь.

(add-hook 'network-manager-disconnect-hook 'tramp-cleanup-all-connections)
5
ответ дан 07.12.2019, 15:05

Для одноразового использования я не могу думать об удобном способе.

Для более постоянной установки реализуйте свою конфигурацию на ssh уровне (который имеет дополнительную льготу рабочих за пределами Emacs также). В Вашем ~/.ssh/config, определите псевдоним хоста с дополнительными опциями и соединитесь с псевдонимом с Бродягой. Например, в ~/.ssh/config:

Host foo
HostName foo.example.com
User rt
ProxyCommand /usr/bin/nc -X connect -x proxy:3128 %h %p

Затем открытый /ssh:foo:/path/to/file в Emacs.

1
ответ дан 07.12.2019, 15:05

Теги

Похожие вопросы