在 telnet 内的 bash 脚本中求和 2 个变量

在 telnet 内的 bash 脚本中求和 2 个变量

我正在编写一个脚本,该脚本应该侦听特定端口,一旦有人通过该端口(通过 telnet)连接到它,它应该要求 2 个数字并返回它们的总和。就像当我输入 telnet [my_server] [my_port] 时,它会要求输入 2 个数字,然后打印它们的总和。

我的情况是,无论我使用哪种命令或语法,它都不会打印总和。

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

答案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

这应该有效... nc 不支持 -c 选项,并且手册页中指出我们应该使用上面的语法。另外,我们必须截断 telnet 输入中的回车符。

答案2

nc/存在几种不兼容的实现netcat。我会socat在这里使用:

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

请注意,这telnet会将行作为 发送123\r\n,因此123\r将存储在变量中,从而导致算术语法错误。

您可以使用以下代替telnet localhost 1234

socat - tcp:localhost:1234

或者您可以使用以下命令删除 CR:

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

如果您希望能够处理多个传入连接,请将该fork选项添加到第一个地址。

如果您希望将 shell 错误发送到客户端,请将该stderr选项添加到第二个地址。

因此将两者结合起来:

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

上面的代码将由您的系统的sh.要使用另一个解释器和任何任意代码(例如,不必担心它是否包含单引号或逗号),您可以执行以下操作:

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

相关内容