如何通过SSH服务器下载文件?


31

我在美国有一台服务器(Linux方框B)和家用PC(Linux方框A),我需要从网站C下载文件,

问题是,直接从A下载文件非常慢,因此我登录B并sftp从A获取文件时需要下载文件。

有什么方法可以仅通过一条命令行直接下载文件并将B作为代理使用?

Answers:


46

(情况很奇怪,互联网路由是否不像三角形不等式那样成立?)

无论如何,请尝试以下,上一个ssh-D论证,

ssh -D 1080 address-of-B

它充当上的SOCKS5代理127.0.0.1:1080,可用于支持SOCKS5代理连接的任何对象。 显然,wget可以通过使用环境变量来做到这一点

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

请注意,有时curl更方便(即,我不确定是否wget可以通过SOCKS5进行主机名查找;但这不是我想的问题之一)。Firefox也可以通过这样的SOCKS5代理完全工作。

编辑我刚才注意到你正在寻找一个单行的解决方案。好吧

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

例如,将wget-fetched输出重定向到stdout,并将本地输出(从远程ssh运行wget)重定向到文件。

这似乎可行,wget输出结果有点混乱(“ 保存到- ”),您可以通过添加-qwget调用中来摆脱它。


6
显然,SOCKS_SERVER环境变量对Ubuntu 14.04没有影响。
卡巴斯德

4
根据另一个答案wget不支持SOCKS_SERVER变量。该答案建议使用curl --socks5-hostnamecurl --socks5
DenilsonSáMaia 2015年

@kasperd,那么,它只是在不起作用的ubuntu还是该变量与wget根本不相关?似乎该变量可能是for的socksify
cnst 2015年

@cnst我没有看到任何版本的wget支持袜子的证据。socksify不是设置,而是一个单独的程序。
kasperd 2015年

因此,基本上,如果您想SOCKS_SERVER对产生任何影响wget,则必须安装ports.su/security/dante,然后运行socksify wget而不是仅运行wget
cnst

3

另一种方法是您通常登录,B开始screen会话。在那里wget,您可以处理文件-全部都放在一个目录中。

程序可以在那里愉快地运行;您只是从屏幕上分离出来,但让它在后台运行。

如果下载完成(甚至可能更早),则可以将数据从B转移到A使用rsync(我的偏好)。


2

另一个问题另一个答案的启发,我建议使用proxychains-ng(这是较新版本的proxychains)。

  1. 下载,编译和选择安装 proxychains-ng
  2. 创建一个 proxychains.conf文件,在当前目录下,或者在~/.proxychains/proxychains.conf,或/etc/proxychains.conf
    • 或者,在其他任何地方或使用另一个名称创建一个文件,然后指定是否通过 -f命令行参数或PROXYCHAINS_CONF_FILE环境变量指定。
    • 有一个样本配置文件可用。最相关的选项在最后。
  3. proxychains.conf文件中,添加:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. ssh -D 1234 your_host_b。这将使ssh在本地主机的端口1234上侦听,并将您的远程主机用作SOCKS代理。

    • 或者,ssh -ND 1234 your_host_b改为运行。-N将阻止ssh在远程服务器上运行任何命令(即,它不会打开外壳)。
  5. 运行:proxychains4 yourcommandhere yourparametershere。看一些例子:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/

2

选项0:

为了wget与的SOCKS5代理一起使用ssh,您必须安装security/dante软件包才能SOCKS_SERVERsocksify实用程序中使用该选件。

sudo pkg_add dante

随后,您在后台打开SSH连接:

ssh -N -C -D1080 user@hostB &

并通过socksify通过SOCKS5代理使用wget:

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

选项1:

只需将文件通过管道传输到stdout服务器上,然后从stdin您的工作站上读取文件即可。

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C

1

您可以在框A到框B之间建立一条ssh隧道,然后将其添加到框A的路由表中,可以通过隧道到达框B到达网站C。您必须在框B上允许数据包转发。

在这里您可以看到一个非常好的分步教程...


1

您将需要在计算机B上创建一个隧道,这样会将呼叫重定向到网站C。但是,我感到困惑的是为什么这样做会更快,除非您的ISP受某些限制。

我不知道一个班轮,但这并不复杂。

在计算机A上,您可以这样做(我随机获得11111,您可以选择任何想要的值,只要它> 1024,或者您需要是root用户即可)

ssh -f -C -N -L 11111:C:80 username@B

B上的用户名是您用于连接到B的用户名。这应该在机器B的端口11111上创建一个隧道,该隧道重定向到机器C的端口80(HTTP中的网站使用HTTPS 443)(我希望我不会弄乱命令 ;) )

然后,您可以通过机器B直接从机器A下载文件。我假设文件位于,http://C/path/to/file因此可以使用:

wget http://B:11111/path/to/file

仅当在没有基于HTTP 1.1名称的虚拟主机的情况下可以访问该文件时,这才行得通吗?由于由wget的发出GET请求将状态的主机名作为B,不C.
一个CVN

@MichaelKjörling我没有足够的知识来回答你。
惠更斯(Huygens)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.