我試圖同時ping 192.168.2-254上的所有ip,并獲得每個ip的回傳狀態。這是我目前的做法,但它不起作用,而只是回傳xargs的狀態。希望得到任何幫助。我不想使用 nmap...
subnet="192.168.1"
num="2"。
while [ "$num" -lt "254" ]; do
num=$((num 1))
printf "${subnet}.${num}.
"/span>
done | xargs -n 1 -I ^ -P 50 ping -c2 -t3
uj5u.com熱心網友回復:
xargs的既定和記錄的行為是回傳一個自己的退出代碼,它表明你啟動的所有子行程發生了什么。例如;
xargs的退出狀態如下:0 - 如果它成功了
123 - 如果該命令的任何呼叫以狀態1-125退出124 - 如果該命令的呼叫以狀態1-125退出
124 - 如果該命令以狀態255退出
125 - 如果該命令以狀態255退出
125 - 如果該命令被一個信號殺死126 - 如果該命令被一個信號殺死了
126 - 如果該命令不能運行
127 - 如果該命令是由一個信號殺死的
127 - 如果命令沒有被找到
1 - 如果其他的命令沒有被找到
1 - 如果發生其他錯誤。
(Source: GNU xargs man page。POSIX 規范 稍微不那么具體,只是將 1-125 的所有內容歸納為 "無法裝配符合指定要求的命令列,一個或多個 utility 的呼叫回傳非零退出狀態,或發生其他錯誤。")
沒有簡單的方法可以在一個退出代碼中傳達多個行程的狀態(記得該值是一個位元組,所以即使你將回傳值編碼為位欄位,只表示成功或失敗,你仍然只能將其中的八個字塞進一個值中),但如果我對你的要求理解正確,只要在你反正正在運行的回圈中運行ping,并對每個人單獨等待。 以下是使用一個Bash陣列來跟蹤各個行程:
declare -a procs
for((num=2; num<254; num )); do
ping -c2 -t3 "192.168.1.${num}" &
procs =($!)
done
for p in "${procs[@]}"/span>; do
等待 $p; echo $?
done; $?
超過200個ping行程并行運行的輸出將是相當嘈雜的;也許在第一個done之后添加>/dev/null。(一次重定向所有內容比單獨重定向每個ping更有效。)
這并不意味著所有的程式都會被重定向。
這還沒有跟蹤哪個行程的ID屬于哪個IP地址;如果你需要的話,可以使用一個關聯陣列(Bash 4 ),或者將IP地址放入第二個陣列并保持對齊,這樣${ip[x]}就是屬于行程${procs[x]}的IP地址(例如,MacOS仍然使用不支持關聯陣列的Bash 3.2.57(1)-release)。
下面是一個使用關聯陣列的重構方法。
declare -A procs
for((num=2; num<254; num )); do
ping -c2 -t3 "192.168.1.${num}" &
procs[$num]=$!
done >/dev/null
for p in "${!procs[@]}"; do
等待 ${procs[$p]}
printf "%s:%i
" "192.169.1.$p" $?
done?
uj5u.com熱心網友回復:
@M Horton 這是否能達到你的目的。
在xargs領域使用xargs -n1 -P50 ping -c2
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308024.html
標籤:
下一篇:諭示:缺少右括號
