Desde o rsync versão 3.1.0, um argumento --remote-option
(ou sua forma abreviada -M
) está disponível para passar argumentos para o servidor. Por exemplo, dando ao cliente o comando:
$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path
resultará no comando do servidor recebendo os argumentos prefixados com -M
, mas sem o -M
, na variável SSH_ORIGINAL_COMMAND
. Assim:
rsync --server -vnlogDtpre.iLsfxC --customarg1=value1 --customarg2=value1 . some/path
Os argumentos personalizados precisam ser processados e removidos da linha de comando antes de invocar o rsync do lado do servidor (caso contrário, terminará com um erro porque não os reconhece). Uma maneira de fazer isso é com uma correspondência de expressão regular:
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)
(o exemplo de correspondência regex permite que o parâmetro seja alfanumérico)
Uma ressalva para isso é que ele não funciona se o cliente rsync receber a opção -s
(ou --protect-args
) porque isso faz com que os argumentos sejam passados internamente entre o cliente e o servidor rsync - eles não são expostos para o shell, não estão incluídos em $SSH_ORIGINAL_COMMAND
e, portanto, não podem ser manipulados.
Um método alternativo é usar --rsync-path
para passar os argumentos personalizados. Este método funciona com versões mais antigas do rsync que não possuem -M
, bem como com a opção --protect-args
:
$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path