Ось модифікована версія відповіді Віллі Уілера, яка передає файли (файли) за допомогою 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:
-S, --stdin Напишіть підказку до стандартної помилки та прочитайте пароль зі стандартного вводу замість використання термінального пристрою. За паролем повинен дотримуватися символ нового рядка.
Тепер ми насправді хочемо, щоб вихід tar був переведений в ssh, і це перенаправляє stdin ssh на stdout tar, видаляючи будь-який спосіб передачі пароля в sudo з інтерактивного терміналу. (Ми можемо використовувати функцію ASKPASS sudo на віддаленому кінці, але це вже інша історія.) Ми можемо отримати пароль в sudo, хоча заздалегідь захопивши його і попередньо додавши його до виходу tar, виконавши ці операції в підзаголовці та передавши на екран вихід нижня оболонка в ssh. Це також має додаткову перевагу - не залишати змінну середовища, що містить наш пароль, що нависає в нашій інтерактивній оболонці.
Ви помітите, що я не виконував "читати" за допомогою параметра -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.
Єдиним недоліком є те, що читання прийме вхід до того, як судо встигне повернути його підказки. При швидкому з'єднанні та швидкому віддаленому хості ви цього не помітите, але, можливо, якщо це буде повільно. Будь-яка затримка не вплине на можливість ввести підказку; це може з’явитися після того, як ви почали вводити текст.
Примітка. Я просто додав запис хост-файлу для "remote_Host" до своєї локальної машини для демонстрації.