wget 或类似程序在 POSIX 系统上始终可用吗?

问题描述 投票:0回答:6

是否有像

wget/lynx/GET
这样默认分发在 POSIX 或 *nix 操作系统中的 HTTP 客户端可以用于最大程度的可移植性?

我知道大多数系统都安装了

wget
lynx
,但我似乎记得使用默认设置安装了一些Ubuntu服务器系统,并且它们的基础包中没有安装
wget
lynx

我正在为 Linux(可能还有 Mac)编写一个 shell 脚本,用于在计算机上安装一个软件。为了避免分发几个大文件,我想从互联网上获取这些文件,而不是与安装程序一起打包。目前,安装脚本将分发到由 Makeself 创建的单个文件中。

我希望避免安装脚本超过 100 MB,如果包含这些文件,那么安装脚本就会超过 100 MB,而且如果用户正在升级或重新安装软件,则可能不需要这些文件。也许最方便的做法是将文件包含在包中。

现在我只是想让脚本按顺序检查

wget
lynx
GET
,并且它将使用它可以下载的任何一个,但如果有的话我可以完全避免这种情况这样我就可以下载适用于所有系统的文件。

编辑:

有人了解 lwp-request (

GET
) 及其可用性吗?到目前为止,这似乎在我检查过的几个系统上都很容易使用,我记得这总是在 10 多年前的 RedHat 上。

linux bash posix wget lynx
6个回答
17
投票

2019-11-04编辑:我正在重写我的答案,以反映确保传输在飞行时不被篡改的重要性。我将把我原来的答案留在规则下面。

我建议使用

rsync
而不是
ssh
来传输文件。
rsync
的界面可能看起来让人不知所措,但大多数用户可能会选择
rsync -avzP
,如果您需要更大的灵活性,rsync可以适应。使用
ssh
将为您的连接提供完整性、真实性和隐私性。

curl
是http传输事实上的标准;如果首选普通 http 或 https,
curl
或基于
curl
的工具可能是一个不错的选择。


根据我的经验,可用的工具大约按以下顺序:

  • wget
  • curl
  • sftp
  • ftp
  • GET
    (我一直使用
    HEAD
    ,但经常忘记它只是套件中的一个工具)
  • tftp
  • nc
    (没有我希望的那么常见)
  • socat
    (甚至不太常见)

bash
/dev/tcp
工具在我使用过的大多数系统上都可用(有些系统使用
dash
pdksh
),但将
echo
bash
nc
socat
一起使用是对于 HTTP 访问来说,要走很长的路——你必须以某种方式处理标头,这降低了它的优雅性。


11
投票
POSIX 7 实用程序的官方列表

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html

以下内容

出现在列表中:

wget
  • 卷曲
  • ftp
  • 同样适用于
LSB

,它本质上只保证 POSIX 实用程序。 但我确实认为 POSIX C 足以实现大部分

netcat

功能,所以这确实是一个错失的机会。例如:

如何在没有 libcurl 的情况下用 C 发出 HTTP get 请求?
可能是因为像 HTTP 这样的网络协议在 POSIX 仍在发展的时候被认为太具体/不存在,并且 POSIX 基本上永远冻结了。值得注意的是,HTTPS 加密的实施可能并不容易。


3
投票


3
投票
http://www.gnu.org/software/gawk/manual/gawkinet/html_node/


1
投票


0
投票

现成(自动检测)脚本

我写了一个符合Posix的Shell函数,也可以用作命令:

http_get

#!/bin/sh
## Usage: http_get <url> [filepath]
## Copyright (C) 2022 AJ ONeal <[email protected]>
## Permission to copy and modify is granted under the CC0-1.0 license
set -e
set -u

http_get() { (
    http_get_url="${1}"
    http_get_filepath="${2:-"$(basename "${http_get_url}")"}"
    if [ -z "${http_get_url}" ]; then
        echo >&2 "Usage: http_get <url> [filepath]"
        return 1
    fi

    if command -v wget > /dev/null; then
        # wget supports resumable downloads
        if ! wget -q -c "${http_get_url}" -O "${http_get_filepath}.part"; then
            echo >&2 "failed to download ${http_get_url} to ${http_get_filepath}.part"
            return 1
        fi
    elif command -v curl > /dev/null; then
        if ! curl -fsSL "${http_get_url}" -o "${http_get_filepath}.part"; then
            echo >&2 "failed to download ${http_get_url} to ${http_get_filepath}.part"
            return 1
        fi
    fi

    # move downloaded file into file location
    mv "${http_get_filepath}.part" "${http_get_filepath}"
); }

http_get "${1:-}" "${2:-}"

好处

对于命令或
    source
  • d 函数使用是安全的(子 shell 中的变量和命名空间)
    以“严格模式”运行(出错时干净退出)
  • shellcheck
  • -linted(符合 Posix,无 bash
    isms
    对于
  • 批处理模式
  • 安全(使进度条静音) 对于
  • 部分和可恢复下载
  • 是安全的(首选wget(如果可用)
  • 额外功能

有一个扩展版本还可以检测 shell 是否是交互式的(以启用进度栏),网址为

https://therootcompany.com/blog//posix-shell-http-request-curl-vs-wget/

© www.soinside.com 2019 - 2024. All rights reserved.