When uploading our internal test data (which features a rich set of filenames and paths) I've discovered that some files ended up in the wrong place. Here's a reduced setup to reproduce the problem:
- create directory /tmp/foo
- create a minimal rsyncd.conf, e.g.
use chroot = false
uid = thimo
path = /tmp/foo
read only = false
- start rsyncd with "sudo rsync --daemon --no-detach --config=rsyncd.conf"
Now the testcase is to copy some file into arbitrary directories. As a working case perform:
- mkdir -p '/tmp/foo/c boo'
- rsync '/etc/issue' 'rsync://localhost/foo/c boo/issue'
- as expected a file '/tmp/foo/c boo/issue' will appear
Now if the module name (in this case "foo") appears after the space you can see the bug:
- mkdir -p '/tmp/foo/c foo'
- rsync '/etc/issue' 'rsync://localhost/foo/c foo/issue'
- contrary to the case above you'll notice that the file ended up in '/tmp/foo/c' instead of '/tmp/foo/c foo/issue'
Quoting wasn't a problem in the first case, hence it shouldn't be one in the second case
The space splitting is an old "feature" of rsync. Use -s (--protected-args) to avoid that. You can also export RSYNC_USE_PROTECTED_ARGS=yes if you want that to be the default.