GitHub Actions SSH部署服务器失败后本地无法SSH登录问题
故障根因
你遇到的Action认证失败、Action执行后本地SSH无法连接两个问题,是同一个配置错误导致的:
- 你在
appleboy/scp-action中配置了source: "."、target: ".",该配置会把仓库内所有文件直接上传到SSH登录用户的家目录根路径。 - SSH服务对用户家目录、
.ssh目录、authorized_keys文件的权限有强制校验规则:- 用户家目录权限不能超过755,禁止组/其他用户持有写权限
~/.ssh目录权限必须为700~/.ssh/authorized_keys文件权限必须为600
任意一项权限不符合要求,sshd会直接拒绝所有公钥认证请求,不会校验密钥本身是否匹配。
- scp上传文件时会携带源文件的权限属性,上传过程中修改了家目录下相关路径的权限,触发SSH的公钥认证拦截,所以Action执行到一半连接中断报握手错误,之后权限未恢复,本地也无法正常连接。
紧急恢复步骤
通过云服务商提供的网页VNC/服务器控制台登录实例,执行以下命令修复SSH权限:
# 修复家目录权限 chmod 755 ~ # 修复.ssh目录权限 chmod 700 ~/.ssh # 修复授权公钥文件权限 chmod 600 ~/.ssh/authorized_keys # 重启SSH服务生效 systemctl restart sshd
执行完成后本地SSH连接即可恢复正常。
工作流配置修复
- 提前在服务器创建独立的项目部署目录,不要直接往用户家目录传文件,比如创建
/opt/your-project路径,给SSH登录用户分配该目录的读写权限。 - 替换工作流文件内容为以下配置,注意将路径替换为你自己的项目实际路径:
name: push-and-deploy-to-server on: push: branches: [ main ] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # 固定Action版本,不要用master浮动版本避免不兼容问题 - uses: appleboy/scp-action@v0.1.10 with: host: ${{ secrets.SSH_HOST }} port: 22 username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: "." # 替换为你自己的项目部署绝对路径 target: "/opt/your-project" # 禁止自动删除目标路径下的无关文件 rm: false - uses: appleboy/ssh-action@v0.1.10 with: host: ${{ secrets.SSH_HOST }} port: 22 username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | # 先进入项目目录再执行后续命令 cd /opt/your-project npm install --production # 首次部署不存在进程时自动启动 pm2 restart index.js || pm2 start index.js
- 检查GitHub Secrets中存储的
SSH_PRIVATE_KEY内容,确保完整包含私钥的首尾标记行(-----BEGIN OPENSSH PRIVATE KEY-----、-----END OPENSSH PRIVATE KEY-----),没有多余的空格、换行或者遗漏字符。
额外注意事项
- 不要直接使用root用户做部署,建议创建独立的普通部署用户,仅分配项目目录的操作权限,避免误操作影响系统文件。
- 所有Action依赖尽量指定固定版本号,不要使用
@master这种浮动版本,避免上游更新带来不可预期的问题。
内容的提问来源于stack exchange,提问作者Sam Leurs
相关产品推荐
相关产品推荐

