Periksa status satu port pada host jarak jauh [tertutup]

158

Saya memerlukan baris perintah yang dapat memeriksa status port pada host jarak jauh. Saya mencoba ping xxx.xxx.xxx.xxx:161tetapi tidak mengenali "tuan rumah". Saya pikir itu adalah jawaban "baik" sampai saya melakukan perintah yang sama terhadap host yang saya tahu memiliki port terbuka. Ini untuk file batch pada Windows yang akan memeriksa status port jarak jauh kemudian menjalankan perintah yang menggunakan port jarak jauh untuk informasi, kemudian perintah port jarak jauh lagi, kemudian perintah yang menggunakan port itu di server berikutnya untuk informasi , dan seterusnya. Saya telah melihat ke mana-mana dan berpikir ping mungkin melakukannya, tetapi harus ada berbagai versi ping, saya kira server yang saya lakukan tidak menunjukkan opsi itu.

Hanya untuk terkekeh, saya mencoba pemeriksa port jarak jauh berbasis web dari sebuah situs web - dan hasilnya benar untuk server "masalah" dan server yang benar. Namun, saya tidak bisa menggunakannya dalam batch yang dijalankan dengan 500+ server IP di dalamnya.

Adakah sesuatu yang bisa saya lakukan yang sederhana? Keterampilan Perl saya sangat berkarat (gunakan atau hilang), tidak tahu bahasa berbasis Windows lainnya kecuali batch. Unix adalah keahlian saya, tetapi ini harus dijalankan dari Widows Server 2003.

Ross Ridge
sumber
5
Anda mungkin ingin mencoba menanyakan ini di serverfault.com
John Rasch
1
Seseorang sudah melakukan ini: serverfault.com/questions/309357/ping-a-specific-port
Vadzim
1
Ketika pertanyaan ini ditutup, saya sudah menjawab di sini
npocmaka
windows ps> tnc xxx.xxx.xxx.xxx -port 161
Moslem Shahsavan

Jawaban:

151

Anda sepertinya mencari pemindai port seperti nmap atau netcat , yang keduanya tersedia untuk Windows, Linux, dan Mac OS X.

Sebagai contoh, periksa telnet pada ip yang dikenal:

nmap -A 192.168.0.5/32 -p 23

Misalnya, cari port terbuka dari 20 hingga 30 di host.example.com:

nc -z host.example.com 20-30
Glenn
sumber
Keduanya tersedia untuk Windows.
Glenn
1
perintah nmap Anda seharusnya nyata "-p23" tanpa spasi. nmap memperlakukan setiap unit yang tidak segera didahului oleh bendera sebagai tujuan pemindaian yang terpisah
Brandon Lebedev
14
seharusnya nc -zv host.example.com 20-30. kalau tidak, tidak ada output
Aryeh Beitz
1
Opsi -zuntuk nctidak tersedia di Linux.
valentin_nasta
1
@valentin_nasta ya, mungkin tergantung pada versi netcat yang Anda gunakan (gnu atau openbsd). Berikut ini adalah baris yang relevan dari halaman manual untuk nc (versi openbsd) di sistem Arch linux saya: -z Menentukan bahwa nc harus memindai untuk mendengarkan daemon, tanpa mengirim data apa pun kepada mereka. Ini adalah kesalahan untuk menggunakan opsi ini bersamaan dengan opsi -l
pgoetz
126

Di Command Prompt, Anda dapat menggunakan perintah telnet .. Misalnya, untuk menyambung ke IP 192.168.10.1 dengan port 80,

telnet 192.168.10.1 80

Untuk mengaktifkan telnet di Windows 7 dan di atas, klik . Dari artikel yang ditautkan, aktifkan telnet melalui panel kontrol -> program dan fitur -> fitur windows -> klien telnet, atau jalankan saja ini di prompt admin:

dism /online /Enable-Feature /FeatureName:TelnetClient
Naveen Yedugani
sumber
3
Ini adalah metode termudah jika telnet diinstal pada perangkat Windows
pengguna linux shonky
30
... dan perlu 2 detik untuk menambahkannya ke windows (8.1 dalam kasus saya)> Panel Kontrol> Tambah Program> Aktifkan fitur windows
Chris Moutray
14
Sekadar info: jika port tidak terbuka: Menghubungkan Ke ##### ... Tidak dapat membuka koneksi ke host, pada port ####: Koneksi gagal; Dan jika port terbuka Anda akan berakhir di telnet (CTRL +] lalu 'berhenti')
blackstrype
27

Untuk keperluan skrip, saya menemukan bahwa curlperintah dapat melakukannya, misalnya:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Mungkin ini mungkin tidak akan berfungsi untuk semua layanan, karena curldapat mengembalikan kode kesalahan yang berbeda dalam beberapa kasus (sesuai komentar), jadi menambahkan kondisi berikut ini dapat bekerja dengan cara yang dapat diandalkan:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Catatan: Ditambahkan -m5untuk mengatur batas waktu koneksi maksimum 5 detik.

Jika Anda ingin memeriksa apakah host juga valid, Anda perlu memeriksa 6kode keluar juga:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Untuk memecahkan masalah kode kesalahan yang dikembalikan, cukup jalankan curl host:port:, misalnya:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Lihat: man curluntuk daftar lengkap kode keluar.

kenorb
sumber
Sayangnya ini tidak bekerja untuk saya (setidaknya di bash di OS X).
Mike Atlas
1
Layanan khusus. FWIW itu semacam-karya: curl $IP:$PORThasil: curl: (52) Empty reply from server(versus curl: (7) Failed to connect) tetapi seperti nc, saya tidak bisa | grep Emptyuntuk pernyataan output ini seperti yang mungkin diharapkan (sesuatu tentang baris baru atau kurangnya output langsung?). Saya kira baris Anda tergantung dari kode keluar, kan? Saya di El Cap; mungkin di versi atau OS lain negara kegagalan keluar -1daripada 52?
Mike Atlas
Ya itu akan melakukannya. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Mike Atlas
Pertanyaannya adalah tentang Windows, yang jelas tidak memiliki eg / dev / null
Arthur Tacca
@ArthurTacca Anda selalu dapat menggunakan Subsistem Windows untuk Linux (WSL).
kenorb
23

Tekan Windows+ Rketik cmddanEnter

Pada tipe command prompt

telnet "machine name/ip" "port number"

Jika port tidak terbuka, pesan ini akan menampilkan:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

Kalau tidak, Anda akan dibawa ke port yang dibuka (layar kosong akan ditampilkan)

Leo
sumber
7
Perhatikan bahwa telnet tidak diinstal secara default pada sistem windows modern. Anda harus menginstalnya dari panel kontrol Add / Remove Windows Features.
Greg
1
@ Greg atau menggunakan alat online seperti telnet-online.net
oz
2
@ Oo benar, kecuali jika Anda memeriksa status server internal
Greg
bekerja pada Windows10
gaurav
19

Gunakan perintah nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Anda juga dapat menggunakan perintah telnet

telnet <ip/host> port
minhas23
sumber
4

nc atau 'netcat' juga memiliki mode pemindaian yang mungkin berguna.

caskey
sumber
3
Di Mac "nc -zv server port-range"
Vijay Kumar
2

Saya pikir Anda sedang mencari Hping ( http://www.hping.org/ ), yang memiliki versi Windows.

"Antarmukanya terinspirasi oleh perintah unix ping (8), tetapi hping tidak hanya dapat mengirim permintaan gema ICMP. Ia mendukung TCP, UDP, ICMP ..."

Ini juga sangat berguna jika Anda ingin melihat di mana sepanjang rute port TCP sedang diblokir (seperti oleh firewall), di mana ICMP mungkin tidak.

Keturunan asli
sumber
2

Di Bash, Anda dapat menggunakan file perangkat semu yang dapat membuka koneksi TCP ke soket terkait. Sintaksnya adalah /dev/$tcp_udp/$host_ip/$port.

Ini adalah contoh sederhana untuk menguji apakah Memcached berjalan:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Berikut ini adalah tes lain untuk melihat apakah situs web tertentu dapat diakses:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Untuk info lebih lanjut, periksa: Panduan Script Bash Lanjutan: Bab 29. /devdan/proc .

Terkait: Uji apakah port pada sistem jarak jauh dapat dijangkau (tanpa telnet) di SuperUser.

Untuk contoh lebih lanjut, lihat: Cara membuka soket TCP / UDP di bash shell (artikel).

kenorb
sumber
1
Wow, ini jenius! Saya tidak tahu ini mungkin hanya dengan bash. Sangat nyaman bagi orang-orang seperti saya yang hanya menginstal git bash di Windows dan tidak ingin menginstal layanan lain.
dotslashlu