Tôi dự định chuyển các bản sao lưu đầy đủ và gia tăng của các subvolume btrfs của tôi sang một dịch vụ lưu trữ băng. Dịch vụ này hiển thị các điểm cuối FTP và SSH. Nếu tôi được phép thực thi các lệnh tùy ý trên điểm cuối SSH, thì tôi sẽ làm như sau để thực hiện sao lưu gia tăng:
btrfs send -p $LAST_SUBVOLUME $NEXT_SUBVOLUME | compress | encrypt |
ssh -p $PORT $USER@$ENDPOINT "cat > $SUBVOLUME.$YYYYMMDD.btrfs.bz2.gpg"
Tôi, tuy nhiên, không được phép làm điều đó:
$ ssh -p $PORT $USER@$ENDPOINT
Last login: Mon Jan 3 01:23:45 2067 from 123.456.789.123
This account is restricted by rssh.
Allowed commands: scp sftp rsync
If you believe this is in error, please contact your system administrator.
Connection to some.remote.endpoint closed.
Vì vậy, những gì tôi nghĩ phải làm thay vào đó là sử dụng giao thức SCP để chuyển. Tuy nhiên, scp
nhị phân của tôi từ chối chuyển một đường ống có tên:
$ scp -P $PORT <(btrfs send -p $LAST_SUBVOLUME $NEXT_SUBVOLUME | compress | encrypt) \
$USER@$ENDPOINT:$SUBVOLUME.$YYYYMMDD.btrfs.bz2.gpg
/dev/fd/63: not a regular file
Điều trớ trêu là rõ ràng, EDIT (2017-06-03): Đây là một quan sát không chính xác. Theo ghi nhận của Kenster, giao thức SCP không cho phép gửi các tệp có kích thước không xác định.scp
được sử dụng để làm điều đúng một lần . Tôi cho rằng không phải ai cũng nghĩ việc chuyển các ống có tên có thể lành mạnh / hữu ích.
CẬP NHẬT (2017-06-04): Tôi cũng đã thử chuyển dữ liệu bằng giao thức SFTP. Rõ ràng, giao thức FTP cho phép gửi các tệp có kích thước không xác định, bằng chứng là sự hỗ trợ cho dữ liệu đường ống trong các nhị phân ftp
( liên kết ) và ncftpput
( liên kết , phần Mô tả, đoạn cuối). Tôi không tìm thấy sự hỗ trợ nào trong các máy khách SFTP mà tôi đã thử ( sftp
, lftp
), đó có thể là một dấu hiệu cho thấy SFTP (không giống như FTP) không hỗ trợ gửi các tệp có kích thước không xác định (trái với những gì tôi nghĩ, SFTP không chỉ là FTP được điều chỉnh qua SSH ; nó là một giao thức khác nhau).
CẬP NHẬT (2017-06-05): Theo dự thảo ( liên kết ) của giao thức SFTP phiên bản 3 , mỗi gói cấp độ ứng dụng phải chỉ định chiều dài tải trọng trước khi tải trọng ( liên kết , Mục 3). Tuy nhiên, SFTP hỗ trợ tìm kiếm trong tệp bằng văn bản ( liên kết , Mục 6.4) với sự hỗ trợ rõ ràng cho việc ghi vượt quá cuối tệp hiện tại. Do đó, nếu có thể sử dụng một bộ đệm nhỏ ở phía máy khách và gửi một tệp có kích thước không xác định trong các khối nhỏ có kích thước đã biết:
#!/bin/bash
# <Exchange SSH_FXP_INIT requests.>
# <Send an SSH_FXP_OPEN request.>
CHUNK_SIZE=32768
OFFSET=0
IFS=''; while read -r -N $CHUNK_SIZE CHUNK; do
ACTUAL_SIZE=`cat <<<"$CHUNK" | head -c -1 | wc -c`
# <Send an SSH_FXP_WRITE request with payload $CHUNK of size
# $ACTUAL_SIZE at offset $OFFSET.>
OFFSET=$(($OFFSET+$ACTUAL_SIZE))
done < <(command)
# <Send an SSH_FXP_CLOSE request.>
Tuy nhiên, thực hiện giao tiếp thủ công qua vỏ sẽ khá đau đớn. Tôi đang tìm kiếm một khách hàng SFTP trưng bày loại chức năng này.
scp
được sử dụng để xử lý các đường ống. Báo cáo lỗi mà bạn liên kết cho thấy rằng nó được sử dụng để treo vô thời hạn trên các đường ống; bây giờ nó cảnh báo bạn Nghe có vẻ như báo cáo lỗi tốt hơn, không phải là một thay đổi trong hành vi cơ bản.