【发布时间】:2020-05-09 15:44:05
【问题描述】:
iTerm2 shell integration 有一些巧妙的技巧,例如它的 it2copy 命令,即使我通过 ssh 登录到远程计算机,它也会复制到本地剪贴板。
可以用来运行任意shell命令吗?
例如,当我通过 ssh 登录时,我想执行一个命令以在我的本地计算机上打开一个编辑器。 VSCode 可以用这个命令打开一个远程目录:
code --remote ssh-remote+myserver /home/stuart/some-directory
我想从远程机器上的 ssh 会话本地触发该命令。
PS -- 我知道还有一个替代方案:创建一个(嵌套的)ssh 连接back到我的本地机器以通过 ssh 执行命令,而不是使用 iTerm2 的反向通道。但这有各种缺点,因此提出了这个问题。
我还知道 ~/.ssh/config 中的 PermitLocalCommand 选项,它允许我发送转义码 (~C),然后发送本地命令 (!code --remote ...)。但我希望有一个可以在脚本或 bash 别名中使用的解决方案。
例如,如果存在it2local,我会这样使用它:
alias code_here='it2local "code --remote ssh-remote+$(uname -n) $(pwd)"'
如果单独使用 ssh 可以做到这一点,我很想听听。
【问题讨论】:
-
所以你已经列出的是通常的方式。还有另一种可能的方法,但不会像这些那么简单。方法是使用
LocalCommand启动一个socat 服务器来监听命令。然后使用-R标志使用反向代理连接 SSH 连接。然后,您可以从远程计算机将命令发送到用于反向代理的端口。现在有很多事情需要注意,如果你打开多个ssh,动态端口。然后制作 socat 服务器,这样你列出的选项就简单多了 -
另一种方法是使用
expect自动发送~C,然后发送命令。但我找不到任何简单的文档来说明如何将~C发送到同一站点 -
感谢您的意见。 socat 服务器听起来可以工作,但设置起来也很痛苦。我喜欢你使用
expect的想法。但像你一样,我无法弄清楚这到底是如何工作的。最后,我想出了如何用 iTerm2 的方式来做。 (请参阅下面的答案。)