Đây là phiên bản sửa đổi của câu trả lời của Willie Wheeler giúp chuyển (các) tệp qua tar nhưng cũng hỗ trợ chuyển mật khẩu sang sudo trên máy chủ từ xa.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
Một chút phép thuật bổ sung ở đây là tùy chọn -S để sudo. Từ trang sudo man:
-S, --stdin Viết lời nhắc đến lỗi tiêu chuẩn và đọc mật khẩu từ đầu vào tiêu chuẩn thay vì sử dụng thiết bị đầu cuối. Mật khẩu phải được theo sau bởi một ký tự dòng mới.
Bây giờ chúng tôi thực sự muốn đầu ra của tar được chuyển thành ssh và điều đó chuyển hướng stdin của ssh sang stdout của tar, loại bỏ bất kỳ cách nào để chuyển mật khẩu vào sudo từ thiết bị đầu cuối tương tác. (Chúng ta có thể sử dụng tính năng ASKPASS của sudo ở đầu xa nhưng đó là một câu chuyện khác.) các subshell vào ssh. Điều này cũng có thêm lợi thế là không để lại biến môi trường chứa mật khẩu của chúng ta lơ lửng trong vỏ tương tác.
Bạn sẽ nhận thấy tôi đã không thực hiện 'đọc' với tùy chọn -p để in lời nhắc. Điều này là do lời nhắc mật khẩu từ sudo được chuyển trở lại stderr của shell tương tác của chúng tôi thông qua ssh. Bạn có thể tự hỏi "làm thế nào sudo thực thi khi nó chạy bên trong ssh bên phải đường ống của chúng tôi?" Khi chúng ta thực thi nhiều lệnh và chuyển đầu ra của một lệnh này sang shell khác, shell cha (vỏ tương tác trong trường hợp này) sẽ thực thi từng lệnh trong chuỗi ngay sau khi thực hiện lệnh trước đó. Khi mỗi lệnh phía sau một đường ống được thực thi, shell cha sẽ đính kèm (chuyển hướng) stdout của phía bên trái sang stdin của phía bên phải. Đầu ra sau đó trở thành đầu vào khi nó đi qua các quy trình.
$ (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"`
Vỏ tương tác của chúng tôi là PID 7168, lớp con của chúng tôi là PID 7969 và quy trình ssh của chúng tôi là PID 7970.
Hạn chế duy nhất là đọc sẽ chấp nhận đầu vào trước khi sudo có thời gian để gửi lại lời nhắc. Trên một kết nối nhanh và máy chủ từ xa nhanh, bạn sẽ không nhận thấy điều này nhưng bạn có thể nếu chậm. Bất kỳ sự chậm trễ sẽ không ảnh hưởng đến khả năng nhập dấu nhắc; nó chỉ có thể xuất hiện sau khi bạn bắt đầu gõ.
Lưu ý Tôi chỉ cần thêm một mục nhập tệp máy chủ cho "remote_host" vào máy cục bộ của mình để dùng thử.