在脚本中使用 ssh 连接时 ssh 端口转发

在脚本中使用 ssh 连接时 ssh 端口转发

当我通过 SSH 连接到设备时,我知道如何转发本地端口;首先使用 进入 ssh 菜单[ENTER} ~C,然后: -L 4455:ip:80

这将使本地计算机上的 localhost:4455 转到远程设备上的端口 80。

我怎样才能将此手动操作放入脚本中?这里唯一的变量是远程设备上的 IP 地址,但我知道如何自动获取它;我只是不知道如何将命令推送到 ssh 菜单,例如:-L 4455:ip:80

答案1

介绍

我最近遇到了这篇文章:https://hackertarget.com/ssh-examples-tunnels/它解释了很多关于 ssh 连接和端口转发的内容,看看,你会学到很多:)

以下是与您相关的内容:


SSH 隧道(端口转发)

最简单的 SSH 隧道只是在本地系统上打开一个端口,该端口连接到隧道另一端的另一个端口。

localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver

让我们分解一下 -L 参数。将 -L 视为本地监听方。因此,在上面的示例中,端口 9999 正在侦听 localhost,端口转发到远程服务器上的端口 80,请注意,127.0.0.1 指的是远程服务器上的 localhost!

让我们更进一步。在下面的示例中,正在侦听的端口可以从本地网络上的其他主机连接到。

localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

在这些示例中,我们连接的端口是侦听 Web 服务器。它还可以是代理服务器或任何其他 TCP 服务。


例子

现在,上面的内容将为您打开一个活动的 SSH shell,并且,因为我们只想转发端口,所以这是不需要的。您可以在命令中添加 -N 参数以跳过执行任何远程命令(打开的 shell 也是一个命令)。该ssh man页面也解释了这一点:

-N Do not execute a remote command. This is useful for just forwarding ports.

因此,以下脚本将打开您的端口,直到您按 ctrl-c/kill 为止:

#!/usr/bin/env sh

echo "Forwarding ports"
ssh -N -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

您还可以通过执行 sleep 命令并删除 -N 参数来打开端口几秒钟:

ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver "sleep 10"

最终的

这些 SSH 隧道有其缺陷。如果您想长时间保持转发端口打开,您可能需要查看以下线程,特别是有关以下内容的部分autosshhttps://superuser.com/questions/37738/how-to-reliously-keep-an-ssh-tunnel-open

答案2

我最近不得不做一些与您要求类似的事情,即有一个脚本可以使用 ssh 自动进行端口转发并在该地址打开浏览器。为了实现这一点,我将 ssh 命令的自动化行为与 shell 脚本结合起来。我使用 MacOS 作为说明。

在我的 ~/.ssh/config 文件中,我有一个条目,类似于:

Host remoteserver
     HostName [ip address here]
     User [username]
     IdentityFile [path to secret.pem]

因此,如果您输入,ssh remoteserver您就知道它会将您连接到那里。然后我在 PATH 中已有的目录中设置一个名为 on 的单独脚本,如下所示monitorchmod +x

#!/bin/bash
ssh -L 9999:localhost:80 $1 -N &
open -na Google\ Chrome --args --new-window "http://localhost:9999"

因此,当您键入时,monitor remoteserver它会自动使用 ssh 建立端口转发,然后在适当的地址打开 Google Chrome 浏览器。

简单说明一下,$1代表脚本文件名后面的参数。 -N代表不需要远程服务器上的终端 shell。 &代表非阻塞执行;如果您没有,打开浏览器窗口的下一个命令将等待您完成 SSH,这不是您想要的。 Open是您通常在 MacOS 的 Darwin 中使用的内容,对于合适的 Linux 风格,您必须查找它,但这应该不会太难。 -na代表组合新进程和应用程序标志,虽然--args --new-window之前的 -n 标志似乎是多余的,但根据我的经验,似乎与 Chrome 配合得最好。

希望这可以帮助。

相关内容