我有一台名为 的服务器,它gamma
在工作中不断启动并运行。有时我从家里连接到它,在这种情况下我使用公共 IP 地址55.22.33.99
。有时,我在工作时连接到它,而不是不必要地反弹我的数据包,我通过本地 IP 地址连接192.168.1.100
。
目前,我将它们分成两个不同的条目 ~/.ssh/conf
Host gamma-local
HostName 192.168.1.100
Port 22
User andreas
Host gamma-remote
HostName 55.22.33.99
Port 12345
User andreas
Run Code Online (Sandbox Code Playgroud)
所以,如果我在工作,我只需要打字就可以ssh gamma-local
了;如果我在家(或世界上任何其他地方),我会跑ssh gamma-remote
.
连接到服务器时,我宁愿不必根据我所在的位置键入不同的名称,而是希望该部分自动完成;例如,在某些情况下,我有自动脚本来连接不知道我在哪里的人。
有一个问题是通过使用Bash脚本首先“尝试”连接到本地的,如果连接不上,则尝试连接到远程IP地址来解决此问题。这很好,但 (1) 似乎效率低下(尤其是因为有时您必须“等待”连接超时,因为它们并不总是立即返回错误)并且 (2) 需要 Bash 并拖拽脚本。
是否有一种替代方法可以实现这一点,既不依赖于 Bash 脚本的使用,也不依赖于“测试”以查看连接是否首先起作用?
Mic*_*ski 34
如果您有办法识别您在哪个网络上,那么您可以使用Match
关键字 in~/.ssh/config
来做您想做的事情。这需要 OpenSSH ?6.5。
我使用类似的东西
Match originalhost gamma exec "[ x$(/sbin/iwgetid --scheme) != xMyHomeESSID ]"
HostName 192.168.1.100
Port 22
Host gamma
User andreas
Port 12345
HostName 55.22.33.99
Run Code Online (Sandbox Code Playgroud)
因此,我使用所使用的 wifi 网络的标识符来决定我是否在家以进行 SSH 连接,但也可以使用检查分配给您计算机的 IP 地址或任何其他区分这两个网络的内容.
如果您在工作中碰巧有私人域名服务器,并且您在办公室和家中使用同一台笔记本电脑,则可以利用它来实现这一点:
nsswitch.conf
的机器以先检查 DNSgamma
以便在办公室的私有 DNS 中解析为 192.168.1.100。gamma
为 55.22.33.99。这样,当您ssh gamma
在办公室时,它将从办公室 DNS 解析为 192.168.1.100,而当您在家中连接时,它将从您的主机文件解析为 55.22.33.99。
PS:此答案假定您不希望 gamma 具有公共 DNS 条目。另外,如果您从 Windows 机器通过 SSH 连接到您的服务器,我认为应该有一些与 nssswitch.conf 文件等效的地方来覆盖主机文件条目。
我不知道是否可以做到这一点~/.ssh/config
,但另一种方法是根据您的外部 IP 地址连接到其中一个。因为,大概,当你在工作时,你的 IP 将为55.22.33.NNN
,你可以运行如下命令:
[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] &&
ssh 192.168.1.100 ||
ssh -p 12345 55.22.33.99
Run Code Online (Sandbox Code Playgroud)
更简单的方法是使用您的内部 IP。我不知道你的两个网络是如何设置的,但如果通过你的IP很容易确定你是否在工作(例如,如果你在工作中有一个特定的IP,例如)192.168.1.12
,你可以这样做(更改eth0
为您的网卡名称):
[[ $(ip address show dev eth0 | grep -Po 'inet \K[\d.]+') = '192.168.1.12' ]] &&
ssh 192.168.1.100 ||
ssh -p 12345 55.22.33.99
Run Code Online (Sandbox Code Playgroud)
无论您决定使用哪一个,都可以将其作为别名添加到 shell(~/.bashrc
如果您使用的是,请将此行添加到 shell 的初始化文件中bash
):
alias gamma="[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] && ssh 192.168.1.100 || ssh -p 12345 55.22.33.99
Run Code Online (Sandbox Code Playgroud)
如果您希望其他脚本能够访问它(.bashrc
运行脚本时不会读取别名),您也可以将其放入脚本中。