Shell
來自遠端伺服器的tail文件和本地的nslookup
我需要一個解析主機的腳本。
現在我在本地機器上執行這個腳本
for i in `tail -F access.log | awk '{print $8}' | awk '{gsub("http://|/.*","")}2' | awk '{gsub("http://|:.*","")}1' | grep -E -v "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"` do nslookup $i [dns-server_ip]; done > ips.txt
但我需要來自一些遠端主機的尾文件並在我的本地機器上執行****nslookup ,但我不知道該怎麼做。
使用 ssh?
大多數命令都可以通過添加命令來遠端
ssh
執行,所以替換tail -F access.log
為ssh REMOTEHOST tail -F access.log
==>ssh myUSER@myREMOTEHOST tail -F access.log | awk '{print $8}' | awk '{gsub("http://|/.*","")}2' | awk '{gsub("http://|:.*","")}1' | grep -E -v "([0-9]{1,3}\.){3})[0-9]{1,3}" | while read i ; do nslookup $i $dnsServerIP; done > ips.txt
正如@kasperd 和@archemar 也暗示的那樣,您可以/應該清理那個長管道。這是我的看法:
ssh myUSER@myREMOTEHOST tail -F access.log | awk '{$0=$8; gsub("https?://|[/:].*","")} !/([0-9]{1,3}.){1,3}[0-9]{1,3}/' | while read i ; do nslookup $i $dnsServerIP; done > ips.txt
解釋:
$0=$8
. 在您的範例輸出中,包含您想要的 URL 的列是 #8。此命令$0
僅用 element 覆蓋(整行)$8
,有效地丟棄其餘部分。這取代'{print $8}'
gsub("https?://|[/:].*","")}
將您的兩個 gsub 呼叫替換為一個涵蓋所有可能性的呼叫。在您的程式碼中,您還搜尋了兩次“http://” ,但與 http 不匹配**。**!/([0-9]{1,3}.){1,3}[0-9]{1,3}/'
在使用完全相同的正則表達式時替換您單獨的 grep 呼叫。$0
當不是數字 IP時,它的計算結果為真,並且會隱含地{print $0}'
. 稍微短h=$0;gsub(/[0-9.]/,"",h)} h
一點也有同樣的效果。注意:您的-calls後面的尾隨
2
和1
後面計算為,而後者又被隱式擴展為。這就是我的解決方案中最後一個正則表達式隱式列印不匹配行的方式/原因。}``gsub``true``true {print $0}