![443 的 ssh 隧道](https://linux22.com/image/938642/443%20%E7%9A%84%20ssh%20%E9%9A%A7%E9%81%93.png)
我需要通过链接(443)获取文件,这只能从服务器获取B
。
我有 3 台服务器,(ABC)。
可以访问服务器乙wget
并从服务器下载此文件C。
wget https://NAME:[email protected]/customerInfo/804-577823-10 --no-check-certificate
...
2021-06-18 16:18:01 (24,7 MB/s) - ‘804-577823-10’ saved [163/163]
从A到乙,只允许用于端口22
(ssh),而不允许用于端口443
。
我需要建一条隧道,穿过A到乙通过22
并从下载文件C通过wget
端口443
,完全相同的方式,就像我在服务器上一样乙。
简而言之,我需要一个来自A到乙然后我需要使用端口443
,用于应用/下载文件C通过wget
A,方法与乙。
我尝试过,但是没有成功。
ssh -L 4433:C:443 -Nf B
我甚至尝试使用代理,但没有成功。
wget -e use_proxy=yes -e http_proxy=C https://NAME:[email protected]/customerInfo/804-577823-10 --no-check-certificate
是否可以?
谢谢。
更新
SERVER_A:443 -> ssh tunnel by port 22 through SERVER_B -> SERVER_C:443
所以如果我使用服务器 A与 相同的链接服务器 B,我想wget
通过服务器端。
最简单的方法是允许443
端口服务器端为了服务器 A,但在这种情况下这是不可能的。
仅允许端口22
之间服务器 A和服务器 B。
现在最清楚了吗?
谢谢。
答案1
这取决于谁拥有服务器的权限,以确定您能做什么。另外,我不太明白这是一次性下载还是您需要永久解决方案。
阅读完你的问题后,我会使用安全外壳进入服务器 B。
$ ssh user@serverB
然后从那里下载文件。(最后的要点很重要)
$ scp -P 443 user@serverC:/path/to/file.txt .
此后你可以将其发送到服务器A
$ scp file.txt user@serverA:~/
还有更复杂的解决方案,但这取决于您的需求和行动自由。
更新:
您可以通过 ssh 向服务器发送命令。
ssh user@serverB "wget your file at C"
您可以执行双重命令,例如:
ssh user@serverB "wget your file @C:443 && scp file.txt you@serverA:~/"
但是您需要让服务器 B 在服务器 A 上安装其公共证书,这样就无需密码。另一种方法是使用上面解释的 2 命令脚本。
答案2
实际上,您可以通过 SSH 连接将输出通过管道传输到一条命令中来执行此操作。假设您正在运行此命令从服务器 A,我认为以下操作可行。
$ ssh user@serverB "wget https://NAME:PASS@serverC/customerInfo/804-577823-10 --no-check-certificate -O -" > 804-577823-10.txt
这将连接到服务器 B,运行 wget 命令从服务器 C 获取内容,并通过 STDOUT 输出,然后在服务器 A 上的 804-577823-10.txt 中捕获。
如果您想从服务器 A 之外的工作站执行此操作,您也可以执行以下操作:
$ ssh -J user@serverA user@serverB "wget https://NAME:PASS@serverC/customerInfo/804-577823-10 --no-check-certificate -O -" > 804-577823-10.txt
这将使用服务器 A 作为跳转箱,然后执行与上一个命令相同的操作。我还使用 -A 进行代理转发,如果您的凭据在服务器之间共享,您可能可以使用它,因此...
$ ssh -A -J user@serverA user@serverB "wget https://NAME:PASS@serverC/customerInfo/804-577823-10 --no-check-certificate -O -" > 804-577823-10.txt
最后,如果您真的想在端口 443 上创建从服务器 A 到服务器 C 的隧道,您可以执行以下操作:
$ sudo -i # Required to bind to port 443.
# ssh user@serverB -T -N -L 127.1.2.3:443:serverC:443 &
# wget https://NAME:[email protected]/customerInfo/804-577823-10 --no-check-certificate
# kill -INT %1
或者,如果您不想使用 root,则需要绑定到高于 1024 的端口,通常人们使用 10443。所以...
$ ssh user@serverB -T -N -L 127.1.2.3:10443:serverC:443 &
$ wget https://NAME:[email protected]:10443/customerInfo/804-577823-10 --no-check-certificate
$ kill -INT %1
此外,当您通过隧道访问 HTTP 服务器时,HTTP 服务器可能只知道如何通过完全限定域名 (FQDN) 访问您要查找的内容。如果是这样,您可以将参数添加--header='Host: www.example.com'
到 wget 命令中,以告知服务器您正在寻找该特定名称下的内容。
还请注意,您可以绑定到任何 127.xxx 地址,如果您要绑定到许多不同的服务器并且想要更清楚地区分它们,这将非常有用。通常我会将绑定目标的设备的第一个八位字节替换为 127,因此,像 10.194.27.18 这样的地址将变成 127.194.27.18。如果您要绑定到多个 HTTP 服务器并且想要防止 cookie 重叠,这将为您省去很多麻烦。
希望这对某人有帮助!我知道这个问题有点过时了。