Telnet 내의 bash 스크립트에서 2개의 변수를 합산합니다.

Telnet 내의 bash 스크립트에서 2개의 변수를 합산합니다.

나는 특정 포트를 수신해야 하는 스크립트를 작성 중이며 누군가 해당 포트를 통해(텔넷을 통해) 연결하면 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 옵션을 지원하지 않으며 매뉴얼 페이지에는 위 구문을 사용해야 한다고 명시되어 있습니다. 또한 텔넷 입력에서 캐리지 리턴을 잘라야 합니다.

답변2

nc/ 호환되지 않는 여러 구현이 존재합니다 netcat. 여기서는 다음을 사용 합니다 socat.

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

이렇게 하면 행 telnet이 변수로 전송되어 변수에 저장되어 알고리즘에 구문 오류가 발생합니다.123\r\n123\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옵션을 첫 번째 주소에 추가하세요.

쉘 오류를 클라이언트로 전송하려면 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\\""'\'

관련 정보