Kejutan yang saya temukan baru-baru ini adalah bahwa Bash secara native mendukung koneksi tcp sebagai deskriptor file. Untuk menggunakan:
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
Saya menggunakan 6 sebagai deskriptor file karena 0,1,2 adalah stdin, stdout, dan stderr. 5 terkadang digunakan oleh Bash untuk proses anak, jadi 3,4,6,7,8, dan 9 seharusnya aman.
Sesuai komentar di bawah, untuk menguji mendengarkan di server lokal dalam skrip:
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
Untuk menentukan apakah seseorang mendengarkan, coba sambungkan dengan loopback. Jika gagal, maka port tersebut tertutup atau kita tidak diperbolehkan mengakses. Setelah itu, tutup koneksi.
Ubah ini untuk kasus penggunaan Anda, seperti mengirim email, keluar dari skrip jika gagal, atau memulai layanan yang diperlukan.
Ada yang sangat singkat dengan "jawaban cepat" di sini :Bagaimana cara menguji apakah port TCP jarak jauh dibuka dari skrip Shell?
nc -z <host> <port>; echo $?
Saya menggunakannya dengan 127.0.0.1 sebagai alamat "jarak jauh".
ini mengembalikan "0" jika port terbuka dan "1" jika port ditutup
mis.
nc -z 127.0.0.1 80; echo $?
-z Menentukan bahwa nc hanya perlu memindai daemon yang mendengarkan, tanpa mengirimkan data apa pun kepada mereka. Merupakan kesalahan untuk menggunakan opsi ini bersamaan dengan opsi -l.
Anda dapat menggunakan netstat dengan cara ini untuk hasil yang jauh lebih cepat:
Di Linux:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Di Mac:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Ini akan menampilkan daftar proses yang mendengarkan pada port (445 dalam contoh ini) atau tidak akan menghasilkan apa-apa jika port tersebut gratis.
Anda dapat menggunakan netcat untuk ini.
nc ip port < /dev/null
terhubung ke server dan langsung menutup koneksi lagi. Jika netcat tidak dapat terhubung, ia mengembalikan kode keluar bukan nol. Kode keluar disimpan dalam variabel $?. Sebagai contoh,
nc ip port < /dev/null; echo $?
akan mengembalikan 0 jika dan hanya jika netcat berhasil terhubung ke port.