Вот измененная версия ответа Вилли Уилера, которая передает файл (ы) через 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 man:
-S, --stdin Введите запрос стандартной ошибки и прочитайте пароль со стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.Теперь мы действительно хотим, чтобы выход tar включался в ssh и перенаправлял stdin ssh в stdout tar, удаляя любой способ передать пароль в sudo из интерактивного терминала. (Мы можем использовать функцию ASKPASS от sudo на удаленном конце, но это еще одна история.) Мы можем получить пароль в sudo, хотя, предварительно захватив его и добавив его в выход tar, выполнив эти операции в подоболочке и выполнив вывод подоболочка в ssh. Это также имеет дополнительное преимущество, не оставляя переменную среды, содержащую наш пароль, свисающий в нашей интерактивной оболочке.
Вы заметите, что я не выполнил 'read' с параметром -p для печати приглашения. Это связано с тем, что запрос пароля от sudo удобно передавать обратно в stderr нашей интерактивной оболочки через ssh. Вы можете задаться вопросом: «Как выполняется sudo, поскольку он работает внутри ssh справа от нашей трубы?» Когда мы выполняем несколько команд и обрабатываем вывод одного в другое, родительская оболочка (в этом случае интерактивная оболочка) выполняет каждую команду в последовательности сразу после выполнения предыдущего. Поскольку каждая команда за трубой выполняется, родительская оболочка присоединяет (перенаправляет) stdout левой стороны к stdin правой части. Выход затем становится входным, когда он проходит через процессы. Мы можем увидеть это в действии, выполнив всю команду и опираясь на группу процессов (Ctrl-z), прежде чем вводить наш пароль, а затем просматриваем дерево процессов.
$ (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.
Единственный недостаток заключается в том, что чтение будет принимать входные данные до того, как sudo успеет отправить обратно приглашение. При быстром подключении и быстром удалённом хосте вы не заметите этого, но можете, если он медленный. Любая задержка не повлияет на возможность ввода подсказки; это может появиться после того, как вы начали печатать.
Примечание. Я просто добавил запись файла хоста для «remote_Host» на свой локальный компьютер для демонстрации.
Рекомендую вам взглянуть на это: https://help.ubuntu.com/12.04/serverguide/installing-upgrading.html