rsync 서버에 사용자 정의 매개변수를 보내는 방법이 있습니까?

rsync 서버에 사용자 정의 매개변수를 보내는 방법이 있습니까?

클라이언트를 위한 백업 서버가 있습니다동기화SSH를 통해. 서버는 rsync 서버 측 호출을 래핑하는 사용자 정의 쉘 스크립트를 실행하도록 구성됩니다. 클라이언트는 이를 인식하지 못하며 유효한 rsync 명령줄을 실행할 수 있습니다.

클라이언트의 일부 매개변수를 이 쉘 스크립트로 전달하고 싶습니다. 그것은 마치

$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server

클라이언트는 (pass ) rsync처럼 자신이 알지 못하는 매개변수를 거부합니다 . 내가 생각해낸 최선의 방법은 rsync 서버를 시작하기 위해 스크립트를 실행하기 전에 스크립트가 서버 측 명령줄에서 추출하는 가짜 서버 측 파일 사양으로 인수를 전달하는 것입니다. 즉, 이와 같은 명령sshrsync -e

$ rsync -av file1 file2 user@server:some/path\;customarg1=value1\;customarg2=value2

두 개의 매개변수를 제공한 다음 명령처럼 작동합니다.

$ rsync -av file1 file2 user@server:some/path

(이것은 SSH 서버가 실행하도록 구성된 내용(예: 사용자 정의 쉘 스크립트)에 관계없이 SSH를 활용하여 ssh 클라이언트에서 실행한 명령(예: rsync 클라이언트가 실행한 rsync 서버 명령)이 포함된 여러 환경 변수를 설정 $SSH_ORIGINAL_COMMAND합니다.

답변1

-M어쩌면 옵션(긴 버전 )을 사용할 수 있지만 --remote-option클라이언트 측 rsync는 해당 옵션을 확인하지 않는 것 같습니다. -M-xxxx리모콘으로 전달되어 -M으로 제거됩니다 -xxxx. 이 기능을 쉽게 사용할 수 있으며 -M-M-xxxx클라이언트와 원격에서는 무시됩니다.

rsync -av -M-M-myvar=val /tmp/test/ remote:test/

rsync를 호출하기 전에 서버 프런트 엔드가 결과 플래그를 인식하고 제거하면 원하는 것을 얻을 수 있습니다.

--rsync-path추가로 이를 사용하여 모든 스크립트를 실행할 수 있습니다 . 원격 매개변수를 연결합니다. 예를 들어

rsync -a -M-myvar=val --rsync-path='echo hello >/tmp/out; ./mysync' /tmp/test/ remote:test/

원격으로 다음과 같은 것을 실행합니다

echo hello >/tmp/out
./mysync --server -logDtpre.iLsfx -myvar=val . test/

답변2

그다지 예쁘지는 않지만 스크립트에 모두 숨길 수 있습니다.

SSH는 터널을 통해 임의의 환경 변수를 보낼 수 있습니다. 클라이언트와 서버 모두 이를 허용하도록 구성해야 합니다. 이 옵션은 클라이언트에서 쉽게 수행할 수 있으며 파일의 서버에서 수행 -o해야 합니다 . sshd_config임의의 것을 받아들이는 것은 좋은 생각이 아니지만 다음과 같이 작동해야 합니다.

BACKUP_PROVIDER_VAR1=val1 rsync -e 'ssh -o SendEnv=BACKUP_PROVIDER_*' …

AcceptEnv LANG LC_* BACKUP_PROVIDER_*그런 다음 하나를 추가 해야 합니다 sshd_config(제가 이해한 바에 따르면 이는 Match차단이 있는 특정 사용자/그룹으로 제한될 수 있습니다). 현실적으로는 백업 클라이언트 LANGLC_*백업 클라이언트가 필요하지 않을 것이므로 사용자 정의 환경 변수만 있으면 됩니다.

답변3

rsync 버전 3.1.0부터 --remote-option매개변수(또는 해당 약어 -M)를 사용하여 매개변수를 서버에 전달할 수 있습니다. 예를 들어 클라이언트에 다음 명령을 실행합니다.

$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path

서버 명령은 접두사가 있지만 -M포함되지 않은 변수의 인수를 수신하게 됩니다. 이와 같이:-MSSH_ORIGINAL_COMMAND

rsync --server -vnlogDtpre.iLsfxC --customarg1=value1 --customarg2=value1 . some/path

서버 측 rsync를 호출하기 전에 사용자 정의 매개변수를 처리하고 명령줄에서 제거해야 합니다(그렇지 않으면 매개변수를 인식하지 못하기 때문에 오류와 함께 종료됩니다). 한 가지 방법은 정규식 일치를 사용하는 것입니다.

rsync_cmd="$SSH_ORIGINAL_COMMAND"
[[ "$rsync_cmd" =~ --customarg1=([a-zA-Z0-9]+) ]] && customarg1=${BASH_REMATCH[1]}
[[ "$rsync_cmd" =~ --customarg2=([a-zA-Z0-9]+) ]] && customarg2=${BASH_REMATCH[1]}
rsync_cmd=$(sed -re 's/--(customarg1|customarg2)=[a-zA-Z0-9]+//g' <<< $rsync_cmd)

(예제 정규식 일치에서는 매개변수가 영숫자일 수 있음)

-s이에 대한 한 가지 주의 사항은 (또는) 옵션이 rsync 클라이언트에 제공되면 아무런 효과가 없다는 것입니다. --protect-args이로 인해 매개변수가 rsync 클라이언트와 서버 간에 내부적으로 전달되기 때문입니다. 해당 매개변수는 셸에 노출되지도 않고 포함되지도 않습니다. $SSH_ORIGINAL_COMMAND이므로 조작할 수 없습니다.

--rsync-path또 다른 방법은 맞춤 매개변수 전달을 사용하는 것입니다 . 이 방법은 다음 옵션이 없는 이전 버전의 -Mrsync 에서 작동합니다 --protect-args.

$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path

관련 정보