ทดสอบว่าพอร์ตเทลเน็ตแอ็คทีฟภายในเชลล์สคริปต์หรือไม่


11

ฉันกำลังพยายามสร้างสคริปต์เพื่อทดสอบว่าสามารถเข้าสู่ระบบผ่าน telnet ได้หรือไม่ ฉันไม่ต้องการที่จะเข้าสู่ระบบจริงๆ; ดังนั้นจึงไม่จำเป็นต้องคาดหวัง ฉันแค่ต้องการดูว่าฉันสามารถรับพร้อมท์การเข้าสู่ระบบได้หรือไม่ สิ่งนี้ทำจากระบบ Linux ดังนั้นฉันพยายามใช้nc:

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

ปัญหาคือสิ่งนี้ทำให้คอนโซลของฉันล็อค ดูเหมือนว่า-wจะไม่ได้ลดลงการเชื่อมต่อ

ฉันพยายามใช้ telnet ด้วย แต่ฉันไม่สามารถหยุดการเชื่อมต่อจากภายในสคริปต์ได้ พยายาม

\echo "\035" | telnet 192.168.10.5

หยุดพักก่อนที่ฉันจะได้รับพรอมต์การเข้าสู่ระบบ


เป็นไปได้ซ้ำซ้อนของsuperuser.com/questions/621870/…
vschum

คำตอบ:


14

/dev/nullทุบตีให้อุปกรณ์หลอกว่าคุณจะคุ้นเคยกับการเช่น อย่างไรก็ตามมีอุปกรณ์อื่น ๆ เช่น/dev/tcpและ/dev/udpสำหรับทดสอบการเชื่อมต่อเครือข่ายซึ่งคุณสามารถใช้จากภายในสคริปต์ Bash ได้เช่นกัน

ตัดตอนมาจากหน้าคนของ Bash

Bash จัดการชื่อไฟล์หลายชื่อเป็นพิเศษเมื่อใช้ในการเปลี่ยนเส้นทางดังอธิบายในตารางต่อไปนี้:

          /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.

ตัวอย่าง

นี่ฉันกำลังทดสอบการเชื่อมต่อกับโฮสต์ในโดเมนของฉันชื่อ skinner และดูว่าฉันสามารถเชื่อมต่อกับพอร์ต 22 ได้ไหม

หมายเหตุ:พอร์ต 22 ใช้สำหรับ SSH สำหรับ telnet ใช้พอร์ต 23

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

เยี่ยมมากลองทำไม่ได้พอร์ต:

$ 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

ได้ผลดี แต่มันออกมาน่าเกลียดมาก ไม่ต้องกังวลไป คุณสามารถเรียกใช้การecho > /dev/tcp/...ใน subshell และเปลี่ยนเส้นทางผลลัพธ์ทั้งหมด/dev/nullเพื่อล้างข้อมูลได้เล็กน้อย นี่คือรูปแบบที่คุณสามารถใช้ภายในเชลล์สคริปต์ของคุณ:

$ (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

หากคุณต้องการทดสอบเป็นtelnetพิเศษแสดงว่าโดยค่าเริ่มต้นจะทำงานบนพอร์ต 23 ดังนั้นที่ slm ใช้ 22 และ 223 ให้ใช้ 23.
Warwick

@Warwick - ขอบคุณฉันได้เพิ่มว่าเป็นบันทึกในส่วนตัวอย่าง
slm

@sim ขอบคุณสำหรับความคิดเห็น ฉันเคยเห็นสิ่งนี้มาก่อน แต่ฉันไม่สามารถทำให้มันทำงานได้ ปัญหาของฉันคือฉันต้องสามารถ grep หรือทดสอบสำหรับการแจ้งให้เข้าสู่ระบบ ในกรณีนี้คอนโซลถูกล็อคและไม่มีพรอมต์ล็อกอิน # 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 ให้พรอมต์การเข้าสู่ระบบ แต่ฉันไม่สามารถแยกออกจากกันได้
rleon

1
ว้าว .. มีการเปลี่ยนเส้นทางที่นั่น หลังจากทำงานว่ามันเป็นเพียงการสะท้อนแบ่งไป# cat afile ^] afileยังคงเล่นกับมัน แต่ฉันรู้สึกว่าฉันเกือบจะอยู่ที่นั่น
rleon

7

คุณกำลังใช้ที่ถูกต้องncแต่ถ้าคุณต้องการทดสอบว่าคุณสามารถสร้างการเชื่อมต่อได้หรือไม่ให้ใช้สวิตช์ของ nc-z :

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

สิ่งนี้ใช้ไม่ได้กับทุกระบบ nc ของฉันไม่มีแฟ
ล็

น่าสนใจ รุ่นncนี้เป็นรุ่นใด
DopeGhoti

ฉันใช้ CentOS 7 และ nc ถูกแทนที่ด้วย nmap-ncat ซึ่งไม่มีตัวเลือก :(
Shapeshifter

ถ้าผมจำได้อย่างถูกต้องแพคเกจที่คุณต้องการใน CentOS ncเป็นเพียง
DopeGhoti

nc คือ nmap-ncat ใน centos 7
Shapeshifter

2

ฉันรู้ว่าคำตอบนั้นช้าไปนิดหน่อย แต่ฉันกำลังมองหาวิธีการทำเช่นนี้และการใช้ nc ไม่ใช่ตัวเลือกสำหรับเหตุผลด้านความปลอดภัยดังนั้นนี่คือถ้ามันสามารถช่วยคนได้

สิ่งที่ขาดหายไปในเสียงสะท้อนเริ่มแรกของคุณคือสวิตช์ -e:

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

และขึ้นบรรทัดใหม่ + คำสั่ง quit เพื่อออกจาก telnet หลังจากยกเลิกการเชื่อมต่อ เช่นนี้:

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

เห็นได้ชัดว่าเหมือนกันจะทำงานถ้าคุณใช้รูปแบบบล็อกถ้าคำสั่งและประเมิน $? อย่างที่คุณทำตอนแรก:

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

ในขณะที่เราอยู่ที่นี่เท่าที่ NC ไปมันขึ้นอยู่กับรสชาติของ nc ที่คุณมี (gnu ncat vs nmap-ncat) Gnu จะมีสวิตช์ -z:

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

ในขณะที่คนอื่นจะไม่และคุณจะต้องไปป์ไลน์ที่ว่างเปล่าไปยัง NC ของคุณเพื่อไม่ให้ติดขัด:

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

1

รัน nc -z 192.168.10.5 23ใน command prompt หรือสร้าง bash script เพื่อรันคำสั่งนี้

ส่งคืนคำสั่งด้านล่างหากการเชื่อมต่อสำเร็จ

การเชื่อมต่อกับ 192.168.10.5 23 พอร์ต [tcp / *] สำเร็จ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.