ทดสอบพอร์ต TCP ระยะไกลโดยใช้ telnet โดยเรียกใช้คำสั่งหนึ่งบรรทัด


12

ฉันมีกล่องลินุกซ์มากมายพร้อมชุดคำสั่งและพื้นที่ดิสก์ที่ จำกัด มาก แต่มันมีtelnetคำสั่งอยู่

ฉันเชื่อมต่อกับโพรบเหล่านี้จากทางไกล (โดยทางโปรแกรม) และออกคำสั่ง linux หนึ่งบรรทัดผ่าน SSH

ฉันจำเป็นต้องเรียกใช้คำสั่งเดียวที่จะเชื่อมต่อไปยังเครื่องที่เฉพาะเจาะจงโดยใช้ Telnet, และจากนั้นตัดการเชื่อมต่อได้ทันที

ฉันจะทำทุกอย่างที่ แต่ขาดการเชื่อมต่อได้ทันทีส่วนหนึ่ง Telnet เปิดคอนโซลหรือเทอร์มินัลบางประเภทและฉันไม่สามารถหาคำสั่งหนึ่งบรรทัดเพื่อเรียกใช้คำสั่ง telnet แล้วตัดการเชื่อมต่อได้ทันที

ถ้าฉันทำเช่นนั้นฉันสามารถแยกวิเคราะห์ข้อความที่เป็นข้อความสำหรับข้อผิดพลาดที่ไม่สามารถเชื่อมต่อกับเครื่องบนพอร์ตที่ระบุและนั่นคือสิ่งที่ฉันกำลังมองหา

ดังนั้นฉันจะเรียกใช้คำสั่งหนึ่งบรรทัดเพื่อเชื่อมต่อกับเครื่องโดยใช้ telnet และตัดการเชื่อมต่อในภายหลังได้อย่างไร


เท่าที่ฉันเข้าใจลูกค้า Telnet ของคุณไม่สนับสนุนการส่งโดยตรงหรือไม่
IBr

@ IBr คุณหมายถึงอะไร
มูฮัมหมัด Gelbana

โปรดทราบว่าไคลเอ็นต์ telent แตกต่างกันในรหัสออกที่รายงานหลังจากคำสั่งการออกจากฝั่งไคลเอ็นต์ใช้เพื่อยกเลิก ดังนั้นรหัสทางออกที่เป็นศูนย์จึงไม่ควรถูกพิจารณาว่าเป็นสัญญาณที่พอร์ตเปิดอยู่ ไม่สามารถใช้งานกับ REL ของ RHEL ได้อย่างน้อย
Oliver Gondža

คำตอบ:


28

คุณควรจะสามารถexitไพพ์คำสั่งลงใน STDIN telnetได้ ลอง:

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

และดูว่าใช้งานได้หรือไม่ (ดูเหมือนว่าจะทำงานบนเว็บเซิร์ฟเวอร์ของฉัน แต่ YMMV)


อาจทำงานได้ แต่ดูเหมือนโง่ - telnet ควรมีตัวเลือกให้ออกหรืออะไรก็ได้ในการติดต่อครั้งแรก
Alexander Mills

10

วิธีการที่ง่ายที่สุดและง่ายที่สุดได้รับด้านล่าง

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

n - เวลารอเป็นวินาทีก่อนที่จะออกโดยอัตโนมัติ มันอาจเป็นเศษส่วนเช่น 0.5 โปรดทราบว่าผลลัพธ์ที่ต้องการบางอย่างอาจไม่สามารถส่งคืนในเวลารอที่ระบุ ดังนั้นเราอาจต้องเพิ่มขึ้นตามลำดับ

เซิร์ฟเวอร์ - IP เซิร์ฟเวอร์เป้าหมายหรือชื่อโฮสต์

พอร์ต - หมายเลขพอร์ตบริการเป้าหมาย

คุณสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์เช่นนี้

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

มันทำงานได้อย่างสมบูรณ์แบบ! ในขณะที่ผลลัพธ์ถูกเปลี่ยนเส้นทางแน่นอนฉันสังเกตเห็นว่าฉันยังคงได้รับ "การเชื่อมต่อถูกปิดโดยโฮสต์ต่างประเทศ" เอาต์พุตในคอนโซลหลังสลีปมากกว่าในไฟล์ output.log มีวิธีป้องกันอย่างไรบ้าง?
แดน

5

ในกรณีของฉันใช้งานได้ (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
เฮ้นี่เยี่ยมมาก ฉันเป็นผู้ใช้ในทุกระบบ Linux ที่งานของฉัน แต่ไม่ใช่ผู้ดูแลระบบ (และไม่มีสิทธิ์ของผู้ดูแลระบบ) ฉันเบื่อที่จะขอให้พวกเขาติดตั้ง telnet ตลอดเวลาเพื่อให้ฉันสามารถทดสอบการเชื่อมต่อเครือข่าย (ฉันเป็นวิศวกรเครือข่าย) นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยม ฉันเปลี่ยนมันเล็กน้อยเพื่อให้ทำงานได้มากขึ้นเช่น telnet ฉันให้คำตอบของฉันเองพร้อมการแก้ไข
theglossy1

3

ฉันคิดว่าเครื่องมือที่ดีกว่าสำหรับการส่งคำสั่งโดยตรงและเพิ่งได้รับผลลัพธ์จะเป็น netcat มันเป็นเครื่องมือที่เรียบง่าย แต่ทรงพลังสำหรับการสั่งงานผ่านพอร์ตต่างๆ คุณสามารถดูตัวอย่างการใช้งานในคำถามผู้ใช้ระดับสูงนี้: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive-ผู้ถามจะยกตัวอย่างการทำงาน การเชื่อมต่อใดปิดลงหลังจากสองสามวินาที

และถ้าคุณต้องการทดสอบการเชื่อมต่อให้ใช้สิ่งนี้: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


ฉันกำลังพยายามติดตั้ง netcat ตอนนี้ แต่ฉันไม่สามารถทำได้ ฉันดาวน์โหลดเวอร์ชั่น powerpc ที่คอมไพล์แล้ว แต่ไลบรารี glibc หายไป ฉันดาวน์โหลดเวอร์ชั่น powerpc ที่คอมไพล์แล้ว แต่อุปกรณ์มีพื้นที่ไม่เพียงพอในการคัดลอกไฟล์ไลบรารี! เป็นไปได้ไหมที่ไลบรารี glibc มีอยู่แล้ว แต่ netcat หาไม่พบ?
มูฮัมหมัด Gelbana

Netcat จำเป็นสำหรับฝั่งไคลเอ็นต์เท่านั้น: บนเซิร์ฟเวอร์ (โพรบ) สามารถเป็น telnet ธรรมดาแบบเดิมได้
IBr

นอกจากนี้ Glibc ควรมีอยู่แล้วมันถูกใช้ในหลาย ๆ สิ่งในระบบปกติ
IBr

คุณสามารถลองเพิ่มสคริปต์ telnet เพื่อ&& exitดูว่ามันตัดการเชื่อมต่อ (อย่างน้อยก็เพียงพอ)
IBr

&& exitไม่ทำงาน หาก glibc ควรมีอยู่และฉันเชื่อว่ามัน ทำไมจะnc.traditionalบ่นเกี่ยวกับมันราวกับว่ามันหายไป?
มูฮัมหมัด Gelbana

1

นี่เป็นคำตอบอีกเวอร์ชันหนึ่งด้านบนที่ทำให้มันทำหน้าที่คล้ายกับ telnet syntax มากกว่าปกติ ถ้าคุณชอบคำตอบของฉันโปรดให้ upvote ไม่ใช่สิ่งนี้ แต่เป็นของดั้งเดิม

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

นี่คือทางออกที่ฉันพบบนอินเทอร์เน็ต:

( 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

มันใช้งานได้สำหรับฉันใน SunOS & HP-UX


0

ลอง

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

ส่วนที่ดีที่สุดข้างต้นคือคุณได้รับสถานะการออกด้วย หาก telnet คือรหัสออกจากความสำเร็จจะเป็น 0 หรืออย่างอื่น 1


0

หลีกเลี่ยง netcat หากคุณมีเส้นทางที่กำหนดเองเนื่องจากไม่ปฏิบัติตามกฎการกำหนดเส้นทาง คล้ายกับวิธีการnslookup, digและhostละเว้นไฟล์ / etc / hosts ( nslookup ขุดรายการ Firefox ละเลย / etc โฮสต์ไฟล์ / )

เช่น: แตกต่างจากแอปพลิเคชันและเครื่องมือเช่นtelnetและ/dev/tcp( การทดสอบพอร์ต TCP ระยะไกลโดยใช้ telnet โดยใช้คำสั่งหนึ่งบรรทัด ) ซึ่งปฏิบัติตามกฎการกำหนดเส้นทางของระบบให้ncใช้เกตเวย์เริ่มต้นเว้นแต่จะบอกให้ใช้ที่อยู่ IP ต้นทางด้วย-s:

nc -w 3 -s 192.168.1.12 example.com 8080

ฉันต้องการทดสอบว่าแอปพลิเคชันสามารถเข้าถึงทรัพยากรได้หรือไม่และหากเส้นทางไม่ทำงานnetcatรายงานว่าทุกอย่างดีเนื่องจากที่อยู่ต้นทางได้รับการระบุในการทดสอบ /dev/tcpฉันเปลี่ยนไปใช้

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