Alexander Grahn
2006-Apr-26  13:47 UTC
--link-dest and file/dir transfer to remote rsync daemon
Hi NG,
I want to do incremental backups to a remote server running rsyncd
(because daemonless transfer via ssh often hangs!). In contrast to
transfer via ssh (without remote rsyncd) this doesn't seem possible, or
do I miss something?
Imagine I want to incrementally backup `mydir' to the backup space
`backup' on e remote server `alpha' running an rsync daemon. rsyncd on
`alpha' is configured as follows:
  [backup]
    path = /home/grahn/backupdir
If I run:
  rsync --port=54321 -a -v --link-dest=../yesterday mydir alpha::backup/today
on the local machine, the directory structure
  /home/grahn/backupdir/today/mydir/test.txt
is created on remote `alpha'. Contrary to what was expected, the file
`test.txt' which hasn't changed since yesterday is not hard linked to
  /home/grahn/backupdir/yesterday/mydir/test.txt
On the other hand this works (transfer via ssh tunnel):
  rsync -a -v --link-dest=../yesterday mydir alpha:backupdir/today
The hard link is created, as expected.
What's wrong with the first (remote rsyncd) approach?
Thanks for any piece of advice!
Alex
Wayne Davison
2006-Apr-27  16:48 UTC
--link-dest and file/dir transfer to remote rsync daemon
On Wed, Apr 26, 2006 at 03:22:49PM +0200, Alexander Grahn wrote:> rsync --port=54321 -a -v --link-dest=../yesterday mydir alpha::backup/todayIf you don't have "use chroot = yes" in your daemon config, rsync can get overzealous in its sanitizing of the options and eliminate the ../ from your --link-dest option. I'd suggest using "/yesterday" instead, since that will anchor at the root of the module in any modern rsync. ..wayne..
Wayne Davison
2006-Apr-28  17:36 UTC
--link-dest and file/dir transfer to remote rsync daemon
On Thu, Apr 27, 2006 at 09:48:17AM -0700, Wayne Davison wrote:> rsync can get overzealous in its sanitizing of the options and > eliminate the ../ from your --link-dest option.The attached patch fixed the overzealous sanitizing of the various --*-dest options by factoring in the depth of the destination dir for the transfer. This has been checked into CVS. ..wayne.. -------------- next part -------------- --- main.c 25 Apr 2006 23:51:15 -0000 1.302 +++ main.c 28 Apr 2006 16:56:38 -0000 @@ -49,6 +49,8 @@ extern int preserve_hard_links; extern int protocol_version; extern int recurse; extern int relative_paths; +extern int sanitize_paths; +extern int module_id; extern int rsync_port; extern int whole_file; extern int read_batch; @@ -59,10 +61,13 @@ extern int filesfrom_fd; extern pid_t cleanup_child_pid; extern struct stats stats; extern char *filesfrom_host; +extern char *basis_dir[]; extern char *rsync_path; extern char *shell_cmd; extern char *batch_name; +extern char curr_dir[MAXPATHLEN]; + int local_server = 0; mode_t orig_umask = 0; struct file_list *the_file_list; @@ -785,6 +790,16 @@ static void do_server_recv(int f_in, int if (argc > 0) local_name = get_local_name(flist,argv[0]); + /* Now that we know what our destination directory turned out to be, + * we can sanitize the --link-/copy-/compare-dest args correctly. */ + if (sanitize_paths) { + char *dest_path = curr_dir + strlen(lp_path(module_id)); + int dest_depth = count_dir_elements(dest_path); + char **dir; + for (dir = basis_dir; *dir; dir++) + *dir = sanitize_path(NULL, *dir, NULL, dest_depth); + } + exit_code = do_recv(f_in,f_out,flist,local_name); exit_cleanup(exit_code); } --- options.c 25 Apr 2006 23:51:15 -0000 1.334 +++ options.c 28 Apr 2006 16:56:38 -0000 @@ -1048,10 +1048,9 @@ int parse_arguments(int *argc, const cha MAX_BASIS_DIRS, dest_option); return 0; } - arg = poptGetOptArg(pc); - if (sanitize_paths) - arg = sanitize_path(NULL, arg, NULL, 0); - basis_dir[basis_dir_cnt++] = (char *)arg; + /* We defer sanitizing this arg until we know what + * our destination directory is going to be. */ + basis_dir[basis_dir_cnt++] = (char *)poptGetOptArg(pc); break; case OPT_CHMOD:
Reasonably Related Threads
- rsync 2.6.0: possible sanitization bug?
- rsync 2.6.1 released (including security note)
- DO NOT REPLY [Bug 6116] New: Cannot access files in exposed shadow drive in version 3.0.5
- [Bug 8138] New: Per-dir merge files not reloaded properly when switching source args with --i-r
- [Bug 12036] New: Multiple --link-dest, --copy-dest, or --compare-dest flags produce incorrect behavior