2017-10-07 69 views
0

新手提醒! 我想通過bash腳本在CSV中爲域記錄運行DNS記錄查詢。我想查找帶有host -t mx example.com的MX記錄,然後將結果記錄/輸出另一個CSV。在終端上運行批量DNS記錄檢查

在舞臺萬變不離其運行host -t mx**(space must be here)**example.com;

時,因爲拿到劇本運行host -t mx$domain命令我有什麼:

#!/bin/bash 
while IFS=, read -r domain 
do 
    #echo ${domain/./\.}\ 
    host -t mx${domain/./\.} 
done < test1.csv 

感謝 編輯1;增加採樣輸入和輸出CSV 輸入CSV

domain 
24i.co.ke, 
28feb.co.ke, 
4thestatewire.co.ke, 
aakenya.co.ke, 

期望輸出

domain,mx 
24i.co.ke,"24i.co.ke mail is handled by 20 alt2.aspmx.l.google.com. 
24i.co.ke mail is handled by 30 aspmx3.googlemail.com. 
24i.co.ke mail is handled by 10 aspmx.l.google.com." 
28feb.co.ke,"28feb.co.ke mail is handled by 30 aspmx3.googlemail.com. 
28feb.co.ke mail is handled by 30 aspmx5.googlemail.com. 
28feb.co.ke mail is handled by 30 aspmx2.googlemail.com. 
28feb.co.ke mail is handled by 10 aspmx.l.google.com. 
28feb.co.ke mail is handled by 20 alt1.aspmx.l.google.com. 
28feb.co.ke mail is handled by 20 alt2.aspmx.l.google.com. 
28feb.co.ke mail is handled by 30 aspmx4.googlemail.com." 
4thestatewire.co.ke,Host 4thestatewire.co.ke not found: 3(NXDOMAIN) 
aakenya.co.ke,"aakenya.co.ke mail is handled by 20 ukns1.accesskenya.com. 
aakenya.co.ke mail is handled by 10 smtpin.accesskenya.com." 
abacus.co.ke, 
+0

如果空格必須存在(而且必須),爲什麼它不在腳本中?另外,您打算如何將內容寫入「另一個CSV」,以及以何種格式添加數據?如果您可以在問題中包含您的輸入數據樣本和預期輸出,這將是一個*真棒*第一個問題。 :-) – ghoti

+0

我嘗試過不同的方式來添加這個空間,比如'host -t mx $ {domain /./ \。}',我不斷收到錯誤; 'host:invalid type:domain' or not found:3(NXDOMAIN)o.ke – oslee

回答

0

您的替代品${domain/./\.}可能沒有達到您的預期效果(儘管結果可能無害)。我可以看到你用echo行嘗試了一些調試。知道你認爲這種替代會達到什麼將是很有趣的。

你的輸入文件是CSV,有兩個字段,第二個是空的。我看不到任何您需要在第一個字段中進行翻譯或更改以使其與DNS查找兼容的任何內容。

#!/usr/bin/env bash 

file="${1:-test1.csv}" 

if [[ ! -f "$file" ]]; then 
    printf 'No file: %s\n' "$file" >&2 
    exit 1 
fi 

(
    read -r header; printf '%s\n' "$header" 
    while IFS=, read -r domain; do 
    line="$(host -t mx "$domain" | sort | head -1)" 
    printf '%s,"%s"\n' "$domain" "$line" 
    done 
) < "$file" 

所以......

  • 這需要輸入文件作爲可選參數。如果輸入文件(如果沒有提供,則爲test1.csv)不存在,腳本將退出。
  • 它將該域的MX記錄進行排序,然後選擇第一個。通過這樣做,我們把最低編號(最高優先級)的MX。
  • while循環位於括號內,以便可以從循環中的相同輸入流中讀取標題。請注意,圓括號表示一個子外殼,因此它們內部設置的變量對於括號外部的腳本部分將不可見。
  • 最後,這實際上是打印一些輸出,你的示例腳本沒有。 :-)
+0

感謝@ ghoti,真的很優雅,我期待借鑑你的思想在我的許多腳本初學者旅程。 – oslee

0

給一個嘗試這種oneliner:

awk -F, 'FNR>1{ print $1 }' < input.txt \ 
    | xargs -n 1 sh -c 'v="$(host -t mx $1)"; echo "$1,\"$v\""' argv0 

根據您輸入的文件,在1號線後讀,並使用沒有,的第一個字段(域)。輸出通過管道輸送到xargs在一個變量執行命令並存儲該值,以便以後可以在你想要的格式打印domain,"output"

唯一懸而未決的是添加的第一行「域,MX」到輸出。

+0

Newbie Alert !!所以這就是剛剛做的。我運行了'awk -f email.awk domain.txt',其中email.awk是你剛剛共享的那一行,並且我得到語法錯誤'awk:email.awk:2:awk -F,'FNR> 1 {print $ 1} 'domain' 'awk:email.awk:2:^ expression'中的無效字符'''' 'awk:email.awk:2:awk -F,'FNR> 1 {print $ 1}' oslee

+0

首先直接在命令行中嘗試,並檢查是否沒有錯誤,可能需要用'awk -F','...'來轉義''',' – nbari

+0

謝謝。所以我刪除'''''''''domain.txt'並運行'awk -F,'FNR> 1 {print $ 1}' oslee