클라이언트를 위한 백업 서버가 있습니다동기화SSH를 통해. 서버는 rsync 서버 측 호출을 래핑하는 사용자 정의 쉘 스크립트를 실행하도록 구성됩니다. 클라이언트는 이를 인식하지 못하며 유효한 rsync 명령줄을 실행할 수 있습니다.
클라이언트의 일부 매개변수를 이 쉘 스크립트로 전달하고 싶습니다. 그것은 마치
$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server
클라이언트는 (pass ) rsync
처럼 자신이 알지 못하는 매개변수를 거부합니다 . 내가 생각해낸 최선의 방법은 rsync 서버를 시작하기 위해 스크립트를 실행하기 전에 스크립트가 서버 측 명령줄에서 추출하는 가짜 서버 측 파일 사양으로 인수를 전달하는 것입니다. 즉, 이와 같은 명령ssh
rsync -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
차단이 있는 특정 사용자/그룹으로 제한될 수 있습니다). 현실적으로는 백업 클라이언트 LANG
나 LC_*
백업 클라이언트가 필요하지 않을 것이므로 사용자 정의 환경 변수만 있으면 됩니다.
답변3
rsync 버전 3.1.0부터 --remote-option
매개변수(또는 해당 약어 -M
)를 사용하여 매개변수를 서버에 전달할 수 있습니다. 예를 들어 클라이언트에 다음 명령을 실행합니다.
$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path
서버 명령은 접두사가 있지만 -M
포함되지 않은 변수의 인수를 수신하게 됩니다. 이와 같이:-M
SSH_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
또 다른 방법은 맞춤 매개변수 전달을 사용하는 것입니다 . 이 방법은 다음 옵션이 없는 이전 버전의 -M
rsync 에서 작동합니다 --protect-args
.
$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path