Cara cepat untuk memindai port yang terbuka di jaringan lokal sesuai dengan daftar

1

Bagaimana saya dapat dengan cepat mengetahui apakah port 80 terbuka / mendengarkan pada server melalui skrip bash?

Biasanya pada semua workstation, daemon berjalan, tetapi terkadang gagal. Saya menggunakan perintah berikut untuk memeriksa apakah alamat IP memiliki port terbuka. Saya ingin dapat melakukan ini untuk setiap baris dalam file tanpa harus mengetik secara manual setiap kali.

 nc -zw3 10.101.0.13 80 && echo "opened" || echo "closed"

File daftar terlihat seperti ini, di mana 3333dan 3334setelahnya adalah string$ip;

10.101.0.13; 3333
10.101.0.15; 3334
10.101.0.17; 4143
10.101.0.21; 1445
10.101.0.27; 2443
10.101.0.31; 2445
10.101.0.47; 3443
10.101.0.61; 3445

Saya harus memisahkan port terbuka dari yang tertutup, jadi saya akan memiliki daftar server gagal yang harus diperbaiki.

Saya mencoba sesuatu seperti ini tanpa hasil:

while IFS=";" read ip port ; do nc -zw3 "$ip" "$port" && echo "$ip:$port => opened" || echo "$ip:$port =>  closed" ; done < list.txt

while IFS=";" read ip port ; do nc -zw3 "${ip}" "${port}" && echo "${ip}:${port} => opened" || echo "${ip}:${port} =>  closed" ; done < list.txt
Mikhael Djekson
sumber
Bendera tunggu tidak tersedia / tidak akan berfungsi karena Anda bermaksud di sini untuk setiap versi nc , dapatkah Anda mencoba menjalankan salah satu nc -zw3shell Anda dengan satu port terbuka dan satu port tertutup dan lihat apakah itu benar-benar kembali setelah 3 detik?
BroSlow
ya, dengan membuka satu saya mendapat respons dalam 10 milidetik Connection to localhost 80 port [tcp/http] succeeded!dan dengan yang buruk, dalam 10 milidetik yang sama saya mendapatkan baris kosong.
Mikhael Djekson
Apa yang Anda gambarkan bekerja dengan sempurna untuk saya. Mengapa Anda mengatakan itu tidak berfungsi?
terdon

Jawaban:

1

Inilah perintah Nmap yang paling mendasar dan efisien untuk melakukan apa yang Anda inginkan (dan tidak lebih):

#!/bin/sh
# Gather the IPs to scan for each port
perl -lanF\; -e'push @{$p{$F[1]}}, $F[0];END{$,=" ";while(($x,$y)=each%p){print $x,@$y}}' input.txt | while read port ips; do
  # Scan the appropriate port for each set of IPs
  nmap -Pn -n -oG - -p $port $ips |\
  # Put the open ones into open.txt and the closed/filtered into closed.txt
  awk 'OFS=":";$4~/^Ports:/{if(/open/){print $2,'$port' >> "open.txt"}else{print $2,'$port' >> "closed.txt"}}'
done

Sayangnya, Nmap tidak memiliki cara bawaan untuk memindai hanya beberapa port pada beberapa IP dan port lain pada IP lain, jika tidak, ini bisa menjadi jauh lebih sederhana.

bonsaiviking
sumber
1
#!/bin/bash
N=0
cat $1 | while read line
do
    N=$((N+1))
    nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )" 
done

Penggunaan: ./script.sh Memindai file yang ditentukan dan menguji apakah setiap "$ ip; $ port" terbuka atau tertutup.

Jika Anda ingin mengurutkan output: ./script.sh | menyortir

Tidak diperlukan instalasi.

Sebagai satu baris yang dapat Anda tempel ke terminal Anda tanpa harus membuat skrip shell:

N=0; cat FILENAME | while read line; do; N=$((N+1)); nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )"; done
ecube
sumber
1

Hal termudah adalah menginstal nmap dari repos, lalu lakukan:

   awk -F ";" '{print $1}' data | xargs -L 1 nmap -p 80

di mana data adalah file dengan alamat IP yang akan dipindai.

Sunting:

Jika benar, seperti yang disarankan @pabouk di bawah, bahwa nomor yang mengikuti alamat IP adalah port yang akan dipindai, maka Anda dapat mencapai pemindaian yang diinginkan sebagai berikut:

   awk -F ";" '{print "nmap " $1 " -p" $2}' data | xargs -I % sh -c '%'

Jika Anda ingin memindai kedua port 80, dan port membaca dari file, Anda dapat melakukannya dengan perintah ini:

   awk -F ";" '{print "nmap " $1 " -p80," $2}' data | xargs -I % sh -c '%'

Jika nmap dianggap menghasilkan terlalu banyak output, perintah follwoing akan melakukan:

   awk -F ";" '{print "nmap -oG - " $1 " -p80," $2}' data | xargs -I % sh -c '%' | grep Ports
MariusMatutiae
sumber
Anda mengabaikan nomor port dari file data.
pabouk
Saya mengerti bahwa setiap baris file berisi pasangan ini untuk memindai: IP_address; pelabuhan . Juga nmapmenghasilkan banyak output (dalam hal ini berlebihan) dengan setiap proses.
pabouk
Masih menghasilkan banyak output sampah. Anda dapat menambahkan: "| grep tcp | sort" (tanpa tanda kutip) untuk menyingkirkan (sebagian besar) sampah dan bahkan mengurutkan output berdasarkan port.
ecube
Ya, nmap -oG - ... | grep Ports:itulah yang saya uji beberapa saat yang lalu. :)
pabouk