rsync - mkstemp 失败:权限被拒绝(13)

81

我有以下设置,定期将文件从服务器A同步到服务器B。服务器B启动了rsync守护进程,并使用以下配置:

read only = false
use chroot = false
max connections = 4
syslog facility = local5
log file = /var/adm/rsyncd.log
munge symlinks = false
secrets file = /etc/rsyncd.secrets
numeric ids = false
transfer logging = true
log format = %h %o %f %l %b


[BACKUP]
        path = /path/to/archive
        auth users = someuser

我从服务器 A 发出以下命令:

rsync -adzPvO --delete --password-file=/path/to/pwd/file/pwd.dat /dir/to/be/backedup/ someuser@192.168.100.100::BACKUP

备份目录对所有人都有完全的读写和执行权限。当我从服务器A运行rsync命令时,我看到:

afile.txt
         989 100%    2.60kB/s    0:00:00 (xfer#78, to-check=0/79)

我希望备份目录中的每一个文件,但写临时文件时失败了:

rsync: mkstemp "/.afile.txt.PZQvTe" (in BACKUP) failed: Permission denied (13)

搜索了好几个小时后,我仍然无法解决一个看起来非常简单的权限问题。有什么建议吗?提前感谢。

额外信息

我刚刚注意到在进程开始时发生了以下情况:

rsync: failed to set permissions on "/." (in BACKUP): Permission denied (13)

它是在尝试为“/”设置权限吗?

编辑

我已经以用户someuser的身份登录。我的目标目录对于每个人都具有完全的读/写/执行权限,包括其内容。此外,目标目录归属于someuser并且属于someuser的组。

后续

我发现使用SSH可以解决这个问题。


这个配置曾经工作过吗? - Gilles Quénot
1
@sputnick:我使用相同的配置通过rsync进行PULL,但这个过程是PUSH。所以回答你的问题,我没有在这种设置中使用过这个配置。 - user320487
3
使用SSH只是一种解决方法,不是真正理解和解决权限问题的方法。我也遇到了类似的问题,但使用SSH对我不是一个选择 :/ - Jorge Orpinel Pérez
1
错误(13)是文件夹权限问题。这里很好地解释了http://superuser.com/questions/398146/rsync-permission-denied-backing-up-a-remote-directory-to-my-local-machine。 - ajmccall
18个回答

38

请确保您在远程机器上通过rsync连接的用户对文件夹及其内容具有写入权限,因为rsync尝试更新文件夹本身的修改时间。


谢谢您的回复。我已确保自己是具有权限、所有权和组设置的同一用户。请查看我的编辑。 - user320487
3
谢谢。我在 Synology DiskStation 上遇到了这个问题,而它解决了这个问题。无论所有者是不是管理员,该文件夹必须由 rsync 作业用户拥有。 - M46
1
确实,感谢 @mauvis-ledford,在这种情况下,远程文件夹是 root:root 而不是 someuser:someuser(我们使用 someuser 进行连接...) - Ramon Fincken

20
虽然你已经解决了问题,但我最近遇到了类似的情况,没有任何SO或Google搜索有帮助,因为它们都处理基本的权限问题,而下面的解决方案则是一种在大多数情况下你甚至不会想到检查的偏离设置。
最近我自己也遇到了rsync的权限问题,尽管两个服务器的权限(包括拥有者和组)完全相同,但rsync传输在一个服务器上可以工作,在另一个服务器上却无法工作。原来,我从中被拒绝访问的服务器启用了SELinux,这反过来覆盖了文件/文件夹的POSIX权限。所以,即使在提问的文件夹中,以root身份运行并且其权限等级可达到777,但由于命令 SELinux 启用了,则会覆盖这些权限,从而在 rsync 中产生“permission denied”错误。
您可以运行命令getenforce来查看机器上是否启用了SELinux。
在我的情况下,我最终只需要彻底禁用SELINUX即可,因为它是不必要的,并且在正常工作的服务器上已经禁用,它只会在启用时造成问题。 要禁用,请打开/etc/selinux/config并设置SELINUX=disabled。要暂时禁用,可以运行命令setenforce 0,这将使SELinux进入permissive状态,而不是强制实施的enforcing状态,从而产生警告而不是强制执行。

对我来说,是SELinux!谢谢! - Christian Ulbrich
如果我在运行 getenforce 命令时收到“command not found”的错误提示,这是否意味着我的服务器没有安装 SELinux? - Marecky
@Marecky 不一定,这取决于您如何运行命令和/或您的$PATH变量设置可能导致命令未找到。尝试运行/usr/sbin/getenforce,这是通常getenforce所在的完整路径。 - Jeff Wilbert
@Marecky,你也可以通过搜索已安装的软件包yum list installed | grep selinux或者apt list --installed | grep selinux(取决于发行版)来查找。请注意,如果找到了libselinux,并不意味着它在服务器上被启用和/或激活。检查selinux的另一种选择是AppArmor apparmor_status - Jeff Wilbert

18

Rsync守护程序在以root用户身份运行时,默认为所有模块使用nobody/nogroup用户。因此,您需要为要使用的用户定义uidgid参数,或将它们设置为root/root。


2
这个答案真的帮了我很多。由于通过ssh进行rsync太慢了(而且我必须允许root通过ssh,这是不好的),所以我不得不设置rsync守护进程。但是,尽管远程守护进程已经作为root运行,我仍然不断收到“在“/。”(在linuxbackup中)上设置时间失败:操作不允许(1)”的错误提示。在rsyncd.conf中将“uid”和“gid”更改为“root”解决了这个问题。 - user10607
1
这对我来说证明是正确的解决方法。我以为是SELinux的问题,但是在使用“chcon”命令无法解决后...我的rsyncd.conf文件中有“uid =%RSYNC_USER_NAME%”和“gid = *”,看起来只要源客户端与目标目录具有相同的ID,它就应该能够正常工作。将两者都显式设置为“root”即可解决问题。 - pyansharp

15

我遇到了同样的问题,通过更改目标文件夹的用户 chown 来解决了它。当前用户没有读取、写入和执行目标文件夹文件的权限。尝试通过 chmod a+rwx <folder/file name> 添加权限。


最好附上代码示例。 - Gahan
1
拥有整个路径层次结构显然很重要。仅拥有目标文件夹的所有权是不够的。您还必须拥有父目录的所有权。我有点惊讶,但只有当我拥有所有父级的所有权时才能正常工作... - Altimac

7
这可能并不适用于所有人,因为它不保留原始文件权限,但在我的情况下并不重要,并且它解决了我的问题。rsync有一个选项--chmod

--chmod此选项告诉rsync将一个或多个逗号分隔的"chmod"字符串应用于传输中文件的权限。生成的值被视为发送方为该文件提供的权限,这意味着如果没有启用--perms,则此选项似乎对现有文件没有影响。

这会强制文件/目录的权限符合你想要的。例如:
rsync -av --chmod=Du+rwx SRC DST

将读、写和执行权限添加到所有转移目录的用户。


对我来说也是一样,使用SSH上的rsync将Synology NAS备份到远程服务器。 - Simon
Synology-NAS:我必须添加--rsync-path=/bin/rsync到rsync中,以摆脱“权限被拒绝”的问题。 - fdelia
正如@fdelia建议的那样,在rsync命令中添加--rsync-path=/usr/bin/rsync,现在我有了rsync -rvp --rsync-path=/usr/bin/rsync $SOURCE $DESTINATION,神奇地解决了我的问题。但我不知道为什么,这有点令人沮丧。 - Jakob Ojvind Nielsen

3
我遇到了类似的问题,但是我的情况是因为存储只有SFTP,没有ssh或rsync守护程序。我无法更改任何内容,因为这个服务器是由我的客户提供的。
rsync无法更改文件的日期和时间,其他一些工具(如csync)显示了其他错误:“无法创建临时文件,检测到时钟偏差”。 如果您可以访问存储服务器 - 只需安装openssh-server或在此处启动rsync作为守护程序。
在我的情况下 - 我无法这样做,解决方案是:lftp。 lftp用于同步的使用方法如下:
lftp -c "open -u login,password sftp://sft.domain.tld/; mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder - 是我电脑上的文件夹,/rem/folder - 是 sftp://sft.domain.tld/rem/folder。
你可以通过链接lftp.yar.ru/lftp-man.html找到详细的手册。

天才!感谢您提供这个伟大的工具! - GTodorov

2

Windows:检查目标文件夹的权限。如果必须要授权给运行rsync服务的账户,请先获取所有权。


2
我曾在CentOS 7中遇到同样的问题。我阅读了很多文章和论坛,但无法找到解决方案。 问题出在SElinux身上。在服务器端禁用SElinux即可解决。 检查服务器端的SELinux状态(从您正在使用rsync拉取数据的地方) 检查SELinux状态并禁用它的命令如下: $getenforce 强制执行 ## 这意味着SElinux已启用 $setenforce 0 $getenforce 宽容
现在尝试在客户端运行rsync命令,对我来说可行。 祝好运!
最初的回答: 在CentOS 7中禁用SElinux可能会解决rsync问题。可以通过以下命令检查并禁用SElinux: $getenforce 这将告诉你当前的SElinux状态。如果它处于“Enforcing”模式,则需要禁用它: $setenforce 0 再次运行$getenforce,应该看到“Permissive”。现在尝试重新运行rsync命令。

1

我曾遇到同样的问题,所以我首先通过SSH登录服务器来确认我能否使用以下命令登录到服务器:

ssh -i /Users/Desktop/mypemfile.pem user@ec2.compute-1.amazonaws.com

接着在新终端中,我使用SCP将一个小文件复制到了服务器上,以确保我能够建立连接:

scp -i /Users/Desktop/mypemfile.pem /Users/Desktop/test.file user@ec2.compute-1.amazonaws.com:/home/user/test/

然后在同一个新终端中,我尝试运行rsync:

rsync -avz -e "ssh -i /Users/Desktop/mypemfile.pem" /Users/Desktop/backup/image.img.gz user@ec2.compute-1.amazonaws.com:

1
如果您正在使用树莓派或其他带有sudo的Unix系统,则需要告诉远程计算机rsyncsudo程序所在的位置。
为了安全起见,我输入了完整路径。
以下是我的示例:
rsync --stats -paogtrh --progress --omit-dir-times --delete --rsync-path='/usr/bin/sudo /usr/bin/rsync'  /mnt/drive0/ pi@192.168.10.238:/mnt/drive0/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接