rsync以挂载的内部SSD为源时出现语法/用法错误及权限问题求助
看起来你遇到的是脚本语法细节和挂载权限的混合问题,咱们一步步来拆解排查:
首先看你提到的两个核心错误:
rsync error: syntax or usage error (code 1) at main.c(1850) [Receiver=3.2.7]/home/jc/backup.sh: line 67: /media/Movies: Is a directory
第二个错误其实是关键线索——它说明你的shell在尝试直接执行/media/Movies这个目录,而不是把它作为rsync的参数传递。这大概率是脚本里的换行语法出了问题,咱们先解决这个:
1. 修正rsync命令的换行反斜杠
你用反斜杠给rsync命令换行的思路是对的,但要注意:反斜杠后面绝对不能有任何空格或制表符,必须紧跟换行。如果反斜杠后面不小心加了空格,shell会把反斜杠当成普通字符,导致前面的命令片段被当成完整指令执行,后面的$SRC就变成了单独的命令(而目录本身无法被执行,所以报错)。
修正后的rsync命令应该是这样(确保每一行末尾的反斜杠后无多余字符):
rsync -av --update --delete \ --log-file='/home/jc/rsync-movies2.log' \ --exclude='*/tvshows' \ "$SRC" \ "$DST"
2. 给变量加上双引号
把$SRC和$DST用双引号括起来是个必须养成的好习惯:即使现在路径里没有空格,也能避免路径包含特殊字符(比如空格、括号)时出现解析错误,同时防止变量为空时导致rsync参数异常。
3. 排查挂载点的权限问题
你提到改了挂载文件夹的所有权,但可能挂载时的fstab选项覆盖了这些设置。打开你的/etc/fstab,找到对应UUID的那一行,检查挂载选项(第四个字段):
- 如果是ext4这类支持权限的文件系统,可以加上
uid=你的用户ID,gid=你的用户组ID(比如defaults,uid=1000,gid=1000,1000通常是普通用户的ID),这样挂载后普通用户就能正常读写/media/Movies了。 - 也可以用
umask=002来让同组用户拥有读写权限,根据你的需求调整。
修改fstab后,重新挂载生效:
sudo umount /media/Movies sudo mount /media/Movies
4. 远程目标的权限问题
用sudo运行脚本时,rsync会以root身份连接远程服务器,可能远程服务器的/srv/dev-disk-by-uuid-92b7ffea-567b-4480-aecc-5bb292e8a296/Backup2路径不允许root访问,或者远程sshd配置禁止root登录。
推荐的解决办法:
- 在目标路径前加上远程服务器的普通用户名,比如
jc@192.168.50.156:/srv/.../Backup2,确保这个用户对目标路径有读写权限。 - 如果你必须用root操作远程,需要修改远程服务器的
sshd_config(设置PermitRootLogin yes),但这种做法安全性较差,不推荐。
最后测试
先手动执行修正后的rsync命令,看看能不能正常运行:
SRC='/media/Movies' DST='192.168.50.156:/srv/dev-disk-by-uuid-92b7ffea-567b-4480-aecc-5bb292e8a296/Backup2' rsync -av --update --delete --log-file='/home/jc/rsync-movies2.log' --exclude='*/tvshows' "$SRC" "$DST"
如果手动执行没问题,再把脚本里的命令改成这样,应该就能解决问题了。
备注:内容来源于stack exchange,提问作者Lost_Ones

