Aqui documento não está funcionando corretamente no shell script

1

Eu tenho dois arquivos: server.sh e client.sh , o servidor envia o seguinte texto para o cliente

client.sh

porta_cliente=5678
porta_servidor=8765

nc -l $porta_cliente | sh

server.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

Como você pode ver, o servidor envia um texto (interpretado como várias linhas de comandos) para o cliente através do netcat, nestes comandos, eu estou tentando passar a entrada do usuário para um arquivo específico, e então, usar um case case para verificar se a entrada do usuário é Cadastrar , Entrar ou Sair , a primeira parte da caixa de diálogo está funcionando bem, mas o case 'cat log servidor' in não está sendo executado (mesmo com bash -x server.sh i não foi possível encontrar está causando esse problema)

    
por HenriqueHBR 14.02.2018 / 12:17

1 resposta

3

Seu comando dialog , cuja saída é redirecionada para o arquivo logservidor , está sendo executado no terminal remoto. Mas a linha que deveria ler sua saída:

case 'cat logservidor' in

... está sendo executado localmente, enquanto se constrói o documento here. Isso porque os documentos aqui executam várias expansões, incluindo a substituição de comandos, no momento em que são definidas.

Você pode atrasar essa expansão (para que isso só aconteça quando o script for executado), citando EOF :

nc $ip $porta_cliente <<-"EOF"

Mas isso também atrasaria a expansão de variáveis no script, como $ip . Se você quiser que essas variáveis sejam expandidas imediatamente, mas o comando cat executado posteriormente, você poderá escapar dos backticks:

case \'cat logservidor\' in

Você também pode depurar o problema observando o comando final antes de tentar enviá-lo e executá-lo. Substitua a primeira linha por

cat > tmp-doc <<-EOF

Em seguida, procure em tmp-doc para ver o que seria enviado em nc .

    
por 14.02.2018 / 13:13