Tek satırlık bir komut çalıştırarak telnet kullanarak uzak TCP bağlantı noktasını sınama


12

Çok sınırlı komutlar ve disk alanı olan çok sayıda linux kutum var. Ama telnetüzerinde komut var.

Bu probların her birine uzaktan (programlı olarak) bağlarım ve SSH aracılığıyla bir satır linux komutu veriyorum.

Telnet kullanarak belirli bir makineye bağlanmak için tek bir komut çalıştırmam ve hemen bağlantıyı kesmem gerekiyor .

Tüm bunları yapabilirim, ama bağlantı kesilmesi hemen . Telnet bir tür konsol veya terminal açar ve telnet komutunu çalıştırmak ve hemen bağlantıyı kesmek için tek satırlık bir komut bulamıyorum.

Bunu yaparsam, belirtilen bağlantı noktasındaki makineye bağlanamadığım için hata çıktıları için metin çıktısını kolayca ayrıştırabilirim ve tam olarak aradığım şey budur.

Peki telnet kullanarak bir makineye bağlanmak ve daha sonra bağlantıyı kesmek için tek satırlık bir komutu nasıl çalıştırabilirim?


Anladığım kadarıyla Telnet istemciniz doğrudan göndermeyi desteklemiyor mu?
IBr

@IBr, ne demek istiyorsun?
Muhammed Gelbana

Telent istemcilerinin, istemci tarafı çıkış komutu sonlandırmak için kullanıldıktan sonra bildirilen çıkış kodunda farklı olduğunu unutmayın. Bu nedenle sıfır çıkış kodu, portun açıldığı bir sinyal olarak düşünülmemelidir. En azından RHEL telent RPM için çalışmaz.
Oliver Gondža

Yanıtlar:


28

Sen boruya yapabilmelidir exitiçinde STDIN içine komut telnet. Deneyin:

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

ve işe yarayıp yaramadığına bakın. (web sunucumda çalışıyor gibi görünüyor, ancak YMMV).


işe yarayabilir, ancak aptal gibi görünüyor - telnet'in ilk temasta çıkma seçeneği veya bir şey olması gerekir
Alexander Mills

10

En basit ve en kolay yöntem aşağıda verilmiştir.

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

n - Otomatik çıkıştan önceki saniye cinsinden bekleme süresi. 0.5 gibi kesirli olabilir. Bazı gerekli çıkışların belirtilen bekleme süresinde döndürülemeyebileceğini unutmayın. Dolayısıyla buna göre artmamız gerekebilir.

sunucu - Hedef sunucu IP'si veya ana bilgisayar adı.

port - Hedef hizmet port numarası.

Çıktıyı bunun gibi bir dosyaya da yönlendirebilirsiniz,

sleep 1 | telnet <server> <port> > output.log

Mükemmel çalışıyor! Çıktı gerçekten yeniden yönlendirilirken, "Bağlantı yabancı ana bilgisayar tarafından kapatıldı" mesajını almaya devam ettiğimi fark ettim. output.log dosyası yerine uykudan sonra konsolumdaki çıktı. Bunu önlemenin bir yolu var mı?
dan

5

Benim durumumda bu işe yarıyor. (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

1
Hey, bu harika. İşimdeki tüm Linux sistemlerinde kullanıcıyım, ancak yönetici değilim (ve yönetici haklarına sahip değilim). Ağ bağlantısını test edebilmem için her zaman telnet yüklemelerini istemekten bıktım (ağ mühendisiyim). Bu mükemmel bir çözümdür. Telnet gibi daha fazla performans göstermeyi biraz değiştirdim. Değişiklikleri burada kendi cevabımı verdim.
theglossy1

3

Doğrudan komut göndermek ve sadece çıktı almak için daha iyi bir araç netcat olacağını düşünüyorum. Sadece basit ama güçlü bağlantı noktaları üzerinden komutları koymak için güçlü bir araç. Bu süper kullanıcı sorusunda kullanım örneğini görebilirsiniz: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - asker çalışma örneği verir birkaç saniye sonra bağlantı kapanır.

Ve sadece bağlantıyı test etmek istiyorsanız bunu kullanın: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


Şu anda netcat'i kurmaya çalışıyorum ama yapamıyorum. Derlenmiş bir powerpc sürümünü indirdim ama glibc kütüphanesi eksikti. Derlenmiş bir powerpc sürümünü indirdim ancak cihazın kütüphane dosyalarını kopyalamak için yeterli alanı yoktu! Glibc kütüphanesinin zaten mevcut olması mümkün, ancak netcat kütüphaneyi bulamıyor mu?
Muhammed Gelbana

Netcat sadece istemci tarafında gereklidir: sunucuda (prob) aynı düz eski telnet olabilir.
IBr

Ayrıca Glibc zaten mevcut olmalı, normal sistemde birçok şeyde kullanılır.
IBr

Telnet komut dosyalarına && exitbağlantısının kesilip kesilmediğini görmek için deneyebilirsiniz (en azından ssh içinde yeterlidir).
IBr

&& exitişe yaramadı. Eğer glibc olmalı ve inanıyorum. Neden nc.traditionaleksikmiş gibi şikayet ediyorsun?
Muhammad Gelbana

2

Bu, yukarıdaki cevabın "normal" telnet sözdizimi gibi biraz daha hareket etmesini sağlayan başka bir sürümüdür . Cevabımı beğenirseniz, lütfen buna değil, orijinaline bir oy verin.

#!/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

1

İşte internette bulduğum çözüm:

( 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

Benim için SunOS ve HP-UX üzerinde çalışıyor


0

Deneyin

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

Yukarıdakilerin en iyi yanı, çıkış durumunu da almanızdır. Telnet başarı ise çıkış kodu 0 veya onun 1 olacaktır


0

Özel rotalarınız varsa netcat'ten kaçının, çünkü yönlendirme kurallarına uymaz. Benzer nasıl nslookup, dig& host/ etc / hosts dosyası (görmezden nslookup, kazar, firefox görmezden / etc / hosts dosyası girişleri ).

ie: sistemin yönlendirme kurallarına uyan telnetve /dev/tcp(( tek satırlık bir komut çalıştırarak telnet kullanarak uzak TCP bağlantı noktasını test etme) gibi uygulama ve araçlardan farklı ncolarak, özellikle aşağıdakilerle bir kaynak IP adresi kullanması belirtilmedikçe varsayılan ağ geçidini kullanır -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Bir uygulamanın kaynağa ulaşıp ulaşamayacağını sınamam gerekiyordu ve yollar kapatılmışsa, netcatkaynak adres testte belirtildiğinden beri her şeyin iyi olduğunu bildirdi. Ben kullanmaya geçiyorum /dev/tcp.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.