在 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)进行连接这是发生了什么:
- 使用 PuTTY GUI
- 工作正常
plink some_new_session
- 由
cmd.exe
发布 - 工作正常并且能够连接
plink -ssh some_new_session
- 发自
cmd.exe
- 无效
我调试了这个问题,发现当 -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:/
。
我的 .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)进行连接这是发生了什么:
- 使用 PuTTY GUI
- 工作正常
plink some_new_session
- 由
cmd.exe
发布 - 工作正常并且能够连接
- 由
plink -ssh some_new_session
- 发自
cmd.exe
- 无效
- 发自
我调试了这个问题,发现当 -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:/
。