我经常使用以下命令设置端口转发:
ssh -NL 1234:localhost:1234 MyHostName
端口通常保持不变,但远程会发生变化。如果我可以创建 SSH 条目,例如:
Host VncTunnel
HostName %arg
LocalForward 5900 localhost:5900
然后ssh VncTunnel arg=MyHostName
每当我想通过隧道连接到任意主机时就使用类似的东西。
有什么建议么?
我经常使用以下命令设置端口转发:
ssh -NL 1234:localhost:1234 MyHostName
端口通常保持不变,但远程会发生变化。如果我可以创建 SSH 条目,例如:
Host VncTunnel
HostName %arg
LocalForward 5900 localhost:5900
然后ssh VncTunnel arg=MyHostName
每当我想通过隧道连接到任意主机时就使用类似的东西。
有什么建议么?
感谢卡米尔首先让我想到了比赛的想法,如果你没有最新版本之一(
openssh
这可能还不是很常见),看起来他的答案是可行的。经过一番研究,我发现新版本
openssh
最近(大约半年前)添加了标签的概念,这使得这个解决方案更加简单,请参阅ssh-config 手册页的文档现在
~/.ssh/config
你需要这样的配置:然后你可以在调用时使用它,
ssh
如下所示:看起来这个更改是在 9.4 版本中引入的(请参阅此处)。
下面的解决方案是
ssh
在 OpenSSH 版本 9.3 中进行测试的(但它也应该适用于相当非古老的旧版本,我猜从 7.2 开始,其中bz#2471已修复)。对于 9.4 及更高版本,请参阅另一个答案,IMO 的解决方案是“正确的事情”。将此片段粘贴到您的开头
~/.ssh/config
:现在,如果您在环境中运行
ssh
非空,则将应用。像这样:VNCT
LocalForward 5900 localhost:5900
该解决方案可以扩展。例如这个附加片段:
将允许您运行
VNCT=1 PRXY=1 ssh -N MyHostName
以启用两种转发。您可以独立启用每个转发。您可以创建更多片段。笔记:
case $VNCT in ?) exit 0;; esac; exit 1
不是测试变量是否不为空的最简单方法。一般来说,有更简单的方法,但其中许多需要在 shell 代码中使用双引号。"
我还没有找到将双引号值传递给 的方法,因此我决定在不需要双引号的地方Match exec
使用。case
这是关于非空变量与空/未设置的变量,因此
VNCT=0
也将启用相应的转发。如果您使用case $VNCT in 1) …
then 只会VNCT=1
启用它,所有其他值(包括VNCT=0
)都不会。ssh
该解决方案甚至可以与幕后使用的脚本和工具一起使用;或者在某些情况下可能不会。一个工具可能会
ssh
在经过净化的环境中运行,或者带有干扰的选项,但如果它ssh
以最直接的方式调用,那么我们的配置将起作用,您只需将正确的变量放入环境中(例如VNCT=1 tool
)。我不认为您会想要以这种方式创建隧道,但您并不限于此LocalForward
,使用我们的方法,您可以根据需要施加其他配置选项。如果该工具不提供任何选项来自定义它传递给的参数,这将特别有用ssh
。虽然“gepa”提到的 OpenSSH“标签”功能可能是可用时最好的选项,但它仍然很新,您的系统可能还没有它,在这种情况下,我的建议是不要首先通过
ssh
地方。您可以使用 shell 脚本、shell 函数或 shell 别名来执行相同的操作,而无需通过 ssh_config 实现它所需的任何扭曲:
例如,在 Bash (
~/.bashrc
) 中:同样在 Bash/Zsh 中使用函数(也在 中
~/.bashrc
):在 PowerShell (
notepad $profile
) 中:在 Windows Cmd.exe(自动运行)中:
在任何 Linux shell 中,作为独立脚本
~/bin/vnctun
(需要更改 $PATH):在 Windows Cmd.exe 中,但作为独立脚本
vnctun.cmd
:(您甚至可以扩展它以在建立连接后自动启动 VNC 客户端。)