根据当前网络使用 ssh 代理命令

根据当前网络使用 ssh 代理命令

我想在家里或办公室通过笔记本电脑访问我的家用机器。在办公室,我必须使用网关。为此,我proxycommand在我的账户中添加了一个条目.ssh/config,该条目在办公室也可以正常工作。但是,如果我想在家里使用它,我不想依赖办公室网关。有没有办法自动化这个?

答案1

是也不是。

首先,不行。您无法在 ~/.ssh/config 文件中放入任何内容,这些内容会根据外部因素(例如您所在的网络或文件是否存在等)激活不同的设置。SSH 的配置文件是静态文件。

答案是肯定的。你可以“破解”一些东西。它可能不会很漂亮,但可能会有用。

考虑一下 ProxyCommand 的工作原理。它执行命令行,并以 printf 样式替换某些字符串。您可以在该命令行中输入登录信息。例如,您可能在笔记本电脑中安装了类似的东西供在办公室使用:

host athome
    ProxyCommand ssh -x -a -q gateway nc athome.dyndns.org 22

该命令启动一个ssh连接到该服务器的命令gateway,并在该服务器上启动netcat以连接到您的实际的目的地。那么,您可以使用 shell 脚本来代替运行 ssh。例如,在您的.ssh/config文件中使用以下脚本:

host athome
    ProxyCommand bin/customconnect athome.dyndns.org

您可以创建一个~/bin/customconnect脚本:

#!/bin/sh

if /sbin/ifconfig -a | grep -q 'inet 192\.168\.'; then
        nc $1 22
else
        ssh -x -a -q gateway nc $1 22
fi

然后,假设你家里的网络以 开始192.168,而办公室的网络没有,则会选择适当的 ProxyCommand按脚本

如果您想要其他动态功能,例如根据网络选择不同的主机名,您显然也可以将其添加到脚本中。

请注意,此解决方案并非没有成本。通常,SSH 会直接启动您的 ProxyCommand。如果您使用此解决方案,则每个连接都会有一个额外的进程,因为 ssh 会启动一个 shell,而 shell 又会启动另一个进程。

相关内容