Bash

Here-document 在 shell 腳本上無法正常工作

  • February 14, 2018

我有兩個文件:server.sh並且client.sh,伺服器將以下文本發送到客戶端

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

如您所見,伺服器通過 netcat 向客戶端發送文本(解釋為多行命令),在這些命令上,我試圖將使用者輸入傳遞給特定文件,然後使用 case 語句檢查使用者輸入是否CadastrarEntrar或者Sair,第一個對話框部分工作正常,但case 'cat log servidor' in沒有被執行(即使bash -x server.sh我找不到導致這個問題的原因)

您的dialog命令,其輸出被重定向到文件logservidor,正在遠端端執行。但是應該讀取其輸出的行:

case `cat logservidor` in

…正在本地執行,同時建構here-document。這是因為 here-documents 在定義時會執行各種擴展,包括命令替換。

您可以通過引用延遲此擴展(以便僅在執行腳本時發生)EOF

nc $ip $porta_cliente <<-"EOF"

但這也會延遲腳本中變數的擴展,例如$ip. 如果您希望這些變數立即展開,但cat命令稍後執行,您可以轉義反引號:

case \`cat logservidor\` in

在嘗試發送和執行它之前,您還可以通過查看最終命令來自己調試問題。將第一行替換為

cat > tmp-doc <<-EOF

然後進去tmp-doc看看有什麼東西會送過來nc

引用自:https://unix.stackexchange.com/questions/424105