c.buhtz at posteo.jp
2022-Sep-02 08:19 UTC
Make an rsync using script with old and new versions of rsync without using the "old" way (--old-args)?
Hello, this is not a usual support question which could be solved by reading documentation. I'm an upstream maintainer highly depending on rsync. I'm doing some research to better understand the behavior change [1] about argument protection when using spaces in path names. I'm not sure if I understand all details correct. And that is why I'm asking here. I would like to have a confirmation that I understand the details correct and that my "solution" is a good choice or if there are alternatives. Let's see what I currently "know" and please correct me if I'm wrong. 1. rsync version 3.2.3 (and older) doing it the "old" way which is unusual or unexpected by the users because it is not the way other applications usually handle path names in arguments. 2. rsync version 3.2.4 (and younger) doing it the "new" way which is IMHO the recommended and preferd way. 3. `--old-args` activates the "old" behavior 4. `--protect-args` activates the "new" behavior 5. `--old-args` and `--protect-args` are the opposite of each other? (See that Issue [6]) 6. `--old-args` exist in 3.2.4 (and younger) as a workaround to keep old scripts working 7. `--protect-args` was introduced much earlier with 3.0.0 [2] to activate the "new" way Am I correct so far? My goals are 1. Use the "new" arg protection way introduced with 3.2.4 2. Scripts/applications using that "new way" should work with old and new versions of rsync without checking for the rsync version on the current system. My goals in short: I want one way that will work now, in the feature and with all rsync versions. Based on my current research it seems to me the solution would be to modify calls like this rsync -aiv host:"a simple file.pdf" . to this with replacing double with single quotes and adding `-s` (short for `--protect-args`): rsync -s -aiv host:'a simple file.pdf' . I'm using `-s` here because `--protect-args` will be renamed to `--secluded-args` in rsync 3.2.6 [3]. Sidenote: I still asked that question here [4] and here [5]. [1] -- <https://download.samba.org/pub/rsync/NEWS#BEHAVIOR_CHANGES-3.2.4> [2] -- <https://download.samba.org/pub/rsync/NEWS#ENHANCEMENTS-3.0.0> [3] -- <https://download.samba.org/pub/rsync/NEWS#ENHANCEMENTS-3.2.6> [4] -- <https://unix.stackexchange.com/q/715216/136851> [5] -- <https://forums.debian.net/viewtopic.php?f=10&t=152720> [6] -- <https://bugzilla.samba.org/show_bug.cgi?id=15154>
Wayne Davison
2022-Sep-10 15:20 UTC
Make an rsync using script with old and new versions of rsync without using the "old" way (--old-args)?
On Fri, Sep 2, 2022 at 1:19 AM c.buhtz wrote:> 4. `--protect-args` activates the "new" behavior >Essentially, just in a way that has a couple drawbacks: it would have refused to work with rsyncs older than 3.0.0, and it would have refused to work with a remote rrsync setup (since the "protected" args are sent via the protocol where rrsync can't see them to verify them). 5. `--old-args` and `--protect-args` are the opposite of each other? Yes, protecting the args prevents things like remote space splitting and such. My goals are> 1. Use the "new" arg protection way introduced with 3.2.4 > 2. Scripts/applications using that "new way" should work with old and > new versions of rsync without checking for the rsync version on the > current system. >The easiest way to do that in a script or even in a user's shell-rc files is to export 2 environment variables: export RSYNC_OLD_ARGS=0 export RSYNC_PROTECT_ARGS=1 If rsync is 3.2.4 or newer, it will see the newer env var and continue with its new-style arg protection (since the 0 tells it you don't want --old-args to be used). An older rsync will not even notice that variable and will instead ensure that --protect-args is enabled by default, giving it a similar style of arg protection, just one that will complain if a remote rsync is 2.6.9 (which should be pretty much gone these days) or an rrsync restricted shell. These variables don't interfere with manual overrides on the command-line -- they just ensure the default is what you want. Your suggestion of forcing on --seclude-args (aka --protect-args) via -s is also a reasonable way to go in most instances. I'm using `-s` here because `--protect-args` will be renamed to> `--secluded-args` in rsync 3.2.6. >Just because --secluded-args is its new name doesn't mean that rsync stops accepting the older arg name. But -s is always easier to type. ..wayne.. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.samba.org/pipermail/rsync/attachments/20220910/7a68d5d0/attachment.htm>