나는 특정 포트를 수신해야 하는 스크립트를 작성 중이며 누군가 해당 포트를 통해(텔넷을 통해) 연결하면 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\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
옵션을 첫 번째 주소에 추가하세요.
쉘 오류를 클라이언트로 전송하려면 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\\""'\'