【问题标题】:A command to download a file other than Wget [closed]下载Wget以外的文件的命令[关闭]
【发布时间】:2010-11-10 09:32:03
【问题描述】:

我的主机允许有限访问 SSH 和 Linux 命令。但是,我不能使用Wget 信不信由你。

我希望能从另一台服务器下载文件 (.flv)。我可以尝试其他命令吗?

如果没有,我可能会使用 Python、Perl 或 PHP(最喜欢的)来实现文件下载。有可能吗?

【问题讨论】:

  • 您能解释一下为什么不能使用 wget 吗?
  • 我以前见过;一些系统管理员实际上会阻止它,因为他们认为无法访问它“更安全”。可能还有其他原因,但这是我经常看到的原因。

标签: linux command-line ssh wget


【解决方案1】:

您可以使用以下命令:

curl -O @987654321@

【讨论】:

  • 为什么 OP 接受了这个答案?许多其他人很久以前就提到了 curl 并且最重要的是这里给出的确切命令是不正确的。奇怪。
  • 嗨,您应该阅读:man curl。 -o 表示将输出文件写入磁盘而不是将其提供给标准输出。 :)
  • 鼓励新手!
  • 为您省事,从手册页中的 -O 下粘贴:“将输出写入本地文件,其名称类似于我们获得的远程文件。”这就是 OP 所要求的,我很困惑为什么你认为它是不正确的。我也对其进行了测试,它的行为符合预期。
【解决方案2】:
echo -ne "GET /path/to/file HTTP/1.0\r\nHost: www.somesite.com\r\n\r\n" | nc www.somesite.com 80 | perl -pe 'BEGIN { while (<>) { last if $_ eq "\r\n"; } }'

【讨论】:

  • 这显然是史诗般的,但它似乎在运行并且没有提供任何反馈。
  • 我从未说过这是一个非常 /good/ 的选择。但是如果你有 netcat 和 perl...(不过,如果你有 perl,使用 LWP::Simple 可能会更好。这可以更改为使用 sed 或 awk 或其他东西,但很容易)
  • 理论上你可以在没有 netcat 和 perl 的情况下做到这一点——bash 有 tcp 重定向,sed 可以擦除标题。但我真的不想写它:-) 看这里:thesmithfam.org/blog/2006/05/23/…
  • GNU awk 也有 TCP 重定向 :) @cube:我在下面写答案时没有看到您的评论,但这与我所做的几乎相同。
  • @cube,许多发行版(包括 debian)禁用 bash tcp 重定向 - 毕竟,这是在窃取文件系统命名空间的一部分
【解决方案3】:

Bash--enable-net-redirections 编译非常强大。 (Zsh 也有类似的功能。)哎呀,我什至还会在这里扔 HTTP Basic Auth。

当然,它不是一个很好的 HTTP/1.1 客户端;例如,它不支持分块编码。但这在实践中非常罕见。

read_http() {
    local url host path login port
    url="${1#http://}"
    host="${url%%/*}"
    path="${url#${host}}"
    login="${host%${host#*@}}"
    host="${host#${login}@}"
    port="${host#${host%:*}}"
    host="${host%:${port}}"
    (
        exec 3<>"/dev/tcp/${host}/${port:-80}" || exit $?
        >&3 echo -n "GET ${path:-/} HTTP/1.1"$'\r\n'
        >&3 echo -n "Host: ${host}"$'\r\n'
        [[ -n ${login} ]] &&
        >&3 echo -n "Authorization: Basic $(uuencode <<<"${login}")"$'\r\n'
        >&3 echo -n $'\r\n'
        while read line <&3; do
            line="${line%$'\r'}"
            echo "${line}" >&2
            [[ -z ${line} ]] && break
        done
        dd <&3
    )
}

OTOH,如果您安装了 Perl 的 LWP,它应该附带一个名为 GET 的示例二进制文件...

【讨论】:

    【解决方案4】:

    lynx -source

    【讨论】:

      【解决方案5】:
      curl -C - -O http://www.url.com
      

      【讨论】:

        【解决方案6】:

        Python 脚本:

        #!/usr/bin/env python
        import os,sys,urllib
        f = open (os.path.basename (sys.argv[1]), 'w')
        f.write (urllib.urlopen (sys.argv[1]).read ())
        f.close ()
        

        sys.argv[1] 是您感兴趣的网址。

        【讨论】:

          【解决方案7】:

          如果您尝试从您已通过身份验证访问的主机下载文件,请尝试使用scp。它就像一个普通的副本,但它是通过 ssh 隧道完成的。我发现允许“有限 ssh”的主机通常仍然允许scp

          scp user@myhost.com:folder/file.flv ./
          

          您需要提供您的用户凭据。请参阅scp documentation 了解更多信息。

          【讨论】:

          • Abs 明确声明它来自另一台服务器。
          • @Randolpho - 嗯,scp 允许您从另一台服务器复制。这是 scp 的唯一功能。
          • @sheepsimulator:只有在您对远程服务器有访问权限的情况下才能使用 SCP,即它是您拥有帐户的主机。我相信Abs没有这样的。也就是说,在第二次阅读该问题时,可以解释为 Abs 可以访问远程主机。基于此,我将撤销我的反对票。
          • @Randolpho,我发现这个问题对于他是否经过身份验证访问相当模糊。我只给了我的两分钱。无论如何,感谢您删除反对票:)
          【解决方案8】:

          另一个做类似事情的工具是snarf

          【讨论】:

            【解决方案9】:

            各种方式,

            1. Python -- How not to fetch data over HTTP

            【讨论】:

              【解决方案10】:

              另一个可能的选择是aria2

              【讨论】:

                【解决方案11】:

                使用 scp。

                用法:scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
                [-l 限制] [-o ssh_option] [-P 端口] [-S 程序]
                [[user@]host1:]file1 ... [[user@]host2:]file2

                【讨论】:

                  猜你喜欢
                  • 2017-10-19
                  • 2013-05-16
                  • 1970-01-01
                  • 2019-05-30
                  • 2022-01-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多