Como liberar o uso do sudo sem senha apenas para o rsync no Debian

Ao usar o rsync via SSH, muitas vezes é necessário executá-lo como root no servidor remoto. Para evitar abrir o SSH para login direto do usuário root, o caminho mais seguro é permitir que o usuário remoto use sudo apenas para o comando rsync, e sem precisar digitar a senha.

Este post mostra como configurar isso corretamente em sistemas Debian.


Por que fazer isso?

  • Você precisa executar rsync como root no servidor remoto
  • O login root via SSH está desabilitado (como deve estar)
  • Você quer evitar abrir permissões sudo completas para o usuário

Solução: sudo limitado ao rsync, sem senha


1. Verifique o caminho do rsync

No servidor, rode:

which rsync

O caminho padrão é geralmente:

/usr/bin/rsync

2. Crie um arquivo de regra específica no sudoers.d

Use o visudo para garantir que não haja erros de sintaxe:

sudo visudo -f /etc/sudoers.d/rsync_user

Adicione a seguinte linha:

usuario ALL=(ALL) NOPASSWD: /usr/bin/rsync

Substitua usuario pelo nome real do usuário usado na conexão SSH.

Isso concede permissão para executar somente o comando /usr/bin/rsync com sudo, sem pedir senha.


3. Remova possíveis restrições de TTY

Algumas distribuições, inclusive o Debian, podem exigir um terminal para sudo funcionar. Verifique se requiretty está desativado.

Abra o arquivo principal do sudoers:

sudo visudo

Procure por:

Defaults requiretty

Se existir e não estiver comentado, comente:

# Defaults requiretty

Se não existir, não precisa fazer nada.


4. Teste a permissão

Ainda no servidor, simule o que será feito pelo cliente:

sudo -u usuario sudo /usr/bin/rsync --version

Deve exibir a versão do rsync sem pedir senha. Se pedir senha ou falhar, revise as permissões.


5. Exemplo de uso com rsync remoto

No cliente (seu computador local), o comando fica assim:

rsync -avz --progress -e "ssh -p 10022" --rsync-path="sudo rsync" usuario@servidor:/caminho/origem/ /caminho/destino/

Ou, se for executar localmente como root:

sudo rsync -avz --progress -e "ssh -p 10022" --rsync-path="sudo rsync" usuario@servidor:/caminho/origem/ /caminho/destino/

Isso executa o rsync local como root, e no servidor remoto também como root, mas sem exigir login root e sem senha de sudo.


Considerações

  • Este método é seguro porque limita o acesso sudo apenas ao comando necessário (rsync)
  • Nunca use ALL=(ALL) NOPASSWD: ALL sem necessidade real
  • Esta abordagem é ideal para scripts de backup, sincronização e deploy entre servidores
Rolar para cima