여기 문서가 쉘 스크립트에서 제대로 작동하지 않습니다.

여기 문서가 쉘 스크립트에서 제대로 작동하지 않습니다.

두 개의 파일이 있습니다: server.shclient.sh, 서버는 다음 텍스트를 클라이언트에 보냅니다.

클라이언트.sh

porta_cliente=5678
porta_servidor=8765

nc -l $porta_cliente | sh

서버.sh

porta_cliente=5678
porta_servidor=8765

nc $ip $porta_cliente <<-EOF
        dialog --stdout --backtitle 'Bem vindo ao SEPA 0.1' --title 'Menu inicial' --menu 'Escolha uma opção:' 0 0 0 \
        Cadastrar 'Criar um novo usuário' \
        Entrar 'Fazer login com sua conta' \
        Sair 'Encerrar o SEPA' > logservidor

        # WORKING FINE UNTIL HERE!

        case `cat logservidor` in
                "Cadastrar")
                        echo "LOG: case is being executed" > /dev/tcp/"$ip"/"$porta_servidor"
                        dialog --stdout --msgbox 'CADASTRAR' 0 0 > /dev/tcp/"$ip"/"$porta_servidor"
                ;;
                "Entrar")
                        echo "LOG: case is being executed"
                        echo "LOGIN SELECIONADO" > /dev/tcp/"$ip"/"$porta_servidor"
                ;;
                "Sair")
                        echo "LOG: case is being executed"
                        echo "SAIR SELECIONADO" > /dev/tcp/"$ip"/"$porta_servidor"
                ;;
        esac
EOF

보시다시피 서버는 netcat을 통해 클라이언트에 텍스트(여러 줄 명령으로 해석됨)를 보냅니다. 이 명령에서 나는 사용자 입력을 특정 파일에 전달한 다음 Case 문을 사용하여 사용자 입력이 다음과 같은지 확인합니다. 또는 Cadastrar먼저 대화 상자 부분이 제대로 작동하지만 실행되지 않습니다(이 문제의 원인을 찾을 수 없음에도 불구하고)EntrarSaircase 'cat log servidor' inbash -x server.sh

답변1

명령 출력은 dialog파일로 리디렉션되고 logservidor원격 측에서 실행됩니다. 그러나 출력을 읽어야 하는 줄은 다음과 같습니다.

case `cat logservidor` in

...이 문서를 작성하는 동안 로컬에서 실행 중입니다. 이는 여기 문서가 정의될 ​​때 명령 대체를 포함하여 다양한 확장을 수행하기 때문입니다.

다음을 인용하여 이 확장을 연기할 수 있습니다(스크립트가 실행될 때만 발생하도록) EOF.

nc $ip $porta_cliente <<-"EOF"

그러나 이렇게 하면 스크립트에서 변수의 확장도 지연됩니다(예 $ip: 해당 변수를 즉시 확장하고 명령을 cat나중에 실행하려는 경우 백틱을 이스케이프 처리할 수 있습니다).

case \`cat logservidor\` in

또한 최종 명령을 보내고 실행하기 전에 최종 명령을 살펴봄으로써 문제를 직접 디버깅할 수도 있습니다. 첫 번째 줄을 다음으로 바꾸십시오.

cat > tmp-doc <<-EOF

tmp-doc그런 다음 무엇이 전송될지 살펴보십시오 nc.

관련 정보