Kịch bản shell đơn giản để gửi tin nhắn socket


16

Đối với mục đích thử nghiệm, tôi cần tạo một tập lệnh shell kết nối với IP từ xa> Cổng và gửi một tin nhắn văn bản TCPIP Socket đơn giản.

Câu trả lời:


18

Sử dụng nc( netcat).

Người phục vụ:

$ nc -l localhost 3000

Khách hàng:

$ nc localhost 3000

Cả máy chủ và máy khách sẽ đọc và ghi vào đầu ra / đầu vào tiêu chuẩn.

Điều này sẽ hoạt động khi cả máy chủ và máy khách trên cùng một máy. Nếu không thì đổi localhostsang tên bên ngoài của máy chủ.

Thú vị hơn một chút, một "máy chủ" cung cấp cho bạn thời gian trong ngày nếu bạn kết nối với nó và gửi nó d, và nó sẽ thoát nếu bạn gửi q:

Máy chủ (trong 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"

Phiên khách hàng:

$ nc localhost 3000
d
Ngày 12 tháng 1 18:04:21 CET 2017
Xin chào?
Gì?
q

(máy chủ thoát ra sau q, nhưng máy khách không phát hiện ra rằng nó đã biến mất cho đến khi bạn nhấn Enter).


2
Nếu máy chủ trả về kết quả khi máy khách hoàn thành việc gửi dữ liệu, ctrl+csẽ không hiển thị kết quả. Nếu sử dụng echo, ví dụ echo "cookie" | nc localhost 9090, luồng đầu ra của máy khách sẽ bị đóng (đã gửi eof) nhưng máy khách vẫn sẽ đợi kết quả của máy chủ.
AlikElzin-kilaka

12

Nói chung lời khuyên với netcatlà cách tốt hơn.

Nhưng trong bashkshbạn cũng có thể làm điều này:

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

1>&3gì Tôi không chắc điều đó thể hiện điều gì
Alexander Mills

nói cách khác, tại sao không chỉ echo "request" >&3, tôi đoán rằng 1 chỉ là dư thừa
Alexander Mills

4

thử netcat (ví dụ: 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
  • trong mẫu ở trên, tôi gửi GET ( echo GET / HTTP/1.0) đến máy chủ http cục bộ của mình
  • Nếu bạn không muốn giao thức phức tạp, điều này có thể thực hiện công việc.

0

Trong nhiều trường hợp tôi không có quyền truy cập vào netcat / socat. Tôi cũng gặp vấn đề với việc sử dụng bash's exectrong môi trường điện toán phân tán.

Do mức độ phổ biến của nó, một giải pháp thay thế là sử dụng các khả năng TCP / IP của GNU AWK. Nó cung cấp một cú pháp đơn giản dựa trên toán tử "đường ống hai chiều".

Dưới đây là một ví dụ được sửa đổi từ nguồn này sẽ gửi tin nhắn TCP qua ổ cắm:

BEGIN {
 NetService = "/inet/tcp/0/cs.wisc.edu/finger"
 print "coke" |& NetService
 close(NetService)
}

Cú pháp đầy đủ cho địa chỉ là : /net-type/protocol/local-port/remote-host/remote-port. Khi local-portđược đặt thành 0, máy chủ cục bộ sẽ chọn cổng tự động, thường là thứ bạn muốn. Bạn có thể đọc thêm về gawk's TCP / IP khả năng kết nối mạng ở đây:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.