Dari skrip bash bagaimana saya bisa dengan cepat mengetahui apakah port 445
terbuka / mendengarkan di server.
Saya telah mencoba beberapa opsi, tetapi saya menginginkan sesuatu yang cepat:
1. lsof -i :445
(Membutuhkan detik)
2. netstat -an |grep 445 |grep LISTEN
(Membutuhkan detik)
3. telnet
(tidak kembali)
4. nmap
, netcat
tidak tersedia di server
Akan menyenangkan mengetahui cara yang tidak disebutkan pertama dan menggerutu setelah itu.
netstat -lnt
(dengan-t
dan tanpa-a
) akan membatasi output hanya untuk mendengarkan koneksi TCP. Mungkin sedikit mempercepat. Anda dapat menambahkan-4
untuk IPv4 hanya jika Anda tidak membutuhkan IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Jika output kosong, port tidak digunakan.lsof
lambat bagi Anda, tetapi biasanya ini adalah solusi terbaik yang Anda daftarkan.netstat
Solusi Anda tidak terlalu andal (Anda dapat menebaknya kapan saja Anda gunakangrep
; toh itu akan kembali benar jika seseorang mendengarkan misalnya 4450).telnet
dannetcat
sebenarnya berusaha membuat koneksi, yang mungkin tidak selalu seperti yang Anda inginkan.Jawaban:
Kejutan yang saya temukan baru-baru ini adalah bahwa Bash secara native mendukung koneksi tcp sebagai deskriptor file . Menggunakan:
Saya menggunakan 6 sebagai deskriptor file karena 0,1,2 adalah stdin, stdout, dan stderr. 5 kadang-kadang digunakan oleh Bash untuk proses anak , jadi 3,4,6,7,8, dan 9 harus aman.
Sesuai komentar di bawah ini, untuk menguji mendengarkan di server lokal dalam skrip:
Untuk menentukan apakah seseorang mendengarkan, cobalah untuk terhubung dengan loopback. Jika gagal, maka port ditutup atau kami tidak diizinkan mengakses. Setelah itu, tutup koneksi.
Ubah ini untuk kasus penggunaan Anda, seperti mengirim email, keluar dari skrip pada kegagalan, atau memulai layanan yang diperlukan.
sumber
/dev/tcp/IP/PORT
pohonAda yang sangat singkat dengan "jawaban cepat" di sini: Bagaimana cara menguji apakah port TCP jarak jauh dibuka dari skrip Shell?
Saya menggunakannya dengan 127.0.0.1 sebagai alamat "jarak jauh".
ini mengembalikan "0" jika port terbuka dan "1" jika port ditutup
misalnya
sumber
Anda dapat menggunakan netstat dengan cara ini untuk hasil yang jauh lebih cepat:
Di Linux:
Di Mac:
Ini akan menampilkan daftar proses mendengarkan pada port (445 dalam contoh ini) atau tidak akan menghasilkan apa-apa jika port tersebut gratis.
sumber
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Alih-alih memeriksa titik sebelum nomor port dengan\.80
, saya menggunakan80$
. Jika tidak, ini juga cocok dengan alamat IP yang berisi.80
dan port yang dimulai dengan80
seperti8000
.Anda dapat menggunakan netcat untuk ini.
terhubung ke server dan langsung menutup koneksi lagi. Jika netcat tidak dapat terhubung, ia akan mengembalikan kode keluar yang tidak nol. Kode keluar disimpan dalam variabel $ ?. Sebagai contoh,
akan mengembalikan 0 jika dan hanya jika netcat berhasil terhubung ke port.
sumber
nc
memiliki-z
bendera untuk tujuan ini, yang tidak memerlukan input dari/dev/null
. Sudah ada jawaban menggunakan-z
bendera di atas.Berdasarkan jawaban Spencer Rathbun, menggunakan bash:
sumber
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
mereka terdaftar di / proc / net / tcp.
itu kolom kedua, setelah ":", dalam hex:
jadi saya kira salah satunya
:50
di kolom ketiga harus stackoverflow: o)lihat
man 5 proc
lebih detail. dan memilih yang terpisah dengan sed dll dibiarkan sebagai latihan untuk pembaca yang lembut ...sumber
2ms cukup cepat?
Tambahkan titik dua dan ini berfungsi di Linux
sumber
ss
bahkan lebih cepat dari slighltync
.l
adalah untuk mendengarkan ,4
untuk IPv4;sport
singkatan dari (tentu saja) port sumber . Perintah di atas mengasumsikan port TCP mendengarkan (t
opsi): gunakanu
opsi untuk UDP, atau tidak ada dari mereka untuk kedua protokol. Info lebih lanjut tentangss
seperti biasa di Nixcraft . CATATAN:ss
filter tidak berfungsi di sini, tidak tahu mengapa (bash 4.3.11, ss utility, iproute2-ss131122), harus menggunakan grep .ss
perintah itu tidak mengembalikan kode keluar yang mencerminkan temuannya; selalu mengembalikan 0 kode keluar.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
dan sekarang? Apa artinya ini?Inilah yang berfungsi untuk Mac dan Linux:
sumber
[\\.\:]
.Di mana 8000 adalah nomor port. Jika port gratis, itu akan memulai server yang dapat Anda tutup dengan mudah. Jika tidak maka akan menimbulkan kesalahan:
sumber
Saya ingin memeriksa apakah port terbuka di salah satu server pengujian linux kami. Saya dapat melakukannya dengan mencoba terhubung dengan telnet dari mesin dev saya ke server pengujian. Pada mesin dev coba jalankan:
Dalam contoh ini saya ingin memeriksa apakah port 8080 terbuka di host test2.host.com
sumber
tcping adalah alat yang hebat dengan overhead yang sangat rendah. Ini juga memiliki argumen batas waktu untuk membuatnya lebih cepat:
sumber
Anda dapat menggunakan perintah netcat juga
atau
-z - mengatur nc untuk hanya memindai daemon yang mendengarkan, tanpa benar-benar mengirim data apa pun kepada mereka.
-v - mengaktifkan mode verbose.
sumber
nmap
adalah alat yang tepat. Cukup gunakannmap example.com -p 80
Anda dapat menggunakannya dari server lokal atau jauh. Ini juga membantu Anda mengidentifikasi jika firewall memblokir akses.
sumber
Jika Anda menggunakan iptables coba:
atau
sumber