是否有像
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 上。
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 访问来说,要走很长的路——你必须以某种方式处理标头,这降低了它的优雅性。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html不
出现在列表中:
wget,它本质上只保证 POSIX 实用程序。 但我确实认为 POSIX C 足以实现大部分
netcat
功能,所以这确实是一个错失的机会。例如:
如何在没有 libcurl 的情况下用 C 发出 HTTP get 请求?可能是因为像 HTTP 这样的网络协议在 POSIX 仍在发展的时候被认为太具体/不存在,并且 POSIX 基本上永远冻结了。值得注意的是,HTTPS 加密的实施可能并不容易。
现成(自动检测)脚本
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
shellcheck
isms) 对于
wget
(如果可用))