Làm thế nào để làm cho scp sao chép các tập tin ẩn?


63

Tôi thường sử dụng SCP để sao chép các tệp xung quanh - đặc biệt là các tệp liên quan đến web. Vấn đề là bất cứ khi nào tôi làm điều này, tôi không thể nhận lệnh của mình để sao chép các tệp bị ẩn (ví dụ: .htaccess).

Tôi thường gọi điều này:

scp -rp src/ user@server:dest/

Điều này không sao chép các tập tin ẩn. Tôi không muốn phải thực hiện điều này một lần nữa (bằng cách làm một cái gì đó như scp -rp src/.* ...- và dù sao nó cũng có ý nghĩa .và kỳ lạ ...

Tôi không thấy bất cứ điều gì trong scptrang hướng dẫn về "bao gồm các tập tin ẩn".

Làm thế nào tôi có thể thực hiện điều này?


Tôi giả sử đó src/.*cũng là bản sao src/..(thư mục cha mẹ), phải không?
Ken Sharp

Câu trả lời:


67

Điều đó hoàn toàn phù hợp với các tập tin ẩn. / Ở cuối nguồn cho biết "mọi tệp trong thư mục này". Tuy nhiên, thử nghiệm và nghiên cứu mang bạn ra. Đây là hành vi ngu ngốc.

" Câu trả lời " là nối một dấu chấm vào cuối nguồn:

scp -rp src/. user@server:dest/

Các thực câu trả lời là sử dụng rsync.


Thủ thuật hay tôi chưa nhận ra điều này.
cstamas

21
rsync -avz -e ssh - phát hành src / user @ server: Dest /
MikeyB

2
Tôi không thể tái tạo hành vi đó. scp -r source/ host:source2sao chép các tập tin dấu chấm. Hoạt động trong OpenSSH 5.1 từ năm 2007
Mikel

3
Lưu ý rằng việc thêm một .ở cuối không còn hoạt động (2019) do vấn đề bảo mật. Điều này được giải thích ở đây: superuser.com/questions/1403473/scp-error-unazed-filename
Stéphane

25

Bạn có thể thử rsync. Nó phù hợp hơn cho công việc này:

rsync -av src / user @ server: mệnh đề /

(Và trang hướng dẫn của nó đáng để đọc.)


2
Tôi luôn sử dụng tùy chọn --prowards cho rsync, tôi không thể sống mà không có nó = D
Hofa

1
@Hofa Tôi thường sử dụng -P vì nó ngắn hơn, đã bao gồm - phát triển và cũng bao gồm - một phần có thể có ý nghĩa nếu tôi quan tâm đến tiến trình của nó ;-)
cstamas

9

Đừng đặt dấu gạch chéo sau thư mục nguồn. Mã của bạn sẽ trông như thế này:

scp -rp src user@server:dest/

Điều này sẽ tạo một thư mục 'src' dưới 'Dest' trên máy từ xa, với tất cả các tệp ẩn đi kèm. Nó có thể không chính xác những gì bạn muốn, nhưng nó sẽ sao chép các tập tin ẩn trong src.


3

Sau đây sẽ giải quyết vấn đề, điều này đã được kiểm tra đầy đủ trên môi trường tích hợp liên tục của chúng tôi

scp -rp src/. user@server:dest/
example scp -rp /usr/src/code/. content001@172.11.11.11:/usr/dest/code/

Hy vọng nó giúp


Sau khi cập nhật scp gần đây, bây giờ kết quả scp: error: unexpected filename: . . Hãy chắc chắn kiểm tra xem nó có hoạt động với bản phân phối của bạn không, đồng nghiệp của Google :)
Moritz Friedrich

1

Để chỉ sao chép các tập tin ẩn, sử dụng lệnh này

scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/

Trò chơi thực tế là /.[!.]*thẻ đề cập đến các tệp bắt đầu bằng .(ẩn)


0

Không có giải pháp scp nào ở trên làm việc cho tôi. Tuy nhiên, tôi đã thấy rằng những điều sau đây hoạt động trên thư mục cygwin: scp -r / * host: thư mục '*' khớp với tất cả các tệp có thể nhìn thấy và bỏ qua phần ẩn.


0

Nếu đăng nhập mật khẩu bị vô hiệu hóa trên máy từ xa và cách duy nhất để đăng nhập là thông qua khóa chung, thì bạn có thể sử dụng cách này:

$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress user1@remote.host:/remote/source/directory/ /local/destination/directory/

Nó sao chép các tập tin ẩn quá.

Ngoài ra, xin lưu ý rằng "user1" phải có quyền đọc các tệp đó, ví dụ: bạn không thể sao chép các thư mục ssh của người dùng khác bằng phương pháp này.


0

scphỗ trợ các biểu thức thông thường, điều này sẽ thực hiện thủ thuật cho bạn:

scp -rp src/(*|.*) user@server:dest/


0

Kiểm soát sửa đổi phân tán xử lý các tập tin ẩn

Bởi vì các bản tin CVE-2.018-20.685 dễ bị tổn thương, các /.thủ thuật không còn có thể được sử dụng với scp. Tuy nhiên, kiểm soát sửa đổi phân tán như githoặc Hg Mecurial sẽ xử lý các tệp ẩn như bất kỳ tệp nào khác. Dưới đây là các lệnh cho Hg Mercurial yêu thích của tôi :

server:$ sudo apt install mercurial
client:$ sudo apt install mercurial
client:$ hg init src
client:$ cd src/
client:$ hg addr
client:$ hg com -m "first commit"
client:$ cd
client:$ hg clone src ssh://user@server/dest/

Những thay đổi sau đó sẽ cần phải được cam kết một lần nữa client:$ hg com -m "commit message"và sau đó được đẩy bằng cách sử dụng client:$ hg pushlệnh. Tìm hiểu thêm về việc đẩy các thay đổi từ bảng cheat Hg Mercurial này .

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.