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\""'\'