soma 2 variáveis em um script bash dentro do telnet

0

Eu estou escrevendo um script que deve ouvir em uma porta específica e uma vez que alguém se conecta a ele através dessa porta (através de telnet), ele deve pedir 2 números e retornar sua soma. Como quando digito telnet [my_server] [my_port] ele pede 2 números e depois imprime sua soma.

Minha situação é que ele simplesmente não imprime a soma, não importa quais comandos ou sintaxes eu usei.

#!/bin/bash
nc -v -l -p 3360 -c 'echo Enter num1:
read num1
echo Enter num2:
read num2
echo "$(($num1+$num2))"'
    
por user3141805 09.10.2017 / 08:34

3 respostas

1
#!/bin/bash

add_num()
{
echo Enter num1:
read num1
echo Enter num2:
read num2
echo $(( $(echo $num1 | tr -d '\r') + $(echo $num2 | tr -d '\r') ))
}

rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | add_num 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

Isso deve funcionar ... A opção -c não é suportada com nc & é declarado em man pages que devemos usar acima da sintaxe. Além disso, temos que truncar o retorno de carro que vem com a entrada do telnet.

    
por 09.10.2017 / 12:40
0

Existem várias implementações incompatíveis de nc / netcat . Eu usaria socat aqui:

socat 'tcp-listen:1234,reuseaddr' system:\''
  printf "num1: "
  read x
  printf "num2: "
  read y
  echo "$((x + y))"'\'

Tenha em atenção que telnet enviará as linhas como 123\r\n , pelo que 123\r será armazenado nas variáveis que causam erros de sintaxe aritmética.

Em vez de telnet localhost 1234 , você pode usar:

socat - tcp:localhost:1234

Ou você pode despir os CRs com:

socat 'tcp-listen:1234,reuseaddr' system:$'\'
  printf "num1: "
  read x
  printf "num2: "
  read y
  echo "$((${x%\r} + ${y%\r}))"\''

Se você quiser gerenciar mais de uma conexão, adicione a opção fork ao primeiro endereço.

Se você deseja que os erros do shell sejam enviados ao cliente, adicione a opção stderr ao segundo endereço.

Portanto, combinar os dois:

socat tcp-listen:1234,reuseaddr,fork system:\''
  printf "num1: "
  read x
  printf "num2: "
  read y
  echo "$((x + y))"'\',stderr

Acima, o código seria interpretado pelo sh do seu sistema. Para usar outro interpretador e qualquer código arbitrário (sem ter que se preocupar se ele contém aspas simples ou vírgulas, por exemplo), você pode fazer:

CODE=$(cat << 'EOF'
printf 'num1: '
read x
printf 'num2: '
read y
x=${x%$'\r'}
y=${y%$'\r'}
echo "$((x + y))"
EOF
) socat tcp-listen:1234,reuseaddr,fork exec:\''bash -c "eval \"$CODE\""'\'
    
por 10.10.2017 / 15:11
-1
#!/bin/bash
#method 1
echo \'expr $num1 + $num2\'
#method 2
echo $(($num1+$num2))
    
por 09.10.2017 / 09:57