Windows环境下如何编写Bash .sh脚本实现Laravel远程缓存清理
问题原因
你当前的脚本写法存在逻辑错误:ssh root@api.*name*.com 命令只会启动远程服务器的交互式SSH会话,脚本后续的cd、php artisan等命令会等待SSH会话主动退出后,才会在你本地Windows环境执行,自然不会在远程服务器生效。
修复方案
1. 修正脚本执行逻辑
你需要把要在远程服务器执行的命令直接作为SSH命令的参数传递,两种常用写法可选:
写法一:单行直接传参(命令较少时使用)
把所有远程命令用引号包裹,放到SSH命令后面,用&&连接命令保证执行顺序:
ssh root@api.*name*.com "cd /var/www/api.*name*.com && php artisan cache:clear && php artisan responsecache:clear && php artisan config:cache"
&&的作用是只有前一条命令执行成功后才会执行后一条,避免出错后继续执行带来异常
写法二:多行命令传参(命令较多时易读性更好)
用Here Document格式传递多行命令,适合后续需要新增其他远程操作的场景:
ssh root@api.*name*.com << EOF cd /var/www/api.*name*.com php artisan cache:clear php artisan responsecache:clear php artisan config:cache EOF
2. 配置SSH免密登录(定时执行必须配置)
定时任务无法手动输入SSH密码,需要先配置免密登录:
- 如果你的Windows使用PowerShell自带的OpenSSH、Git Bash、WSL作为脚本执行环境,先执行以下命令生成本地密钥,执行过程一路回车即可:
如果你的OpenSSH版本较低不支持ed25519算法,可以替换为RSA算法:# 生成ed25519算法密钥,兼容性更好 ssh-keygen -t ed25519ssh-keygen -t rsa -b 4096 - 然后执行以下命令把本地公钥上传到远程服务器,过程中需要输入一次远程服务器的root密码:
ssh root@api.*name*.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_ed25519.pub - 配置完成后直接执行
ssh root@api.*name*.com,不需要输入密码即可登录代表配置成功。
3. Windows任务调度器配置
- 脚本可直接保存为
.bat批处理文件,不需要用.sh格式,直接调用Windows自带的OpenSSH客户端即可执行,避免额外依赖。 - 打开任务调度器新建任务,操作页的「程序或脚本」填写你的批处理脚本的绝对路径即可;如果坚持使用
.sh格式,需要在「参数」里指定执行环境,比如Git Bash的示例参数:"C:\Program Files\Git\bin\bash.exe" -c "C:\你的脚本路径\clear_cache.sh" - 触发器页配置你需要的定时执行周期即可,测试阶段可以先设置为短周期执行,确认脚本运行正常后再修改为正式周期。
内容的提问来源于stack exchange,提问作者Andy H.
相关产品推荐
相关产品推荐

