เพื่อการทดสอบฉันต้องสร้างเชลล์สคริปต์ที่เชื่อมต่อกับ IP ระยะไกล> พอร์ตและส่งข้อความ TCPIP Socket แบบข้อความธรรมดา
เพื่อการทดสอบฉันต้องสร้างเชลล์สคริปต์ที่เชื่อมต่อกับ IP ระยะไกล> พอร์ตและส่งข้อความ TCPIP Socket แบบข้อความธรรมดา
คำตอบ:
ใช้nc
( netcat
)
เซิร์ฟเวอร์:
$ nc -l localhost 3000
ลูกค้า:
$ nc localhost 3000
ทั้งเซิร์ฟเวอร์และไคลเอนต์จะอ่านและเขียนไปยังเอาต์พุต / อินพุตมาตรฐาน
สิ่งนี้จะทำงานเมื่อทั้งเซิร์ฟเวอร์และไคลเอนต์อยู่ในเครื่องเดียวกัน มิฉะนั้นเปลี่ยนlocalhost
เป็นชื่อภายนอกของเซิร์ฟเวอร์
น่าสนใจกว่านั้นคือ "เซิร์ฟเวอร์" ที่ให้เวลากับคุณในแต่ละวันหากคุณเชื่อมต่อกับเซิร์ฟเวอร์นั้นและส่ง a d
และจะหยุดทำงานหากคุณส่งq
:
เซิร์ฟเวอร์ (ในbash
):
#!/bin/bash
coproc nc -l localhost 3000
while read -r cmd; do
case $cmd in
d) date ;;
q) break ;;
*) echo 'What?'
esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"
kill "$COPROC_PID"
เซสชั่นลูกค้า:
$ nc localhost 3000 d พฤ. 12 ม.ค. 18:04:21 CET 2017 สวัสดี? อะไร? Q
(เซิร์ฟเวอร์ออกหลังจากq
แต่ลูกค้าไม่ตรวจพบว่ามันหายไปจนกว่าคุณจะกดEnter)
โดยทั่วไปคำแนะนำด้วยnetcat
วิธีที่ดีกว่า
แต่ในbash
และksh
คุณยังสามารถทำสิ่งนี้:
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
1>&3
อะไร ฉันไม่แน่ใจว่าสิ่งที่แสดงถึง
echo "request" >&3
ฉันไม่เดาเลยว่า 1 เป็นเรื่องซ้ำซ้อน
ลอง netcat (เช่น nc)
echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
echo GET / HTTP/1.0
) ไปยังเซิร์ฟเวอร์ http ท้องถิ่นของฉันในหลายกรณีฉันไม่ได้เข้าถึง netcat / socat ฉันยังมีปัญหากับการใช้ bash exec
ในสภาพแวดล้อมการคำนวณแบบกระจาย
ทางเลือกอื่นคือใช้ความสามารถ TCP / IP ของ GNU AWK มันมีไวยากรณ์ที่เรียบง่ายโดยใช้โอเปอเรเตอร์ "ไปป์สองทาง"
นี่คือตัวอย่างที่ถูกแก้ไขจากแหล่งนี้ซึ่งจะส่งข้อความ TCP ผ่านซ็อกเก็ต:
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
/net-type/protocol/local-port/remote-host/remote-port
ไวยากรณ์เต็มรูปแบบสำหรับที่อยู่: เมื่อlocal-port
ตั้งค่าเป็น 0 โฮสต์ท้องถิ่นจะเลือกพอร์ตโดยอัตโนมัติซึ่งโดยทั่วไปคือสิ่งที่คุณต้องการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับgawk
's TCP / IP เครือข่ายความสามารถที่นี่:
ctrl+c
จะไม่แสดงผลลัพธ์ หากใช้ echo เช่นecho "cookie" | nc localhost 9090
สตรีมเอาต์พุตของลูกค้าจะถูกปิด (eof ที่ส่ง) แต่ลูกค้าจะยังคงรอผลของเซิร์ฟเวอร์