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 o sudo. Da página de manual do sudo:
-S, --stdin
Write the prompt to the standard error and read the password from the standard input instead of using the terminal device. The password must be followed by a newline character.
Agora, queremos que a saída do tar seja canalizada para o ssh e redirecione o stdin do ssh para o stdout do tar, removendo qualquer forma de passar a senha para o sudo a partir do terminal interativo. (Poderíamos usar o recurso ASKPASS do sudo no terminal remoto, mas isso é outra história.) Podemos obter a senha no sudo, capturando-a antecipadamente e anexando-a à saída tar executando essas operações em uma subcamada e canalizando a saída de o subshell em ssh. Isso também tem a vantagem de não deixar uma variável de ambiente contendo nossa senha pendurada em nosso shell interativo.
Você notará que eu 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 para o stderr do nosso shell interativo via ssh. Você pode se perguntar "como está a execução do sudo dado que ele está rodando dentro do ssh à direita do nosso pipe?" Quando executamos vários comandos e canalizamos a saída de um para outro, o shell pai (o shell interativo neste caso) executa cada comando na sequência imediatamente após a execução do anterior. Como cada comando atrás de um pipe é executado, o shell pai anexa (redireciona) a stdout do lado esquerdo para o stdin do lado direito. A saída se torna entrada à medida que passa pelos processos. Podemos ver isso em ação, executando todo o comando e fazendo o background do grupo de processos (Ctrl-z) antes de digitar nossa senha e, em seguida, visualizando a árvore de 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.
O único inconveniente é que a leitura aceita entrada antes que o sudo tenha tempo de enviar o prompt de volta. Em uma conexão rápida e rápida hospedagem remota você não vai perceber isso, mas você pode se está lento. Qualquer atraso não afetará a capacidade de inserir o prompt; só pode aparecer depois que você começou a digitar.
Note que eu simplesmente adicionei uma entrada de arquivo host para "remote_Host" na minha máquina local para a demonstração.