bashだけを使用し、他のものを使用せずに(curl、wget、perlなどを使用せずに)ファイルをダウンロードする方法

bashだけを使用し、他のものを使用せずに(curl、wget、perlなどを使用せずに)ファイルをダウンロードする方法

最小限のヘッドレス* nixがあります。含まないファイルをダウンロードするためのコマンドラインユーティリティ(カールなし、wgetなど)のバッシュのみがあります。

ファイルをどのようにダウンロードできますか?

理想的には、広範囲の* nixで動作するソリューションが欲しいです。

ベストアンサー1

Bash 2.04以降があり、/dev/tcp疑似デバイスが有効になっている場合は、Bash自体からファイルをダウンロードできます。

次のコードを bash シェルに直接貼り付けます(実行のためにコードをファイルに保存する必要はありません)。

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>&-
}

その後、次のようにシェルで実行できます。

__wget http://example.iana.org/

源泉:モレキ回答cygwinコマンドラインでパッケージをアップグレードしてインストールしますか?

修正する: コメントで述べたように、上記のアプローチは簡単です。

  • readバックスラッシュと先行スペースは削除されます。
  • Bash は NUL バイトをうまく処理できないため、バイナリは廃止されました。
  • 引用符をオフにするとグローバルに$lineなります。

おすすめ記事