rsync 파일`a`b

rsync 파일`a`b

네, 당신이 무슨 생각을 하는지 압니다. "도대체 누가 파일 이름을 지정하는 걸까요 `a`b?"

하지만 당신이 가정하자하다`a`b(아마도 당신이 아닌 미친 Mac 사용자가 만든 것일 수도 있음)라는 파일이 있고 당신은 rsync그것을 원합니다. 확실한 해결책:

rsync server:'./`a`b' ./.;
rsync 'server:./`a`b' ./.;

다음을 제공합니다:

bash: line 1: a: command not found
rsync: [sender] link_stat "/home/tange/b" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1865) [Receiver=3.2.7]
rsync: [Receiver] write error: Broken pipe (32)

심지어:

$ rsync 'server:./\`a\`b' ./.;
bash: line 3: a\: command not found
rsync: [sender] link_stat "/home/tange/\b" failed: No such file or directory (2)
:

rsync내 주문 이 뭐야?~해야 한다달리기?

$ rsync --version
rsync  version 3.2.7  protocol version 31

답변1

수동으로 이등분한 후 rsync의 버그가 발생하여 수정되었습니다.commit 5c93dedf4538 ("SHELL_CHARS에 백틱을 추가합니다."), 이는 곧 출시될 rsync 3.2.8(아직 출시되지 않음)에 나타날 것입니다. 고장났어커밋 6b8db0f6440b("백슬래시 이스케이프를 사용하여 인수 보호 관용구 추가"), 3.2.4에 위치.

완화 조치로 이전 인수 구문 분석 동작( )을 사용하는 옵션이 있습니다 --old-args.

rsync --old-args 'server:./\`a\`b' .

답변2

버전 문제입니다. 서버 버전에 의존하지 않고 클라이언트에 의존하는 것 같습니다.

v3.2.3과 v3.2.7 사이에는 몇 가지 문제가 있었습니다.

좋아요:

$ rsync-v3.2.3 --rsync-path=rsync-v3.2.7  'server:./\`a\`b' ./.;
$ rsync-v3.2.3 --rsync-path=rsync-v3.2.3  'server:./\`a\`b' ./.;
$ rsync-v3.2.3 --rsync-path=rsync-v3.2.3  server:./"'"'`a`'"'"b ./.;

실패하다:

$ rsync-v3.2.7 --rsync-path=rsync-v3.2.7  'server:./\`a\`b' ./.;
bash: line 3: a\: command not found
rsync: [sender] link_stat "/home/tange/\b" failed: No such file or directory (2)
$ rsync-v3.2.7 --rsync-path=rsync-v3.2.3  'server:./\`a\`b' ./.;
bash: line 3: a\: command not found
rsync: [sender] link_stat "/home/tange/\b" failed: No such file or directory (2)
$ rsync-v3.2.3 --rsync-path=rsync-v3.2.3  'server:./`a`b' ./.;
bash: line 1: a: command not found
rsync: [sender] link_stat "/home/tange/b" failed: No such file or directory (2)
$ rsync-v3.2.3 --rsync-path=rsync-v3.2.7  'server:./`a`b' ./.;
bash: line 1: a: command not found
rsync: [sender] link_stat "/home/tange/b" failed: No such file or directory (2)

하지만 진지하게 말하자면, 이것은 두 번 인용해야 할 만큼 재난이 일어나기를 기다리는 것처럼 보입니다 `.

이 점을 지적해주신 @dhag에게 감사드립니다.

안타깝게도 v3.2.7 버전을 사용하여 전송하는 방법에 대해서는 답변하지 않습니다.

답변3

rsync3.0.0 이전 버전을 지원할 필요가 없는 경우 --secluded-argsaka -s(이전 명칭) 를 사용 --protect-args하면 원격 사용자의 로그인 셸(무엇이든 가능)이 파일 이름을 해석하는 방법에 대해 걱정할 필요가 없습니다. rsh/ssh를 통한 rsyncing, 올바르게 인용/이스케이프를 수행하는 것은 거의 불가능합니다. 매뉴얼(3.2.7)에서:

  --secluded-args, -s
         This  option  sends all filenames and most options to the remote
         rsync via the protocol (not the remote shell command line) which
         avoids  letting the remote shell modify them.  Wildcards are ex‐
         panded on the remote host by rsync instead of a shell.

         This is similar to the default backslash-escaping of  args  that
         was  added  in 3.2.4 (see --old-args) in that it prevents things
         like space splitting  and  unwanted  special-character  side-ef‐
         fects.  However, it has the drawbacks of being incompatible with
         older rsync versions (prior to 3.0.0) and of  being  refused  by
         restricted shells that want to be able to inspect all the option
         values for safety.

         This option is useful for those times that you  need  the  argu‐
         ment's character set to be converted for the remote host, if the
         remote shell is incompatible with the default backslash-escpaing
         method, or there is some other reason that you want the majority
         of the options and arguments to bypass the command-line  of  the
         remote shell.

         If you combine this option with --iconv, the args related to the
         remote side will be translated from  the  local  to  the  remote
         character-set.   The  translation  happens before wild-cards are
         expanded.  See also the --files-from option.

         You may also control this setting via the RSYNC_PROTECT_ARGS en‐
         vironment  variable.   If  it has a non-zero value, this setting
         will be enabled by default, otherwise it will be disabled by de‐
         fault.  Either state is overridden by a manually specified posi‐
         tive or negative version of this option (note  that  --no-s  and
         --no-secluded-args are the negative versions).  This environment
         variable is also superseded by a non-zero RSYNC_OLD_ARGS export.

         This option conflicts with the --old-args option.

         This option used to be called --protect-args (before 3.2.6)  and
         that older name can still be used (though specifying it as -s is
         always the easiest and most compatible choice).

관련 정보