You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本mkdir创建目录报Permission denied权限拒绝问题

问题描述

创建指定目录用于挂载HDD硬盘分区时,运行挂载脚本持续返回如下报错:

mkdir: cannot create directory ‘/home/20220630232331’: Permission denied

报错来自脚本中ext4分区挂载逻辑段,对应代码如下:

# Mount a ext4 drive
function mountExt4Drive {
    uuid=$1
    location="20220630232331"
    mkdir "/home/$location"
    echo "mounting ext4 hdd $uuid in $location"
    mount UUID=$uuid $location
}

运行前已执行chmod +x auto_mount_hdd.sh为脚本赋予执行权限,但在mkdir前添加sudo会触发密码输入交互,无法满足无人值守自动化运行的要求。

根因说明
  • /home目录默认属主为root,普通用户无该路径下一级目录的创建权限,这是触发权限报错的直接原因
  • chmod +x仅赋予脚本本身可执行属性,不会改变脚本运行时的用户身份,普通用户执行脚本时所有操作仍受普通用户权限限制,而目录创建、磁盘挂载属于系统级操作,默认需要root权限
  • 原代码存在路径不一致bug:mkdir操作的是绝对路径/home/$location,但mount调用的是相对路径$location,会从脚本执行时的当前工作目录查找目标路径,即便权限正常也大概率挂载失败
无人值守场景解决方案

方案1:配置sudo免密规则(适合手动触发脚本的场景)

  1. 执行sudo visudo打开sudo配置文件,在文件末尾追加如下规则(将your_user替换为实际运行脚本的用户名,命令路径可通过which mkdir、which mount查询确认):
your_user ALL=(ALL) NOPASSWD: /usr/bin/mkdir /home/20220630232331, /usr/bin/mount UUID=* /home/20220630232331
  1. 保存退出配置文件后,将脚本中对应命令修改为带sudo的绝对路径写法,修复原路径bug:
function mountExt4Drive {
    uuid=$1
    mount_path="/home/20220630232331"
    sudo mkdir "$mount_path"
    echo "mounting ext4 hdd $uuid in $mount_path"
    sudo mount UUID=$uuid "$mount_path"
}

配置完成后执行脚本不会再触发密码输入。

方案2:配置systemd开机自启服务(适合开机自动挂载场景)

  1. 提前手动执行一次sudo mkdir /home/20220630232331创建好挂载目录,修复脚本内的路径bug,将mount路径改为绝对路径。
  2. 创建systemd服务配置文件/etc/systemd/system/auto-mount-hdd.service,写入如下内容(替换为脚本实际绝对路径和分区UUID):
[Unit]
Description=Auto mount ext4 HDD
After=blockdev@dev-disk-by\x2duuid-替换为你的分区实际UUID.target

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/auto_mount_hdd.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  1. 依次执行如下命令重载配置、设置服务开机自启:
sudo systemctl daemon-reload
sudo systemctl enable auto-mount-hdd.service

服务默认以root身份运行,开机自动执行时无需密码交互。

方案3:通过fstab配置自动挂载(最稳定的系统原生方案,优先推荐)

不需要依赖自定义脚本,直接使用系统原生的fstab机制实现开机自动挂载:

  1. 执行sudo mkdir /mnt/hdd_ext4创建挂载点(不建议在/home下创建一级目录作为永久挂载点,/mnt是系统预留的挂载目录,更符合规范)
  2. 编辑/etc/fstab文件,追加如下挂载规则(替换为实际分区UUID):
UUID=你的分区实际UUID  /mnt/hdd_ext4  ext4  defaults,nofail  0  2

nofail参数可以避免分区未接入时系统开机卡住。
3. 执行sudo mount -a验证配置无报错,后续开机会自动完成挂载,无需额外脚本。


内容的提问来源于stack exchange,提问作者Jono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:48:39