Tôi muốn sử dụng scp
để tải lên các tập tin nhưng đôi khi thư mục đích có thể không tồn tại.
Có thể tạo thư mục tự động? Nếu vậy thì thế nào? Nếu không, tôi có thể thử cách nào khác?
Tôi muốn sử dụng scp
để tải lên các tập tin nhưng đôi khi thư mục đích có thể không tồn tại.
Có thể tạo thư mục tự động? Nếu vậy thì thế nào? Nếu không, tôi có thể thử cách nào khác?
Câu trả lời:
Đây là một trong nhiều điều rsync
có thể làm.
Nếu bạn đang sử dụng phiên bản rsync
phát hành trong vài năm qua, ¹ cú pháp lệnh cơ bản của nó tương tự như scp
: ²
$ rsync -r local-dir remote-machine:path
Điều đó sẽ sao chép local-source
và nội dung của nó $HOME/path/local-dir
vào máy từ xa, tạo ra bất kỳ thư mục nào được yêu cầu.³
rsync
có một số hạn chế ở đây có thể ảnh hưởng đến việc điều này sẽ hoạt động trong tình huống cụ thể của bạn. Nó sẽ không tạo ra nhiều cấp độ của các thư mục từ xa bị mất, ví dụ; nó sẽ chỉ tạo tối đa một cấp độ thiếu trên điều khiển từ xa. Bạn có thể dễ dàng khắc phục điều này bằng cách đặt trước rsync
lệnh bằng một cái gì đó như thế này:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Điều đó sẽ tạo ra $HOME/foo/bar/qux
cây nếu nó không tồn tại. Nó sẽ không phàn nàn hay làm bất cứ điều gì khác xấu nếu nó không tồn tại.
rsync
đôi khi có những hành vi đáng ngạc nhiên khác. Về cơ bản, bạn đang yêu cầu nó tìm ra ý nghĩa của bạn để sao chép và dự đoán của nó có thể không phù hợp với giả định của bạn. Hãy thử nó và xem. Nếu nó không hoạt động như bạn mong đợi và bạn không thể hiểu tại sao, hãy đăng thêm chi tiết về các thiết lập thư mục từ xa và cục bộ của bạn và đưa ra lệnh bạn đã thử.
Chú thích :
Trước rsync
2.6.0 (ngày 1 tháng 1 năm 2004), nó yêu cầu -e ssh
cờ phải làm cho nó hoạt động giống như scp
vì nó được mặc định là giao thức RSH lỗi thời .
scp
và rsync
chia sẻ một số cờ, nhưng chỉ có một chút chồng chéo.
Khi sử dụng SSH
làm giao thức truyền, rsync
sử dụng các giá trị mặc định tương tự. Vì vậy, giống như scp
, nó sẽ cho rằng có một người dùng có cùng tên với người dùng cục bộ của bạn trên máy từ xa theo mặc định.
rsync
trang tài liệu 's, không tìm thấy làm thế nào để sử dụng ssh-key để đăng nhập. Tôi không muốn sử dụng tên người dùng / mật khẩu để đăng nhập
rsync
. Và vâng, bạn cũng cần rsync
ở phía xa, giống như với scp
. Đối với các khóa SSH, rsync
thực tế là sử dụng SSH bên dưới với mặc định -e ssh
, vì vậy nếu bạn có các khóa được thiết lập để sử dụng scp
, chúng cũng sẽ hoạt động rsync
.
-r
không có sự khác biệt. Kịch bản bạn mô tả chỉ hoạt động nếu bạn đang sao chép một thư mục và nếu thư mục mẹ đích tồn tại. Vì vậy, rsync foo/ u@h:~/
sẽ tạo thư mục đích foo
nhưng rsync foo/ u@h:~/bar/
sẽ không tạo thư mục đích bar
. Cái đó sẽ tạo ra bar/foo
chỉ khi bar/
tồn tại. Trong mọi trường hợp, OP đang tải lên các tệp và ngay cả trong trường hợp điều này hoạt động, nó chỉ hoạt động cho toàn bộ thư mục.
rsync file host:/foo/file
thất bại nếu foo/
không tồn tại nhưng rsync file host:/foo/
tạo thư mục và địa điểm file
trong đó. Lạ thật. Dù sao, bạn hoàn toàn đúng và kịch bản cơ bản hoạt động, tôi sẽ rút lại downvote của mình.
Nếu bạn đang sao chép một nhóm các tập tin, không thực sự. Nếu bạn đang sao chép một thư mục và tất cả các nội dung bên dưới nó, có. Đưa ra lệnh này:
$ scp -pr /source/directory user@host:the/target/directory
Nếu directory
không tồn tại ~/the/target
trên host
, nó sẽ được tạo. Tuy nhiên, ~the/target
nếu không tồn tại, bạn có thể sẽ gặp vấn đề - Tôi không nhớ kết quả chính xác của trường hợp này, nhưng hãy chuẩn bị cho dự định scp
thất bại.
scp: /home/madmike/test_bin: No such file or directory
Ngay khi thư mục đích bị thiếu, điều này sẽ phá vỡ thiết lập của tôi. Sử dụng cygwin trên máy khách và RHEL 6.9 trên máy chủ. Thiết lập của bạn là gì?
Theo tôi biết, scp
bản thân nó không thể làm điều đó, không. Tuy nhiên, bạn chỉ có thể ssh
đến máy đích, tạo thư mục và sau đó sao chép. Cái gì đó như:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
Lưu ý rằng nếu bạn đang sao chép toàn bộ thư mục, thì không cần thiết ở trên. Ví dụ: để sao chép thư ~/foo
mục vào máy chủ từ xa, bạn có thể sử dụng -r
cờ (đệ quy):
scp ~/foo/ user@host:~/
Điều đó sẽ tạo thư mục đích ~/foo
trên máy chủ từ xa. Tuy nhiên, nó không thể tạo thư mục cha. scp ~/foo user@host:~/bar/foo
sẽ thất bại trừ khi thư mục đích bar
tồn tại. Trong mọi trường hợp, -r
cờ sẽ không giúp tạo thư mục đích nếu bạn đang sao chép các tệp riêng lẻ.
Vâng, bạn có thể. Theo trang người đàn ông của scp:
người đàn ông
.....
-r Sao chép toàn bộ thư mục. Lưu ý rằng scp tuân theo các liên kết bolog sym gặp trong cây ngang.
....
scp -r foo/ u@h:~/bar
sẽ tạo bar/foo
nếu điều khiển từ xa bar/
tồn tại nhưng sẽ thất bại nếu không.
foo
nội dung vào thư mục mới /bar
. Tất nhiên tên đã được thay đổi có thể không phải là những gì OP muốn. Nếu điều bạn muốn là một cấu trúc cây mới được tạo trong máy đích thì scp
sẽ không thực hiện được công việc, nếu điều bạn muốn là sao chép cấu trúc cây từ một nhánh nhất định trong cây thì cấu trúc đó được tạo.
scp -r file host:~/bar/
sẽ không tạo ra bar/
.
Tôi sử dụng chức năng sau đây trước khi chuyển btrfs
snapshot qua ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Chỉ cần gọi hàm trong tập lệnh của bạn với:
check_remote_dir /my/remote/path
Bạn có thể xâu chuỗi lệnh bằng lệnh mkdir và sau đó tham chiếu đến thư mục bạn đã tạo:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
Khi bị giới hạn chỉ scp hoặc sftp không có sẵn ssh (bởi rssh), có thể tạo thư mục bằng cách sao chép cây thư mục trống bằng rsync và sau đó sao chép tệp.
Đó là cách tôi đặt khóa ssh công khai cho máy chủ từ xa khi ssh-copy-id không hoạt động và thư mục .ssh không tồn tại:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
Có thể kết hợp các lệnh này thành một rsync thêm một bộ lọc bao gồm ở giữa, nếu tên tệp đích là giống nhau.