Como posso usar o netcat (nc) para o modelo do servidor cliente de chat?

1

Estou tentando gravar um daemon usando bash . Eu vou digitar o endereço IP do meu parceiro e a conexão vai começar usando nc partner_ip 2015 , da mesma forma no servidor eu vou iniciar a conexão usando nc -l -p 2015 .

Quero imprimir meu nome toda vez que enviar uma mensagem e também imprimir o nome do meu parceiro antes da mensagem dele. Então, primeiro preciso descobrir o nome de usuário e o endereço IP do meu parceiro.

#! /bin/bash

function readPip()
{
    echo "Enter your partener IP"
    read ip
    export PIP= $ip
}


function readMip()
{
    mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
    echo -n "'my IP is"$mip"
    export MIP=$mip
}

function chat()
{
    [[ $PIP != " " ]]&& nc $PIP 2015
    [[ $PIP == " " ]] && nc -l -p 2015
}
function testConnect()
{
    nc $PIP 2015  > /dev/null
    echo "am here"
    return $1
}

readPip
testConnect
readMip
echo "$1"
    
por user2278127 21.10.2014 / 13:32

2 respostas

1

function readPip()
{
echo "Enter your partener IP"
read ip
export PIP= $ip
}

O espaço após o sinal de igual é um erro de sintaxe. Mas, além disso, tudo isso poderia ser refatorado para apenas

readPip () {
    read -p "Enter your partner's IP: " PIP
}

O export é desnecessário, pois você não precisa de processos filhos externos para ter acesso a essa variável.

function readMip()
{
mip=ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1
echo -n "'my IP is"$mip"
export MIP=$mip
}

Novamente, isso contém um erro; você atribui a mip o valor ip e então (tenta) executar o comando addr list ... , onde aparentemente a intenção é executar ip addr list ... e atribuir o resultado disso a MIP .

readMip () {
    ip addr list eth0 |grep "inet " |cut -d' ' -f6|cut -d/ -f1'
}

Aqui, eu simplesmente deixo a tarefa para o chamador ( readPip poderia ser refatorado da mesma forma para consistência).

No código principal, você teria

MIP=$(readMip)

Novamente, o export não é necessário nem útil.

function chat()
{
[[ $PIP != " " ]]&& nc $PIP 2015
[[ $PIP == " " ]] && nc -l -p 2015
}

Isto é claramente "if - then-else" e deve ser escrito de acordo.

chat () {
    if [[ "$PIP" == " " ]]; then
        nc -l -p 2015
    else
        nc "$PIP" 2015
    fi
}

ou até mesmo

[[ "$PIP" == " " ]] && nc -l -p 2015 || nc "$PIP" 2015

Observe também que eliminei a palavra-chave Bash-only function . Você ainda tem alguns Bashisms aqui, mas eles podem ser refatorados para um script portátil POSIX.

    
por 21.10.2014 / 20:22
0

Agrupe as chamadas nc com chamadas sed sem buffer:

sed -u "s/^/My name: /" | nc PARTNER_IP 2015

sed -u "s/^/Partner name: /" | nc -l 2015
    
por 21.10.2014 / 13:46

Tags