Bash

如何僅使用 bash 下載文件而不使用其他任何東西(沒有 curl、wget、perl 等)

  • January 7, 2019

我有一個最小的無頭 *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。

引用自:https://unix.stackexchange.com/questions/83926