宁夏英泽需求:新增 macOS 可用的前端部署脚本 YZFX.sh
YZFX.bat 只能跑在 Windows。本次按同样步骤转写一份 macOS / Linux 版本,只针对英泽
(COMPANY=YZFX,42.63.70.231:/home/vue/dist),其余客户端的 .bat 不动。
与 YZFX.bat 的差别:
- 不再依赖 sshpass.exe:有 sshpass 就用 sshpass,没有就退回 macOS 自带的
/usr/bin/expect 喂密码,本机无需安装任何依赖即可运行。
- 脚本开头 cd 到自身目录,从任何位置调用都能正确构建和上传。
- 结尾的 pause 仅在交互式终端生效,被脚本/管道调用不会卡住。
- 「比较文件大小」按该方法本来标题的原意真正做了比对(.bat 只打印不比对):
在远端执行 test "$(stat -c %s tmp)" -eq <本地字节数>,只取退出码,不做输出解析。
实现要点(这些坑已实测踩过并修掉):
- 不能用 $(ssh_remote ...) 截取远端输出:expect 会把整段交互回显(spawn 命令行、
密码提示)一并写进 stdout,截出来的不是命令结果。
- expect 程序必须写成文件用 -f 调用:`expect -c 脚本 参数...` 不会填充 $argv,
会把额外参数当成脚本文件名。
- 变量一律写成 ${VAR}:bash 3.2 会把紧跟变量的全角字符(如「(」)并入变量名,
"$ZIP_FILE(..." 会被解析成名为 ZIP_FILE( 的变量,配 set -u 直接 unbound variable。
验证方式:在 /tmp 的隔离沙箱里用模拟 ssh/scp(会真的校验密码、按远端 test 返回退出码)
跑通,覆盖 5 条分支:正常走完(exit 0)、远端大小不符、密码错误、远端缺 unzip、scp 失败
——后四条均按预期打印精确错误并 exit 1。沙箱外的真实服务器未做任何连接。
Co-Authored-By: Claude Code <noreply@anthropic.com>