目录

ubuntu 上传服务器文件提示: Permission denied

最近在ubuntu 服务器部署应用时,用scp命令刚执行就报错“Permission denied”,一开始以为是密码输错了,反复验证后才发现是目标目录权限没配置对。

后来,发现原因无非就那几种——权限不足、用户归属不对、SSH配置限制等。

这篇把从基础排查到处理的几种方法全讲透,每种都附实操命令和避坑点,希望能够帮助大家避坑。

原因分析

Ubuntu的权限机制很严格,上传文件报错大概率是以下3种原因,排查时按这个顺序来,能快速定位问题:

  • 目标目录权限不足:要上传文件的目录(比如/var/www)当前用户没有写入权限,这是最常见的原因;
  • 文件/目录归属错误:目标目录的所有者是root,而你用普通用户(比如ubuntu)上传,即使权限显示“755”也无法写入;
  • SSH服务配置限制:通过SSH上传(scp/sftp)时,SSH配置文件禁止了该用户的写入权限,或限制了上传目录。

快速排查技巧:先执行ls -ld 目标目录路径(比如ls -ld /var/www),查看目录的权限和所有者,第一时间判断是权限还是归属问题。

解决方法:赋予目录权限

一般情况是操作的数据目录没有写权限,主要原因:

  • 当前登录用户非 root 用户,无该目录写权限
  • 当前数据目录被限制了写权限
# 建议先切换到 root 用户
su -

# 如果切换到root用户可以正常上传,则不需要执行以下步骤
# 给目录授权写权限
sudo chmod 777 <数据目录>

常见问题

Q1. 改了目标目录权限后,还是提示 Permission denied?

场景:执行 sudo chmod g+w /var/www/html 后,上传还是提示权限被拒。

原因:

① 没有重启 SSH 或 FTP 服务,权限修改未生效;

② 本地终端没有重新登录,用户组权限未刷新。

解决:

① 如果是 SSH/SCP 上传,关闭当前终端,重新通过 SSH 登录服务器;

② 如果是 FTP 上传,重启 FTP 服务(如 sudo systemctl restart vsftpd);

③ 再次执行 ls -ld 确认权限已修改成功。

Q2. 用 root 用户上传也提示权限被拒,怎么回事?

场景:用 scp /local/file root@192.168.1.100:/root 上传,即使是 root 用户也提示权限被拒。

原因:Ubuntu 默认禁用 root 用户的 SSH 登录,导致 root 无法通过 SCP/SFTP 登录上传。

解决:

① 优先用普通用户上传(给普通用户目标目录权限,更安全);

② 若必须用 root,临时开启 root SSH 登录(不推荐):

# 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config
# 找到 PermitRootLogin 配置项,改为 yes
PermitRootLogin yes
# 重启 SSH 服务
sudo systemctl restart sshd

    上传完成后建议改回 PermitRootLogin no,关闭 root 登录。

Q3. 上传文件成功,但服务器上看不到文件?

场景:SCP 命令执行后显示 100% 传输完成,但登录服务器后在目标目录找不到文件。

原因:

① 上传时目标目录路径写错了(比如多写了一个空格或字母);

② 服务器开启了 AppArmor,限制了文件写入后的可见性。

解决:

① 重新核对 SCP 命令中的远程目录路径,确保和服务器上的路径一致;② 检查 AppArmor 状态并临时关闭(测试用):

 # 查看 AppArmor 状态
sudo aa-status
# 临时关闭针对 apache2 的限制(如果目标目录是 web 目录)
sudo aa-complain /etc/apparmor.d/usr.sbin.apache2

关闭后再上传,若能看到文件,说明是 AppArmor 限制,需修改配置文件放行(具体参考 AppArmor 官方文档)。

总结

Ubuntu 上传服务器文件的权限问题,看似复杂,其实核心就是“谁有权限操作哪个目录”。

欢迎在评论区留言交流

版权声明

未经授权,禁止转载本文章。
如需转载请保留原文链接并注明出处。即视为默认获得授权。
未保留原文链接未注明出处或删除链接将视为侵权,必追究法律责任!

本文原文链接: https://fiveyoboy.com/articles/ubuntu-upload-err-1/

备用原文链接: https://blog.fiveyoboy.com/articles/ubuntu-upload-err-1/