-e escape rule

Dave Howorth dhoworth at mrc-lmb.cam.ac.uk
Thu Oct 20 12:46:50 UTC 2016

On 2016-10-20 10:24, Samuel Williams wrote:
> Hello,
> I'm using Ruby's Shellwords module, which generates a string from an
> array, suitable for shell evaluation.
> Ruby's implementation prefers escaping whitespace with a backslash
> rather than quotes. However, this appears to cause some kind of issue
> in Rsync when it computes argv from -e option.

The man page for rsync <https://download.samba.org/pub/rsync/rsync.html> 
explicitly forbids the use of backslashes:

"Command-line arguments are permitted in COMMAND provided that COMMAND 
is presented to rsync as a single argument. You must use spaces (not 
tabs or other whitespace) to separate the command and args from each 
other, and you can use single- and/or double-quotes to preserve spaces 
in an argument (but not backslashes)."

So I think the rest of the question is moot ...

Cheers, Dave

> Here is an example command generated by some Ruby code:
> rsync --archive --stats -e ssh\ -l\ backup\ -i\ /etc/synco/id_rsa\ -o\
> ConnectTimeout\\\=60\ -o\ BatchMode\\\=yes --link-dest
> ../../latest/etc/ /etc/
> example.backup.server.com:/tank/backup/servers/blah/latest.snapshot/etc/
> We can check that something like this is valid:
> files% echo foo\ bar\\\=baz
> foo bar\=baz             -- what Rsync should be receiving
> files% echo foo bar\=baz
> foo bar=baz              -- What Rsync should be executing
> However this gives me an error
> command-line: line 0: Bad configuration option: connecttimeout\\
> rsync: connection unexpectedly closed (0 bytes received so far) [sender]
> rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.2]
> I think the problem here is the "ConnectTimeout\\\=60", in particular
> how the equals symbol is escaped.
> I'm looking in the function:
> static pid_t do_cmd(char *cmd, char *machine, char *user, char
> **remote_argv, int remote_argc,
>    int *f_in_p, int *f_out_p)
> This function splits based purely on whitespace:
>      args[argc++] = t;
>      while (*f != ' ' || in_quote) {
>          // consume token...
> I feel that this function should also handle backslash escapes.
> I also checked using strace and it appears that this is the issue, but
> I'm open to suggestions/ideas.
> Kind regards,
> Samuel

More information about the rsync mailing list