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