如何编写Bash脚本远程操作Docker容器内MySQL并备份PrestaShop
解决远程SSH执行PrestaShop维护模式切换+Docker容器备份的脚本整合问题
你的原脚本存在几个核心问题:SSH登录后后续命令会在本地执行而非远程服务器、交互式的docker exec/mysql操作不适合脚本自动化、SQL语句无法直接在脚本中传递执行。以下是修正后的完整解决方案:
完整自动化脚本
#!/bin/bash # 通过SSH在远程服务器批量执行维护+备份操作 ssh docker@debVM << 'EOF' # 1. 非交互式切换PrestaShop到维护模式 docker exec ps1-7-mariadb-1 mysql -u bn_prestashop -pbitnamiUSER bitnami_prestashop -e "UPDATE ps_configuration SET value='0' WHERE name='PS_SHOP_ENABLE';" # 2. 执行容器卷备份脚本 echo "启动备份任务..." cd ~/scripts/ ./backup-volumes-container.sh ps1-7-mariadb-1 ./backup-volumes-container.sh ps1-7-prestashop-1 echo "备份任务完成" # 3. 可选:备份完成后恢复商城正常模式 # docker exec ps1-7-mariadb-1 mysql -u bn_prestashop -pbitnamiUSER bitnami_prestashop -e "UPDATE ps_configuration SET value='1' WHERE name='PS_SHOP_ENABLE';" EOF
关键修正说明
- SSH远程命令批量执行:使用
<< 'EOF'的Here Document语法,将所有需要在远程执行的命令打包发送,避免SSH登录后命令在本地执行的问题,单引号包裹EOF可防止本地变量替换,确保命令原封不动在远程运行。 - 非交互式数据库操作:去掉
docker exec的-it参数,通过mysql -e直接传递SQL语句,无需进入交互式MySQL会话。 - 脚本权限保障:确保远程服务器上的
backup-volumes-container.sh拥有可执行权限,执行chmod +x ~/scripts/backup-volumes-container.sh完成配置。
额外优化建议
- 配置SSH免密登录:将本地机器的SSH公钥添加到远程
docker@debVM用户的~/.ssh/authorized_keys文件中,避免脚本执行时手动输入密码。 - 提前验证SQL语句:在远程服务器手动执行一次维护模式切换命令,确认
ps_configuration表的更新生效。 - 增加日志记录:可在脚本中添加日志输出到文件的逻辑,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Chezzers
相关产品推荐
相关产品推荐

