2 つのファイルがあります:server.sh
とclient.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
、最初にダイアログ部分が正常に動作しますが実行されません(この問題の原因が見つからないにもかかわらず)Entrar
Sair
case 'cat log servidor' in
bash -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
。