在 Windows 上使用 plink 时,如何更改 Emacs 中 TRAMP 发送的命令?

How do I change the command sent by TRAMP in Emacs when using plink on Windows?

我的 .emacs 中有以下内容:

(require 'tramp)
(setq tramp-default-method "plink")

当我在 Emacs 中 运行 C-x C-f /plink:some_session:/ 时,其中 some_session 是 PuTTY 中定义的会话(它保存了所有信息,例如私钥位置、用户名、连接类型=ssh等),tramp 发出以下命令(从 *Messages* 缓冲区复制):

Tramp: Sending command ‘plink -ssh -t some_session " env 'TERM=dumb' 'PROMPT_COMMAND=' 'PS1=#$ ' /bin/sh " && exit || exit’

您可以看到它将 -ssh 标志传递给了 plink。当我连接到需要端口 22 上的 ssh 连接的远程主机时,一切正常。

但是,我有一个远程主机,我需要连接到端口 2222。如果我在 PuTTY 中保存一个会话 (some_new_session) 并尝试使用以下命令(或 PuTTY gui)进行连接这是发生了什么:

我调试了这个问题,发现当 -ssh 标志传递给 plink 时,它会尝试连接端口 22,即使保存的会话状态为使用端口 2222。本质上当给定 -ssh 它会忽略保存在会话中的端口(感觉像是一个错误)。

如果我尝试在 Emacs 中使用 C-x C-f /plink:some_new_session:/ 进行连接,发出的命令是:

Tramp: Sending command ‘plink -ssh -t some_new_session " env 'TERM=dumb' 'PROMPT_COMMAND=' 'PS1=#$ ' /bin/sh " && exit || exit’

我实际上不需要-ssh标志,因为SSH连接类型保存在PuTTY会话中。此外,-ssh 标志强制连接通过端口 22,即使会话已将其保存为端口 2222。

我的问题是:

如何更改 tramp 发出的命令,使其不使用 -ssh 标志调用 plink?

我怀疑修改以下内容可以解决问题。我在这里设置的值只是 "plink" 方法的默认 tramp-login-args 值。

n.b。使用 plink 的其他标准流浪汉方法是:"psftp"、"pscp" 和 "plinkx".

(eval-after-load "tramp"
  '(setf (cadr (assq 'tramp-login-args (cdr (assoc "plink" tramp-methods))))
         '(("-l" "%u") ("-P" "%p") ("-ssh") ("-t") ("%h") ("\"")
           ("env 'TERM=dumb' 'PROMPT_COMMAND=' 'PS1=#$ '") ("/bin/sh") ("\""))))

plink 方法旨在使用主机名。如果您想(重复使用)一个会话,请使用 plinkx,例如 C-x C-f /plinkx:some_session:/C-x C-f /plink:some_new_session:/