เชลล์สคริปต์ง่าย ๆ ในการส่งข้อความซ็อกเก็ต


16

เพื่อการทดสอบฉันต้องสร้างเชลล์สคริปต์ที่เชื่อมต่อกับ IP ระยะไกล> พอร์ตและส่งข้อความ TCPIP Socket แบบข้อความธรรมดา

คำตอบ:


18

ใช้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)


2
หากเซิร์ฟเวอร์ส่งคืนผลลัพธ์เมื่อไคลเอ็นต์ส่งข้อมูลเสร็จctrl+cจะไม่แสดงผลลัพธ์ หากใช้ echo เช่นecho "cookie" | nc localhost 9090สตรีมเอาต์พุตของลูกค้าจะถูกปิด (eof ที่ส่ง) แต่ลูกค้าจะยังคงรอผลของเซิร์ฟเวอร์
AlikElzin-kilaka

12

โดยทั่วไปคำแนะนำด้วยnetcatวิธีที่ดีกว่า

แต่ในbashและkshคุณยังสามารถทำสิ่งนี้:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"

คือ1>&3อะไร ฉันไม่แน่ใจว่าสิ่งที่แสดงถึง
อเล็กซานเดอร์มิลส์

กล่าวอีกอย่างคือทำไมecho "request" >&3ฉันไม่เดาเลยว่า 1 เป็นเรื่องซ้ำซ้อน
Alexander Mills

4

ลอง 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
  • ในตัวอย่างด้านบนฉันส่ง GET ( echo GET / HTTP/1.0) ไปยังเซิร์ฟเวอร์ http ท้องถิ่นของฉัน
  • หากคุณไม่ต้องการโปรโตคอลที่ซับซ้อนสิ่งนี้อาจทำงานได้

0

ในหลายกรณีฉันไม่ได้เข้าถึง 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 เครือข่ายความสามารถที่นี่:

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