Вот модифицированная версия ответа Вилли Уилера, которая передает файл (ы) через tar, но также поддерживает передачу пароля к sudo на удаленном хосте.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Немного дополнительной магии здесь - опция -S для sudo. Со страницы руководства sudo:
-S, --stdin Записать подсказку к стандартной ошибке и прочитать пароль из стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.
Теперь мы на самом деле хотим, чтобы вывод tar передавался в ssh, и это перенаправляет стандартный вывод ssh на стандартный вывод tar, удаляя любой способ передачи пароля в sudo с интерактивного терминала. (Мы могли бы использовать функцию sudo ASKPASS на удаленном конце, но это уже другая история.) Мы можем получить пароль в sudo, хотя, захватывая его заранее и добавляя его к выводу tar, выполняя эти операции в подоболочке и передавая выходные данные подоболочка в ssh. Это также имеет дополнительное преимущество - не оставлять переменную окружения, содержащую наш пароль, в нашей интерактивной оболочке.
Вы заметите, что я не выполнил 'read' с опцией -p, чтобы напечатать приглашение. Это потому, что запрос пароля от sudo удобно передается обратно в stderr нашей интерактивной оболочки через ssh. Вы можете задаться вопросом "как выполняется sudo, если он работает внутри ssh справа от нашего канала?" Когда мы выполняем несколько команд и перенаправляем вывод одной команды в другую, родительская оболочка (в данном случае интерактивная оболочка) выполняет каждую команду в последовательности сразу после выполнения предыдущей. При выполнении каждой команды за каналом родительская оболочка прикрепляет (перенаправляет) стандартный вывод левой стороны к стандартному выводу правой стороны. Выход становится входным по мере прохождения через процессы.
$ (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"`
Наша интерактивная оболочка - PID 7168, наша подоболочка - PID 7969, а наш процесс ssh - PID 7970.
Единственным недостатком является то, что read примет ввод, прежде чем sudo успеет отослать ответ. На быстром соединении и быстром удаленном хосте вы не заметите этого, но можете сделать это медленно. Любая задержка не повлияет на возможность ввода приглашения; это может появиться только после того, как вы начали печатать.
Примечание. Я просто добавил запись файла хоста для "remote_Host" на мою локальную машину для демонстрации.