เพื่อการทดสอบฉันต้องสร้างเชลล์สคริปต์ที่เชื่อมต่อกับ 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-1echo 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 ที่ส่ง) แต่ลูกค้าจะยังคงรอผลของเซิร์ฟเวอร์