Menguji port TCP jarak jauh menggunakan telnet dengan menjalankan perintah satu baris

12

Saya memiliki banyak kotak linux dengan serangkaian perintah dan ruang disk yang sangat terbatas. Tetapi ada telnetperintah di atasnya.

Saya terhubung dari jarak jauh ke masing-masing probe ini (secara terprogram) dan mengeluarkan satu perintah linux baris melalui SSH.

Saya perlu menjalankan satu perintah untuk terhubung ke mesin tertentu, menggunakan telnet, dan kemudian putuskan segera .

Saya bisa melakukan semua itu, tetapi pemutusan bagian segera . Telnet membuka semacam konsol, atau terminal dan saya tidak dapat menemukan perintah satu baris untuk menjalankan perintah telnet dan kemudian memutuskan sambungan segera.

Jika saya melakukan itu, saya dapat dengan mudah mengurai output tekstual untuk pesan kesalahan karena tidak dapat terhubung ke mesin pada port yang ditentukan dan itulah yang saya cari.

Jadi bagaimana saya bisa menjalankan perintah satu baris untuk terhubung ke mesin menggunakan telnet dan putuskan sambungan setelahnya?

Muhammad Gelbana
sumber
Seperti yang saya mengerti klien Telnet Anda tidak mendukung pengiriman langsung?
IBr
@IBr, apa maksudmu?
Muhammad Gelbana
Perhatikan bahwa klien telent berbeda dalam kode keluar yang dilaporkan setelah perintah keluar sisi klien digunakan untuk menghentikannya. Jadi nol kode keluar tidak boleh dianggap sebagai sinyal port dibuka. Setidaknya tidak bekerja untuk RPM telel RHEL.
Oliver Gondža

Jawaban:

28

Anda harus dapat mengirimkan exitperintah ke STDIN telnet. Mencoba:

echo 'exit' | telnet {site} {port}

dan lihat apakah itu berhasil. (tampaknya berfungsi di server web saya, tetapi YMMV).

Charles Newey
sumber
mungkin bekerja tetapi tampaknya bodoh - telnet harus memiliki opsi untuk keluar atau sesuatu pada kontak pertama
Alexander Mills
10

Metode paling sederhana dan termudah diberikan di bawah ini.

 sleep <n> | telnet <server> <port>

n - Waktu tunggu dalam detik sebelum keluar otomatis. Bisa jadi fraksional seperti 0,5. Perhatikan bahwa beberapa output yang diperlukan mungkin tidak dikembalikan dalam waktu tunggu yang ditentukan. Jadi kita mungkin perlu meningkatkannya.

server - IP server target atau nama host.

port - Targetkan nomor port layanan.

Anda juga dapat mengarahkan output ke file seperti ini,

sleep 1 | telnet <server> <port> > output.log
Seff
sumber
Ini bekerja dengan sempurna! Sementara output memang diarahkan, saya perhatikan saya masih mendapatkan "Koneksi ditutup oleh tuan rumah asing." output di konsol saya setelah tidur daripada di file output.log. Adakah cara untuk mencegah hal ini?
dan
5

Dalam kasus saya ini berfungsi. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done
Chuss
sumber
1
Hei, ini bagus. Saya adalah pengguna di semua sistem Linux di pekerjaan saya, tetapi bukan admin (dan tidak memiliki hak admin). Saya muak meminta mereka untuk menginstal telnet setiap saat sehingga saya dapat menguji konektivitas jaringan (saya seorang insinyur jaringan). Ini adalah solusi yang sangat baik. Saya mengubahnya sedikit untuk melakukan lebih seperti telnet. Saya memberikan jawaban saya sendiri di sini dengan modifikasi.
theglossy1
3

Saya pikir alat yang lebih baik untuk mengirim perintah secara langsung dan hanya mendapatkan output adalah netcat. Ini hanya alat sederhana, tetapi kuat untuk menempatkan perintah melalui port. Anda dapat melihat contoh penggunaan dalam pertanyaan pengguna super ini: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - penanya memberikan contoh yang berfungsi di mana koneksi ditutup setelah beberapa detik.

Dan jika Anda hanya ingin menguji konektivitas gunakan ini: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

IBr
sumber
Saya mencoba menginstal netcat sekarang, tetapi saya tidak dapat melakukannya. Saya mengunduh versi powerpc kompilasi tetapi pustaka glibc tidak ada. Saya mengunduh versi powerpc yang dikompilasi tetapi perangkat tidak memiliki cukup ruang untuk menyalin file perpustakaan! Apakah mungkin pustaka glibc sudah ada tetapi netcat tidak dapat menemukannya?
Muhammad Gelbana
Netcat hanya diperlukan di sisi klien: pada server (probe) dapat menjadi telnet lama yang sama.
IBr
Glibc juga seharusnya sudah ada, digunakan pada banyak hal dalam sistem biasa.
IBr
Anda dapat mencoba menambahkan ke skrip telnet untuk && exitmelihat apakah skrip terputus (setidaknya dalam ssh sudah cukup).
IBr
&& exittidak bekerja Jika glibc harus ada dan saya percaya itu ada. Mengapa nc.traditionalmengeluh tentang hal itu seolah hilang?
Muhammad Gelbana
1

Ini adalah versi lain dari jawaban di atas yang membuatnya bertindak sedikit lebih seperti sintaks telnet "normal". Jika Anda menyukai jawaban saya, tolong beri upvote bukan untuk ini, tetapi untuk yang asli.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
theglossy1
sumber
1

Inilah solusi yang saya temukan di Internet:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

Ini bekerja untuk saya di SunOS & HP-UX

Vladimir
sumber
0

Mencoba

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

Bagian terbaik di atas adalah Anda mendapatkan status keluar juga. Jika telnet berhasil kode keluar akan menjadi 0 atau yang lain 1

Abhishek Kumar
sumber
0

Hindari netcat jika Anda memiliki rute khusus, karena tidak mematuhi aturan perutean. Mirip dengan caranya nslookup, dig& hostabaikan file / etc / hosts ( nslookup, gali, firefox mengabaikan / etc / hosts entri file ).

yaitu: tidak seperti aplikasi dan alat-alat seperti telnetdan /dev/tcp( Menguji port TCP jarak jauh menggunakan telnet dengan menjalankan perintah satu baris ) yang mengikuti aturan perutean sistem, ncmenggunakan gateway default kecuali jika secara khusus diperintahkan untuk menggunakan alamat IP sumber dengan -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Saya perlu menguji apakah aplikasi dapat mencapai sumber daya, dan jika rute turun, netcatmelaporkan bahwa semuanya baik-baik saja karena alamat sumber telah ditentukan dalam tes. Saya beralih menggunakan /dev/tcp.

legatoproteus
sumber