소켓 메시지를 보내는 간단한 쉘 스크립트


16

테스트 목적으로 원격 IP> 포트와 연결하고 간단한 텍스트 TCPIP 소켓 메시지를 보내는 쉘 스크립트를 작성해야합니다.

답변:


18

nc( netcat) 사용

섬기는 사람:

$ nc -l localhost 3000

고객:

$ nc localhost 3000

서버와 클라이언트 모두 표준 출력 / 입력을 읽고 씁니다.

서버와 클라이언트가 같은 컴퓨터에있을 때 작동합니다. 그렇지 않으면 localhost서버의 외부 이름으로 변경 하십시오.

약간 더 흥미로운 "서버"는 연결하여 시간을 보내면 시간을 알려주고 다음 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
디
목 1 월 12 일 18:04:21 CET 2017
여보세요?
뭐?

서버는 이후 q에 종료 되지만 클라이언트는를 누를 때까지 서버가 종료 되었음을 감지하지 못합니다 Enter.


2
클라이언트가 데이터 전송을 마쳤을 때 서버가 결과를 반환하면 결과가 ctrl+c표시되지 않습니다. 예를 들어 에코를 사용하는 경우 echo "cookie" | nc localhost 9090클라이언트의 출력 스트림은 닫히지 만 (보내는) 클라이언트는 여전히 서버 결과를 기다립니다.
AlikElzin-kilaka

12

일반적으로 조언 netcat이 더 좋습니다.

그러나에 bash그리고 ksh당신은 또한이 작업을 수행 할 수 있습니다

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

무엇 1>&3입니까? 그것이 무엇을 나타내는 지 잘 모르겠습니다
Alexander Mills

다시 말해서, 왜 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
  • 위의 샘플에서 echo GET / HTTP/1.0로컬 HTTP 서버에 GET ( )을 보냅니다.
  • 복잡한 프로토콜을 원하지 않으면이 작업을 수행 할 수 있습니다.

0

많은 경우에 netcat / socat에 액세스 할 수 없었습니다. exec분산 컴퓨팅 환경에서 bash를 사용하는 데 문제가있었습니다 .

그 보급으로 인해 대안 솔루션은 GNU AWK의 TCP / IP 기능을 사용하는 것입니다. "양방향 파이프"연산자를 기반으로하는 간단한 구문을 제공합니다.

다음은 이 소스 에서 소켓을 통해 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-port0으로 설정 되면 로컬 호스트는 일반적으로 원하는 포트를 자동으로 선택합니다. gawkTCP / IP 네트워킹 기능 에 대한 자세한 내용은 다음 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.