ここではドキュメントがシェルスクリプトで正しく動作しません。

ここではドキュメントがシェルスクリプトで正しく動作しません。

2 つのファイルがあります: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

おすすめ記事