파일의 목록 필드에 대한 컬링이 작동하지 않습니다.

파일의 목록 필드에 대한 컬링이 작동하지 않습니다.

아래에는 파일에서 도메인 목록을 컬링하고 결과를 출력하도록 설계된 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코드는 구성 데이터 시작 부분에 인증 헤더를 한 번 설정합니다. 메소드를 명시적으로 지정할 필요가 없습니다.

결과는 표준 출력에 기록되지만 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.

관련 정보