以下に、ファイル内のドメインリストをカールして結果を出力するように設計された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
いくつかのフィールドがあります。 $domains
APIを使用して最後に変数を追加して、ファイル内の各ドメインを確認してみました。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はこのようにループ内で変更されません。B1Dossier
domain
また、次のコマンドを使用してターゲットファイルに応答を追加する必要があります>>
。それ以外の場合は、次の応答が前の応答を上書きします。
答え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
。