Soket mesajı göndermek için basit kabuk komut dosyası


16

Test amacıyla, uzak bir IP> Bağlantı Noktası ile bağlanan ve basit bir metin TCPIP Soketi mesajı gönderen bir kabuk komut dosyası oluşturmam gerekiyor.

Yanıtlar:


18

nc( netcat) Kullanılarak .

Sunucu:

$ nc -l localhost 3000

Müşteri:

$ nc localhost 3000

Hem sunucu hem de istemci standart çıktı / girdiyi okuyacak ve yazacaktır.

Bu, hem sunucu hem de istemci aynı makinede olduğunda çalışır. Aksi takdirde localhostsunucunun dış adına geçin.

Biraz daha ilginç, ona bağlanır ve gönderirseniz günün saatini veren ve gönderirseniz dbırakan bir "sunucu" q:

Sunucu (in 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"

Müşteri oturumu:

$ nc localhost 3000
d
Perşembe 12 Oca 18:04:21 CET 2017
Merhaba?
Ne?
q

(sunucu sonra çıkar q, ancak istemci siz düğmesine basıncaya kadar gittiğini algılamaz Enter).


2
İstemci veri göndermeyi bitirdiğinde sunucu bir sonuç döndürürse, sonuç ctrl+cgösterilmez. Echo kullanılıyorsa, örneğin echo "cookie" | nc localhost 9090, istemcinin çıkış akışı kapatılacaktır (gönderilen) ancak istemci yine de sunucunun sonucunu bekleyecektir.
AlikElzin-kilaka

12

Genel tavsiye ile netcatdaha iyi bir yoldur.

Ama içeri bashve kshbunu da yapabilirsiniz:

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

nedir 1>&3? Bunun neyi temsil ettiğinden emin değilim
Alexander Mills

Başka bir deyişle, neden sadece echo "request" >&3, sanırım 1 sadece gereksiz
Alexander Mills

4

netcat'i deneyin (örn. 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
  • Yukarıdaki örnekte echo GET / HTTP/1.0yerel http sunucuma bir GET ( ) gönderiyorum
  • Karmaşık protokol istemiyorsanız, bu işi yapabilir.

0

Birçok durumda netcat / socat'a erişimim olmadı. Ayrıca bash'ın execdağıtılmış bilgi işlem ortamında kullanılmasıyla ilgili sorunlar yaşadım .

Yaygınlığı nedeniyle, alternatif bir çözüm GNU AWK'nın TCP / IP yeteneklerini kullanmaktır. "İki yönlü boru" operatörü temelinde basit bir sözdizimi sağlar.

İşte bu kaynaktan bir soket üzerinden bir TCP mesajı gönderecek değiştirilmiş bir örnek :

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

Adresi için tam sözdizimi: /net-type/protocol/local-port/remote-host/remote-port. Ne zaman local-port0 olarak ayarlanır yerel konak istediğini tipik olan otomatik bağlantı noktası seçer. Daha okuyabilirsiniz gawkbireyin TCP / IP ağ yetenekleri burada:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.