Script de shell simples para enviar mensagem de soquete

16

Para fins de teste, preciso criar um script de shell que se conecte a um IP> Port remoto e envie uma mensagem de soquete TCPIP de texto simples.

Bachalo
fonte

Respostas:

18

Usando nc( netcat).

Servidor:

$ nc -l localhost 3000

Cliente:

$ nc localhost 3000

O servidor e o cliente lerão e gravarão na saída / entrada padrão.

Isso funcionará quando o servidor e o cliente estiverem na mesma máquina. Caso contrário, mude localhostpara o nome externo do servidor.

Um pouco mais interessante, um "servidor" que fornece a hora do dia se você se conectar a ele e enviar um de que encerra se você enviar q:

Servidor (pol 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"

Sessão do cliente:

$ nc localhost 3000
d
Quinta-feira, 12 de janeiro de 18:04:21 CET 2017
Olá?
O que?
q

(o servidor sai depois q, mas o cliente não detecta que se foi até você pressionar Enter).

Kusalananda
fonte
2
Se o servidor retornar um resultado quando o cliente concluir o envio de dados, ctrl+cele não mostrará o resultado. Se estiver usando eco, por exemplo echo "cookie" | nc localhost 9090, o fluxo de saída do cliente será fechado (enviado automaticamente), mas o cliente continuará aguardando o resultado do servidor.
AlikElzin-Kilaka
12

Em geral, o conselho netcaté o melhor caminho.

Mas no bashe kshvocê também pode fazer isso:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
ValeriyKr
fonte
o que é 1>&3? Não estou certo o que isso representa
Alexander Mills
em outras palavras, por que não echo "request" >&3, acho que o 1 é apenas redundante
Alexander Mills
4

tente netcat (por exemplo, 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
  • na amostra acima, envio um GET ( echo GET / HTTP/1.0) ao meu servidor http local
  • Se você não deseja um protocolo complexo, isso pode funcionar.
Archemar
fonte
0

Em muitos casos, eu não tive acesso ao netcat / socat. Também tive problemas com o uso do bash execem um ambiente de computação distribuído.

Devido à sua prevalência, uma solução alternativa é usar os recursos TCP / IP do GNU AWK. Ele fornece uma sintaxe simples, baseada no operador "pipe bidirecional".

Aqui está um exemplo modificado desta fonte que enviará uma mensagem TCP através de um soquete:

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

A sintaxe completa para o endereço é: /net-type/protocol/local-port/remote-host/remote-port. Quando local-portestá definido como 0, o host local escolhe a porta automaticamente, o que normalmente é o que você deseja. Você pode ler mais sobre gawkos recursos de rede TCP / IP aqui:

John Lunzer
fonte