1

My default-directory is: /ssh:lawlist@12.34.567.89#2222:/home3/lawlist

My .authinfo file contains: machine 12.34.567.89 login lawlist password abcdefg

The above-combination works just fine. However, I would like to remove #2222 from the default-directory and add port 2222 to my .authinfo file.

If I remove #2222 from the default-directory and add port 2222 to my .authinfo file, neither Eshell nor Dired permit me to login to the remote server.

Eshell:

Waiting for prompts from remote shell ...
Timeout reached, see buffer `*tramp/ssh lawlist@12.34.567.89*` for details.

Q:  How can I remove #2222 from my default-directory and force Eshell and/or Dired to extract port 2222 from my .authinfo file?


EDIT: The following is rough draft to add this new feature. A maintainer of Tramp, @Michael Albinus, has suggested that this may break other aspects of Tramp and he has invited a discussion on tramp-devel@gnu.org regarding this issue.

  1. Ensure you are using a version of Emacs containing the December 17, 2015 bug fix to auth-source-ensure-strings that was resolved by commit 9384953: https://github.com/jwiegley/emacs/commit/938495317a02b06a6c512832d0c6d9530fcd7f2b

  2. Define the following function:

(defun get-auth-info (host user &optional port)
  (let ((info (nth 0 (auth-source-search
                      :host host
                      :user user
                      :port port
                      :require '(:user :secret)
                      :create t))))
    (if info
       (let* ((port (plist-get info :port))
              (secret-maybe (plist-get info :secret))
              (secret
                (if (functionp secret-maybe)
                  (funcall secret-maybe)
                  secret-maybe)))
           (list port secret))
       nil)))
  1. Comment out :port tramp-current-method in tramp-read-passwd. tramp-current-method is "ssh" and this prevents auth-source-search from returning a result if .authinfo contains a specified port other than ssh; e.g., port 2222.

  2. Within tramp-maybe-open-connection, comment out and replace this section as follows:

  ;; (when (string-match tramp-host-with-port-regexp l-host)
  ;;   (setq l-port (match-string 2 l-host)
  ;;         l-host (match-string 1 l-host)))

  (cond
    ((string-match tramp-host-with-port-regexp l-host)
      (setq l-port (match-string 2 l-host)
            l-host (match-string 1 l-host)))
    ((and l-host l-user)
      (let ((port (car (get-auth-info l-host l-user))))
        (when port
           (setq l-port port)))))
lawlist
  • 18,826
  • 5
  • 37
  • 118

2 Answers2

1

In auth-source.el, the port specification for Tramp is redefined. It must contain the Tramp method name, you cannot define the port number ssh is using.

Instead, I recommend to use a proper entry in ~/.ssh/config:

Host 12.34.567.89
    Port    2222

Of course, you could add other attributes like HostName and User.

Michael Albinus
  • 6,647
  • 14
  • 20
  • Whenever you have some time, it would be wonderful if you could please take a look at my proposed solution (to add this new feature) in the edited question above and let me know what you think. – lawlist Mar 09 '17 at 18:44
  • I see. However, it will break existing code, so I doubt it will go into the main branch of Emacs / Tramp. If you want to discuss your solution in detail, we'll better move to the Tramp ML `tramp-devel@gnu.org`. – Michael Albinus Mar 09 '17 at 19:02
  • Thank you for taking a look at the proposed new feature -- I had a feeling it might break something that I was unaware of, which is why I did not want to post an alternative answer. I would be happy to launch a feature request / discussion and will put this on my todo-list, but I have some work-related projects to attend to at the moment. In the meantime, I will mark your answer as correct and put a notation in the edited question cautioning that this was a draft that the Tramp maintainer believes may break other aspects of of Tramp. – lawlist Mar 09 '17 at 19:07
0

TRAMP doesn't look for port numbers in the authinfo file; you can see the function tramp-parse-netrc-group for details. It looks like you could modify tramp-host-regexp, but I don't know off-hand if that would work out; later users of that information might fail if it's not just a hostname.

db48x
  • 15,741
  • 1
  • 19
  • 23