我注意到,如果您中断rsync
,一些新目录仍然具有权限drwx------
,尽管当前的umask是0022
。
我启动了gdb
,并在调用umask(0)
之前尝试明确地调用mkdir()
,但它没有效果:我希望新的dirs有drwxrwxrwx
,但他们仍然有drwx------
。
(在较新版本的rsync中,它们不再是drwx------
,但仍然不受umask的影响)
如果我将命令更改为/bin/mkdir
,则调用umask()
即可开始工作。似乎rsync
正在使用一些魔法。
这是一个测试脚本:
(由于某种原因,mkdir()
上的断点仅在从ssh复制时有效)
(
rm -rf /tmp/3 && mkdir -p /tmp/3 && cd /tmp/3 &&
#gdb -q -nx --args /bin/mkdir foo <<EOF
gdb -q -nx --args rsync -r --include=/profile.d --exclude="*" localhost:/etc/ ./ <<'EOF'
set width 0
set height 0
set pagination no
set breakpoint pending on
b mkdir
b mkdirat
run
del
print (char*)$rdi
call umask(0)
call mkdir("test")
fin
shell ls -l
p/o umask(0)
k
EOF
)
_
Reading symbols from /usr/bin/rsync...Reading symbols from /usr/bin/rsync...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Missing separate debuginfos, use: debuginfo-install rsync-3.0.9-15.el7.x86_64
(gdb) (gdb) (gdb) (gdb) (gdb) Breakpoint 1 at 0x6c70
(gdb) Function "mkdirat" not defined.
Breakpoint 2 (mkdirat) pending.
(gdb) Starting program: /usr/bin/rsync -r --include=/profile.d --exclude=\* localhost:/etc/ ./
Detaching after fork from child process 15444.
Detaching after fork from child process 15464.
Breakpoint 1, 0x00007ffff76ee720 in mkdir () from /lib64/libc.so.6
(gdb) Delete all breakpoints? (y or n) [answered Y; input not from terminal]
mkdir论点:
(gdb) $1 = 0x7fffffff9330 "profile.d"
之前的umask值:
(gdb) $2 = 0
mkdir("test")
(gdb) $3 = 0
_
(gdb) Run till exit from #0 0x00007ffff76ee720 in mkdir () from /lib64/libc.so.6
0x000055555556845f in recv_generator ()
(gdb) total 8
drwx------ 2 il il 4096 Jan 28 20:02 profile.d
drwx------ 2 il il 4096 Jan 28 20:02 test
(gdb) $4 = 0
(gdb) Kill the program being debugged? (y or n) [answered Y; input not from terminal]
rsync: connection unexpectedly closed (31 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
(gdb) quit
[il@basinsrv ~]$ rsync: connection unexpectedly closed (51 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [receiver=3.0.9]
答案 0 :(得分:1)
创建目录时请求的权限被umask屏蔽,以获得最终权限。
Rsync最有可能使用远程目录中的权限应用于本地权限。此外,rsync可能是在使用chmod()系统调用创建目录后设置权限,该调用根本不应用umask。
umask设置旨在在创建目录或文件时允许默认权限,而无需专门设置文件的权限。创建文件的大多数简单实用程序只需要请求权限模式666(每个人的完整权限),并让umask修剪它。
另请注意,使用gdb可能无法正常工作。 GDB可以打破用户空间中的函数调用,但不能打破系统调用。尝试使用strace
(如果这是Linux / Unix) - 它会显示所有系统调用(对于这样的情况非常非常方便)。