Aqui está uma versão modificada da resposta de Willie Wheeler que transfere o (s) arquivo (s) via tar, mas também suporta a passagem de uma senha para o sudo no host remoto.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
O pouco de mágica extra aqui é a opção -S para sudo. Na página do manual do sudo:
-S, --stdin Escreva o prompt para o erro padrão e leia a senha da entrada padrão em vez de usar o dispositivo terminal. A senha deve ser seguida por um caractere de nova linha.
Agora, na verdade, queremos que a saída do tar seja canalizada para o ssh e isso redirecione o stdin do ssh para o stdout do tar, removendo qualquer maneira de passar a senha para o sudo a partir do terminal interativo. (Poderíamos usar o recurso ASKPASS do sudo na extremidade remota, mas isso é outra história.) Podemos obter a senha no sudo, capturando-a com antecedência e acrescentando-a à saída do tar, executando essas operações em um subshell e canalizando a saída de o subshell em ssh. Isso também tem a vantagem adicional de não deixar uma variável de ambiente contendo nossa senha pendurada em nosso shell interativo.
Você notará que não executei 'read' com a opção -p para imprimir um prompt. Isso ocorre porque o prompt de senha do sudo é convenientemente passado de volta ao stderr do nosso shell interativo via ssh. Você pode se perguntar "como o sudo está sendo executado, uma vez que está sendo executado dentro do ssh à direita do nosso pipe?" Quando executamos vários comandos e canalizamos a saída de um para o outro, o shell pai (o shell interativo neste caso) executa cada comando na sequência imediatamente após a execução do anterior. À medida que cada comando atrás de um pipe é executado, o shell pai anexa (redireciona) o stdout do lado esquerdo ao stdin do lado direito. A saída se torna entrada à medida que passa pelos processos.
$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce:
[1]+ Stopped ( stty -echo; read passwd; stty echo; echo
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C
/var/www/ -xz; echo\""
$ pstree -lap $$
bash,7168
├─bash,7969
├─pstree,7972 -lap 7168
└─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`
Nosso shell interativo é o PID 7168, nosso subshell é o PID 7969 e nosso processo ssh é o PID 7970.
A única desvantagem é que a leitura aceitará a entrada antes que o sudo tenha tempo de enviar sua solicitação de volta. Em uma conexão rápida e em um host remoto rápido, você não notará isso, mas poderá se estiver lento. Qualquer atraso não afetará a capacidade de inserir o prompt; isso pode aparecer após você começar a digitar.
Nota: eu simplesmente adicionei uma entrada de arquivo host para "remote_Host" na minha máquina local para a demonstração.