Here-document 在 shell 脚本上无法正常工作

Here-document 在 shell 脚本上无法正常工作

我有两个文件: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

相关内容