Apa alternatif untuk memeriksa port terbuka, selain telnet?

24

Kita dapat menggunakan yang berikut untuk menguji port VIA telnet; dalam contoh berikut ini kami menguji port 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Karena pada beberapa mesin kita tidak dapat menggunakan telnet (untuk alasan internal) apa saja alternatif untuk memeriksa port, sebagai telnet?

yael
sumber
Apakah perl opsi?
Jeff Schaller
5
"Alasan internal" itu mungkin menghalangi Anda untuk menggunakan perangkat lunak pemindaian port lain. Saya tahu seorang pria yang bekerja di bank dan memiliki kontraknya diputus karena dia punya salinan nmap pada PC-nya. Dia menggunakannya untuk tujuan yang berhubungan dengan pekerjaan, tapi itu di daftar terlarang, sehingga ia dikawal keluar dari gedung.
Roger Lipscombe
2
Apakah perl opsi? - YA
yael
2
Perhatikan bahwa telnet adalah protokol yang canggih. The telnetutilitas mematikan perilaku protokol jika port diberikan pada baris perintah. Maka itu berperilaku seperti netcat, hanya dengan deteksi garis akhir.
rexkogitans
Yang lebih operasi-sistem pertanyaan agnostik, yang bahkan tidak mengisyaratkan port scanning, adalah unix.stackexchange.com/questions/499694 .
JdeBP

Jawaban:

23

Jika menggunakan Bash Shell, maka Anda dapat menggunakan fitur-fiturnya untuk memeriksa apakah port terbuka atau tertutup:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Perhatikan bahwa jika server tidak merespons setelah 1 detik batas waktu tercapai, perintah antara 'terputus, dan dengan demikian tidak ada yang dicetak.

in2nix4life
sumber
5
Mungkin Anda harus menggunakan nama host dari pertanyaan (kafka02) alih-alih 127.0.0.1, yang membuatnya terlihat hanya berfungsi dengan loopback.
Dmitry Grigoryev
1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nulltidak mencetak apa pun untuk saya. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullbekerja seperti yang diharapkan (mencetak PORT TUTUP). Perhatikan lokasi '.
tharpy
apa yang kamu dapatkan di bash -c '</ dev / tcp / kafka01 / 6667'
yael
lalu echo $? (jika 0 maka port terbuka,)
yael
IIRC fitur bash ini dulu dinonaktifkan di Debian beberapa waktu lalu. Ini trik yang rapi tetapi tidak selalu berhasil.
AnonymousLurker
32

netcat adalah salah satu opsi.

nc -zv kafka02 6667
  • -z = set nc untuk hanya memindai daemon yang mendengarkan, tanpa benar-benar mengirim data apa pun kepada mereka
  • -v = mengaktifkan mode verbose
steve
sumber
apakah mungkin untuk mendapatkan output standar dari nc? karena saya ingin menulis di skrip bash saya
yael
2
Baca dokumentasinya! Tanpa opsi ncberperilaku seperti telnet.
Henrik - berhenti menyakiti Monica
ya saya membaca dokumen tetapi -w flag tidak berfungsi sebagai batas waktu
yael
contoh - c -v -w 1 kafka01 6667 (kami tidak mendapatkan batas waktu)
yael
nc -v -w 3 kafka01 6667 Ncat: Versi 6.40 ( nmap.org/ncat ) Ncat: Terhubung ke 10.164.235.85:6667. (ini masih menggantung)
yael
23

Standar emas tidak diragukan lagi nmap( nmap.org ), tetapi biasanya membutuhkan root untuk "hasil terbaik". Namun, binari mandiri tersedia dan dimungkinkan untuk menjalankannya sebagai pengguna yang tidak terjangkau, hanya dengan kemampuan terdegradasi. Misalnya, alih-alih synpemindaian sembunyi-sembunyi ( -sS), ia kembali ke pemindaian koneksi TCP standar ( -sT). Ini secara fungsional setara dengan netcat, tetapi dengan multi-host yang bagus, kemampuan dipercepat yang dimilikinya.

Sebuah contoh:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
Landak
sumber
1
di sebagian besar organisasi nmap dianggap sebagai alat pemindaian dan seseorang tidak dapat menggunakan nmap tanpa otorisasi yang tepat. Juga jika itu adalah contoh EC2, otorisasi juga diperlukan dari AWS.
al mamun
4

Jika Perl adalah suatu pilihan, Anda dapat menggunakan IO::Socketmodulnya untuk menguji koneksi ke host dan port tertentu; skrip di bawah hard-codes TCP sebagai protokol (yang akan digunakan oleh telnet):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Contoh keluaran dari port tertutup:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Contoh keluaran dari port terbuka:

$ ./above-script kafka02 4200
Success!
Jeff Schaller
sumber
2

File perangkat / dev / tcp dan / dev / udp dapat digunakan sebagai ganti telnet. Contoh: echo 0> /dev/tcp/103.64.35.86/6667. Kemudian periksa status keluar menggunakan #echo $? . Jika status keluar adalah 0 maka port terbuka. Jika status keluar bukan nol maka port ditutup. Untuk memeriksa paket udp, gunakan echo 0> /dev/udp/103.64.35.86/6667.

al mamun
sumber
di redhat 7 saya di bawah / dev /, kami tidak punya tcp
yael
ls / dev / tcp / ls: tidak dapat mengakses / dev / tcp /: Tidak ada file atau direktori seperti itu
yael
di OS mana Anda mengujinya?
yael
@el, Anda tidak akan mendapatkan / dev / tcp atau / dev / udp sementara ls. coba perintah yang sama persis di shell Anda dan Anda akan mendapatkan hasilnya. Ngomong-ngomong, saya sering menggunakannya di RHEL6,7
al mamun
0
ss -lt 

ini adalah perintah lain yang bisa Anda gunakan.

Dileep Jayasundara
sumber
Ini hanya berfungsi untuk mesin lokal, saya percaya pertanyaannya adalah tentang memeriksa port terbuka dari host jarak jauh.
Alex Baranowski