Telnet bağlantı noktasının kabuk betiğinde etkin olup olmadığını sınama


11

Telnet ile giriş yapmanın mümkün olup olmadığını test etmek için bir komut dosyası oluşturmaya çalışıyorum. Gerçekten giriş yapmak istemiyorum; bu nedenle beklemeye gerek yoktur. Sadece bir giriş istemi alıp alamayacağımı görmek istiyorum. Bu bir Linux sisteminden yapılıyor, bu yüzden kullanmaya çalışıyorum nc:

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

Sorun, konsolumun kilitlenmesine neden olmasıdır. -wGerçekten bağlantıyı kesmiyor gibi görünüyor .

Ben de telnet kullanmayı denedim ama script içindeki bağlantıyı kesemiyorum. çalışılıyor

\echo "\035" | telnet 192.168.10.5

bir giriş istemi almadan önce sonları.


Yanıtlar:


14

Bash, muhtemelen aşina olabileceğiniz sahte cihazlar sağlar /dev/null. Bununla birlikte , Bash komut dosyalarından da kullanabileceğiniz ağ bağlantılarını test etmek /dev/tcpve /dev/udptest etmek için başka cihazlar da vardır.

Bash'in adam sayfasından alıntı

Bash, aşağıdaki tabloda açıklandığı gibi, yönlendirmelerde kullanıldıklarında çeşitli dosya adlarını özel olarak işler:

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

Misal

İşte benim alan adı skinner adlı bir ana bilgisayar bağlantısını test ediyorum ve 22 numaralı bağlantı noktasına bağlanıp bağlanamayacağımı görüyorum.

NOT: Bağlantı noktası 22 SSH içindir, telnet kullanım bağlantı noktası 23 içindir.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Harika bir bağlantı noktası olmayan deneyelim:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Bu işe yarıyor, ama çok çirkin bir çıktı. Endişe etmeyin. echo > /dev/tcp/...Alt kabukta çalıştırabilir ve tüm çıktıları /dev/nullbiraz temizlemek için yeniden yönlendirebilirsiniz . Kabuk komut dosyalarınızda kullanabileceğiniz desen şunlardır:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

Özellikle test etmek istiyorsanız, telnetvarsayılan olarak 23 numaralı bağlantı noktasında çalışır, bu nedenle slm 22 ve 223'ü kullandığında 23 kullanın.
Warwick

@Warwick - teşekkürler, bunu örnekler bölümüne not olarak ekledim.
slm

@sim yorum için teşekkürler. Bunu daha önce görmüştüm ama bununla çalışmayı başaramadım. Benim sorunum grep veya bir giriş istemi için test edebilmek gerekir olmasıdır. Bu durumda konsol kilitlenir ve oturum açma istemi yoktur. # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 bana bir giriş istemi verir ama ondan kurtulmak mümkün değil.
rleon

1
vay .. orada yönlendirme bir sürü. # cat afile ^] koştuktan sonra sadece mola yankılanıyor afile. Hala onunla oynuyor ama neredeyse orada olduğumu hissediyorum.
rleon

7

Kullanarak doğru yoldasınız nc, ancak bağlantıyı kurabilip kuramayacağınızı-z gerçekten test etmek istiyorsanız, nc'nin anahtarını kullanın :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

bu tüm sistemlerde çalışmaz, nc'm -z bayrağına sahip değil
Shapeshifter

İlginç. Bu hangi sürüm nc?
DopeGhoti

CentOS 7'deyim ve nc, şu seçeneğe sahip olmayan nmap-ncat ile değiştirildi :(
Shapeshifter

Doğru hatırlarsam, CentOS'ta istediğiniz paket basittir nc.
DopeGhoti

nc centos 7 nmap-ncat olduğunu
Shapeshifter

2

Cevabın biraz geç olduğunu biliyorum, ama bunu nasıl yapacağımı araştırıyordum ve nc'yi kullanmak güvenlik nedeniyle bir seçenek değildi, bu yüzden burada birisine yardımcı olabilir.

İlk yankıda eksik olan -e anahtarıydı:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

Ve bir newline + bağlantıyı kestikten sonra telnet'ten çıkmak için quit komutu. Gibi:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Açıkçası aynı bir blok tarzı if deyimi kullanırsanız ve $ değerlendirmek çalışır? başlangıçta yaptığınız gibi:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Biz nc giderken, nc'nin hangi lezzetine sahip olduğunuza bağlıdır (gnu ncat vs nmap-ncat). Gnu -z anahtarına sahip olacaktır:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

diğeri olmayacak ve sıkışmamak için nc'nize boş bir boru döşemeniz gerekecek:

echo | nc 10.0.0.1 23
# (evaluate $? here)

1

nc -z 192.168.10.5 23komut isteminde çalıştırın veya bu komutu çalıştırmak için bir bash betiği oluşturun.

Bağlantı başarılı olursa aşağıdaki ifadeyi döndürür.

192.168.10.5 23 bağlantı noktasına [tcp / *] bağlantı başarılı!

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.