ファイルのリストフィールドのカーリングは機能しません。

ファイルのリストフィールドのカーリングは機能しません。

以下に、ファイル内のドメインリストをカールして結果を出力するように設計されたbashスクリプトを示します。

#!/bin/bash
    
baseurl=https://csp.infoblox.com
domains=/home/user/Documents/domainlist
B1Dossier=/tide/api/data/threats/state/host?host=$domains
APIKey=<REDACTED>
AUTH="Authorization: Token $APIKey"
        
        
for domain in $domains; do curl -H "$AUTH" -X GET ${baseurl}${B1Dossier} > /tmp/outputfile; done

残念ながら、スクリプトはファイル内のすべてのドメインを繰り返すわけではありません。

理解を助けるために、スクリプトの期待/解釈をリストしました。

  • ファイルには/home/user/Documents/domainlistいくつかのフィールドがあります。
  • $domainsAPIを使用して最後に変数を追加して、ファイル内の各ドメインを確認してみました。B1Dossier
  • ファイル内の各ドメインに対して指定されたカールコマンドを実行し、結果を印刷することが期待されます。

可視性を高めるために、以下の単一ドメインに対して機能するカールコマンドを含めました。

curl -H 'Authorization: Token <REDACTED>' -X GET https://csp.infoblox.com/tide/api/data/threats/state/host?host=<place domain here>

誰が私が間違っているのか、この問題を解決する方法を見つけるのに役立ちますか?

答え1

ファイルのフィールドを配列として読み取って繰り返すことができます。

baseurl="https://csp.infoblox.com"
B1Dossier="/tide/api/data/threats/state/host?host="
url="${baseurl}${B1Dossier}"

# read domains to an array
mapfile -t domains < /home/user/Documents/domainlist

# loop for domains
for d in "${domains[@]}"; do
    curl -H "$AUTH" -X GET "${url}${d}" >> temp
done

メモ:

コマンドで into ループを使用しても効果はありません。ドメインがinに含まれていてforループがあるB1Dossierため、ある種の再帰評価を待っているようです。ただし、URLはこのようにループ内で変更されません。B1Dossierdomain

また、次のコマンドを使用してターゲットファイルに応答を追加する必要があります>>。それ以外の場合は、次の応答が前の応答を上書きします。

答え2

実際のドメインを含むファイル名を繰り返すようです。これがコードが望むことをしない理由です。また、すべてを同じファイルに出力するように見え、呼び出すたびに上書きされますcurl

curlシェルを使用してリストを繰り返すのではなく、複数の設定を含む設定ファイルを使用できます。url

ただし、構成ファイルは実際にディスクに保存する必要がないため、動的に作成してパイプラインに渡すことができますcurl

domain_list=/home/user/Documents/domainlist

base_url=https://csp.infoblox.com
endpoint=tide/api/data/threats/state/host

APIKey=<REDACTED>
auth_header="Authorization: Token $APIKey"

awk -v h="$auth_header" -v b="$base_url" -v e="$endpoint" '
        BEGIN {
                printf "header = \"%s\"\n", h
        }
        {
                printf "url = %s/%s?host=%s\n", b, e, $0
        }' "$domain_list" |
curl --config -

これは、まずawkドメインリストの各行の前に次を付けるために使用されます。

url = https://csp.infoblox.com/tide/api/data/threats/state/host?host=

curlその後、これは連絡先のURLのリストとして使用されます。

また、このawkコードは構成データの先頭に認証ヘッダーを1回設定します。メソッドを明示的に指定する必要はありません。

結果は標準出力に書き込まれますが、output = somefilename各行の前にオプションを挿入してurl結果を特定のファイルに出力することもできます。


同じスクリプトですが、少し単純化されている可能性があります。

domain_list=/home/user/Documents/domainlist

base_url=https://csp.infoblox.com
endpoint=tide/api/data/threats/state/host

APIKey=<REDACTED>
auth_header="Authorization: Token $APIKey"

{
    printf 'header = "%s"\n' "$auth_header"
    prefix="url = $base_url/$endpoint?host=" \
    awk '{ print ENVIRON["prefix"] $0 }' "$domain_list" 
} | curl --config -

答え3

whileループを使用してください。

#!/bin/bash
    
baseurl=https://csp.infoblox.com
domains=/home/user/Documents/domainlist
APIKey=<REDACTED>
AUTH="Authorization: Token $APIKey"

while read -r domain; do
    url="${baseurl}/tide/api/data/threats/state/host?host=${domain}"
    curl -H "$AUTH" -X GET "$url" >> /tmp/outputfile
done < "$domains"

このwhileループは入力ファイルを1行ずつ読み込み、domain変数(として定義read domain)(この場合)に割り当てます$domains

関連情報