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免密规则(适合手动触发脚本的场景)
- 执行
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
- 保存退出配置文件后,将脚本中对应命令修改为带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开机自启服务(适合开机自动挂载场景)
- 提前手动执行一次
sudo mkdir /home/20220630232331创建好挂载目录,修复脚本内的路径bug,将mount路径改为绝对路径。 - 创建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
- 依次执行如下命令重载配置、设置服务开机自启:
sudo systemctl daemon-reload sudo systemctl enable auto-mount-hdd.service
服务默认以root身份运行,开机自动执行时无需密码交互。
方案3:通过fstab配置自动挂载(最稳定的系统原生方案,优先推荐)
不需要依赖自定义脚本,直接使用系统原生的fstab机制实现开机自动挂载:
- 执行
sudo mkdir /mnt/hdd_ext4创建挂载点(不建议在/home下创建一级目录作为永久挂载点,/mnt是系统预留的挂载目录,更符合规范) - 编辑
/etc/fstab文件,追加如下挂载规则(替换为实际分区UUID):
UUID=你的分区实际UUID /mnt/hdd_ext4 ext4 defaults,nofail 0 2
nofail参数可以避免分区未接入时系统开机卡住。
3. 执行sudo mount -a验证配置无报错,后续开机会自动完成挂载,无需额外脚本。
内容的提问来源于stack exchange,提问作者Jono
相关产品推荐
相关产品推荐

