Script shell sederhana untuk mengirim pesan socket

16

Untuk tujuan pengujian, saya perlu membuat skrip shell yang terhubung dengan IP> Port> jauh dan mengirim pesan Socket TCPIP teks sederhana.

Bachalo
sumber

Jawaban:

18

Menggunakan nc( netcat).

Server:

$ nc -l localhost 3000

Klien:

$ nc localhost 3000

Baik server dan klien akan membaca dan menulis ke output / input standar.

Ini akan berfungsi ketika server dan klien berada di mesin yang sama. Kalau tidak ubah localhostke nama eksternal server.

Sedikit lebih menarik, "server" yang memberi Anda waktu sepanjang hari jika Anda terhubung dan mengirimkannya d, dan yang berhenti jika Anda mengirim q:

Server (dalam 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"

Sesi klien:

$ nc localhost 3000
d
Kamis 12 Jan 18:04:21 CET 2017
Halo?
Apa?
q

(server keluar setelah q, tetapi klien tidak mendeteksi bahwa ia hilang sampai Anda menekan Enter).

Kusalananda
sumber
2
Jika server mengembalikan hasil ketika klien selesai mengirim data, ctrl+citu tidak akan menampilkan hasilnya. Jika menggunakan gema, misalnya echo "cookie" | nc localhost 9090, aliran output klien akan ditutup (meskipun dikirim) tetapi klien masih akan menunggu hasil server.
AlikElzin-kilaka
12

Secara umum saran dengan netcatcara yang lebih baik.

Tetapi di bashdan kshAnda juga dapat melakukan ini:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
sumber
apa 1>&3? Saya tidak yakin apa yang diwakilinya
Alexander Mills
dengan kata lain, mengapa tidak adil echo "request" >&3, saya kira 1 hanya mubazir
Alexander Mills
4

coba netcat (mis 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
  • dalam contoh di atas saya mengirim GET ( echo GET / HTTP/1.0) ke server http lokal saya
  • Jika Anda tidak ingin protokol yang rumit, ini mungkin berhasil.
Archemar
sumber
0

Dalam banyak kasus saya belum memiliki akses ke netcat / socat. Saya juga punya masalah dengan menggunakan bashexec di lingkungan komputasi terdistribusi.

Karena prevalensinya, solusi alternatif adalah menggunakan kemampuan TCP / IP GNU AWK. Ini memberikan sintaksis sederhana berbasis di sekitar itu "pipa dua arah" operator.

Berikut adalah contoh yang dimodifikasi dari sumber ini yang akan mengirim pesan TCP melalui soket:

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

Sintaks penuh untuk alamat adalah: /net-type/protocol/local-port/remote-host/remote-port. Ketika local-portdiatur ke 0 host lokal memilih port secara otomatis yang biasanya apa yang Anda inginkan. Anda dapat membaca lebih lanjut tentang gawk's TCP / IP kemampuan jaringan di sini:

John Lunzer
sumber