我经常使用类似以下命令设置端口转发:
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
中非空的情况下运行,那么将被应用。像这样:VNCT
LocalForward 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
,因此我决定使用case
where无需双引号。这是关于非空变量与空/未设置,因此
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 客户端。)