Простий скрипт оболонки для надсилання повідомлення з сокетом


16

Для тестування мені потрібно створити скрипт оболонки, який з'єднується з віддаленим IP> Портом і надсилає просте текстове повідомлення TCPIP Socket.

Відповіді:


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
г
Чт 12 січня 18:04:21 CET 2017
Здравствуйте?
Що?
q

(сервер закінчується після q, але клієнт не виявляє, що він минув, поки ви не натиснете Enter).


2
Якщо сервер повертає результат, коли клієнт закінчує надсилання даних, результат ctrl+cне відображатиметься. Якщо використовується ехо, наприклад 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 просто зайвий
Олександр Міллс

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«пд.ш. TCP / IP мережевих можливостей тут:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.