아래에는 파일에서 도메인 목록을 컬링하고 결과를 출력하도록 설계된 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
코드는 구성 데이터 시작 부분에 인증 헤더를 한 번 설정합니다. 메소드를 명시적으로 지정할 필요가 없습니다.
결과는 표준 출력에 기록되지만 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
루프는 입력 파일을 한 줄씩 읽고 domain
변수( 로 정의됨 read domain
)(이 경우 ) 에 할당합니다 $domains
.