Scp có thể tạo một thư mục nếu nó không tồn tại?


88

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:


71

Đây là một trong nhiều điều rsynccó thể làm.

Nếu bạn đang sử dụng phiên bản rsyncphá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-sourcevà nội dung của nó $HOME/path/local-dirvào máy từ xa, tạo ra bất kỳ thư mục nào được yêu cầu.³

rsynccó 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 rsynclệ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/quxcâ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 :

  1. Trước rsync2.6.0 (ngày 1 tháng 1 năm 2004), nó yêu cầu -e sshcờ phải làm cho nó hoạt động giống như scpvì nó được mặc định là giao thức RSH lỗi thời .

  2. scprsyncchia sẻ một số cờ, nhưng chỉ có một chút chồng chéo.

  3. Khi sử dụng SSHlàm giao thức truyền, rsyncsử 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.


Tôi đang sử dụng Mac OSX, tôi có cần cài đặt rsync ở cả cục bộ và từ xa không?
AGamePlayer 30/03/2015

tìm kiếm rsynctrang 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
AGamePlayer 30/03/2015

@AwQiruiGuo: Mac OS X giao hàng với 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, rsyncthự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.
Warren Young

1
@WarrenYoung -rkhô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 foonhưng rsync foo/ u@h:~/bar/sẽ không tạo thư mục đích bar. Cái đó sẽ tạo ra bar/foochỉ 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.
terdon

1
Vâng, tôi cũng đã chơi với nó. Có vẻ như chỉ định một tên tập tin cũng làm cho nó thất bại. Vì vậy, rsync file host:/foo/filethấ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 filetrong đó. 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.
terdon

35

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 directorykhông tồn tại ~/the/targettrên host, nó sẽ được tạo. Tuy nhiên, ~the/targetnế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 scpthất bại.


1
scp: /home/madmike/test_bin: No such file or directoryNgay 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ì?
MadMike

16

Theo tôi biết, scpbả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ư ~/foomục vào máy chủ từ xa, bạn có thể sử dụng -rcờ (đệ quy):

scp ~/foo/ user@host:~/

Điều đó sẽ tạo thư mục đích ~/footrên máy chủ từ xa. Tuy nhiên, nó không thể tạo thư mục cha. scp ~/foo user@host:~/bar/foosẽ thất bại trừ khi thư mục đích bartồn tại. Trong mọi trường hợp, -rcờ 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ẻ.


3

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.

....


7
Điều đó sẽ không tạo thư mục mẹ đích. Nó có thể sao chép một thư mục đến một vị trí hiện có. Vì vậy, scp -r foo/ u@h:~/barsẽ tạo bar/foonếu điều khiển từ xa bar/tồn tại nhưng sẽ thất bại nếu không.
terdon

1
Nó sẽ không thất bại. Nó sẽ sao chép foonộ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ì scpsẽ 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.
YoMismo 30/03/2015

6
Có, nhưng điều này chỉ hoạt động nếu bạn đang sao chép thư mục , không phải tập tin. scp -r file host:~/bar/sẽ không tạo ra bar/.
terdon

3

Tôi sử dụng chức năng sau đây trước khi chuyển btrfssnapshot 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


Tôi làm khá nhiều thứ tương tự, nhưng tôi phải nhập mật khẩu thủ công (vì lý do bảo mật), vì vậy cuối cùng tôi đã gõ nó ít nhất hai lần ...
Stefan Reich

0

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/

3
(1) Câu hỏi nói rằng tự động có thể nâng cấp. Điều này dường như không tự động. (2) Đây dường như chỉ là một biến thể tầm thường trong câu trả lời của terdon .
G-Man

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.