SSH 参数化配置条目?

SSH 参数化配置条目?

我经常使用类似以下命令设置端口转发: ssh -NL 1234:localhost:1234 MyHostName

端口通常保持不变,但远程会发生变化。如果我可以创建如下 SSH 条目就好了:

Host VncTunnel
  HostName %arg
  LocalForward 5900 localhost:5900

然后ssh VncTunnel arg=MyHostName每当我想隧道连接到任意主机时,使用类似的方法。

有什么建议么?

答案1

以下解决方案已ssh在 OpenSSH 9.3 版中进行了测试(但它也应该适用于相当不古老的旧版本,我猜测从 7.2 开始bz#2471已修复)。对于 9.4 及更高版本,请参阅另一个答案我认为那里的解决方案是正确的。


将此代码片段粘贴到您的开头~/.ssh/config

Match exec "case $VNCT in ?) exit 0;; esac; exit 1"
  LocalForward 5900 localhost:5900

现在,如果你在环境ssh中非空的情况下运行,那么将被应用。像这样:VNCTLocalForward 5900 localhost:5900

VNCT=1 ssh -N MyHostName

该解决方案可以扩展。例如这个额外的片段:

Match exec "case $PRXY in ?) exit 0;; esac; exit 1"
  LocalForward 8080 localhost:8080

将允许您运行VNCT=1 PRXY=1 ssh -N MyHostName以启用两个转发。您可以单独启用每个转发。您可以创建更多片段。

笔记:

  • case $VNCT in ?) exit 0;; esac; exit 1不是测试变量是否为空的最简单方法。一般来说,有更简单的方法,但其中许多方法需要在 shell 代码中使用双引号。我还没有找到将"双引号值传递给 的方法Match exec,因此我决定使用casewhere无需双引号

  • 这是关于非空变量与空/未设置,因此VNCT=0也会启用相应的转发。如果您使用case $VNCT in 1) …,则VNCT=1只会启用它,其他所有值(包括VNCT=0)都不会启用。

  • 该解决方案甚至可以与ssh后台使用的脚本和工具一起使用;或者在某些情况下可能不适用。

    工具可能ssh在经过清理的环境中运行,或者使用干扰的选项运行,但如果它ssh以最直接的方式调用,那么我们的配置就会起作用,您只需将正确的变量放入环境中(例如VNCT=1 tool)。我不指望你会想以这种方式创建隧道,但你不限于LocalForward,使用我们的方法,您可以根据需要施加其他配置选项。如果工具没有提供任何选项来自定义传递给的参数,这将特别有用ssh

答案2

首先感谢 Kamil 向我介绍了 Match 的想法,如果你没有最新openssh版本的话,他的答案似乎就是可行的(这可能还不是很常见)。

经过一番研究,我发现新版本openssh最近(大约半年前)添加了标签的概念,这使得这个解决方案变得更加简单,请参阅文档ssh-config 手册页

现在~/.ssh/config您需要此配置:

Match tagged VncTunnel
    LocalForward 5900 localhost:5900

然后您可以在ssh像这样调用时使用它:

ssh -P VncTunnel MyHostName

看起来这个变化是在 9.4 版中引入的(见这里)。

答案3

虽然 gepa 提到的 OpenSSH“标签”功能可能是最棒的选项,但它仍然太新,你的系统可能还没有它,在这种情况下,我的建议是不要通过ssh首先。

您可以使用 shell 脚本、shell 函数或 shell 别名执行相同操作,而无需通过 ssh_config 实现任何所需的扭曲:

  • 例如,在 Bash ( ~/.bashrc) 中:

    alias vnctun="ssh -L 5900:localhost:5900"
    
    $ vnctun foo
       → becomes: ssh -L 5900:localhost:5900 foo
    
  • 同样在 Bash/Zsh 中使用函数(也在~/.bashrc):

    vnctun() { ssh -L 5900:localhost:5900 "$@"; }
    
  • 在 PowerShell 中 ( notepad $profile):

    Function vnctun($Name) { ssh -L 5900:localhost:5900 $Name }
    
  • 在 Windows Cmd.exe 中(自动运行):

    doskey vnctun=ssh -L 5900:localhost:5900 $*
    
  • 在任何 Linux shell 中,作为独立脚本~/bin/vnctun(需要更改 $PATH):

    #!/bin/bash
    ssh -L 5900:localhost:5900 "$@"
    
  • 在 Windows Cmd.exe 中,但作为独立脚本vnctun.cmd

    @echo off
    ssh -L 5900:localhost:5900 %*
    

(您甚至可以扩展此功能以在建立连接后自动启动 VNC 客户端。)

相关内容