Bash
如何僅使用 bash 下載文件而不使用其他任何東西(沒有 curl、wget、perl 等)
我有一個最小的無頭 *nix,它沒有任何用於下載文件的命令行實用程序(例如,沒有 curl、wget 等)。我只有 bash。
如何下載文件?
理想情況下,我想要一個適用於各種 *nix 的解決方案。
如果您擁有
/dev/tcp
啟用了偽設備的 bash 2.04 或更高版本,則可以從 bash 本身下載文件。將以下程式碼直接粘貼到 bash shell 中(不需要將程式碼保存到文件中執行):
function __wget() { : ${DEBUG:=0} local URL=$1 local tag="Connection: close" local mark=0 if [ -z "${URL}" ]; then printf "Usage: %s \"URL\" [e.g.: %s http://www.google.com/]" \ "${FUNCNAME[0]}" "${FUNCNAME[0]}" return 1; fi read proto server path <<<$(echo ${URL//// }) DOC=/${path// //} HOST=${server//:*} PORT=${server//*:} [[ x"${HOST}" == x"${PORT}" ]] && PORT=80 [[ $DEBUG -eq 1 ]] && echo "HOST=$HOST" [[ $DEBUG -eq 1 ]] && echo "PORT=$PORT" [[ $DEBUG -eq 1 ]] && echo "DOC =$DOC" exec 3<>/dev/tcp/${HOST}/$PORT echo -en "GET ${DOC} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3 while read line; do [[ $mark -eq 1 ]] && echo $line if [[ "${line}" =~ "${tag}" ]]; then mark=1 fi done <&3 exec 3>&- }
然後您可以從 shell 執行它,如下所示:
__wget http://example.iana.org/
資料來源:Moreaki的回答通過 cygwin 命令行升級和安裝包?
更新: 如評論中所述,上述方法很簡單:
- 遺囑會
read
丟棄反斜杠和前導空格。- Bash 不能很好地處理 NUL 字節,所以二進製文件已經出來了。
- 未引用
$line
的將 glob。