Có thể khiến SCP bỏ qua các liên kết tượng trưng trong quá trình sao chép không?


80

Tôi cần phải cài đặt lại một trong các máy chủ của chúng ta, và như là một biện pháp phòng ngừa, tôi muốn di chuyển /home, /etc, /opt, và /Servicesđể máy chủ sao lưu.

Tuy nhiên, tôi có một vấn đề: do có nhiều liên kết tượng trưng nên rất nhiều tệp được sao chép nhiều lần.

Có thể scpbỏ qua các liên kết tượng trưng (hoặc thực sự để sao chép liên kết dưới dạng một liên kết không phải là một thư mục hoặc tệp)? Nếu không, có cách nào khác để làm điều đó không?

Câu trả lời:


82

Tôi biết rằng điều đó có thể xảy ra, tôi chỉ cầm nhầm công cụ. Tôi đã làm điều đó với rsync

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/

1
Vậy lệnh này làm gì? Nó có bỏ qua các liên kết tượng trưng hoặc tạo liên kết mới không? - nghe chưa?
Ernestas Stankevičius

3
alà kho lưu trữ (bảo quản mọi thứ), vdài dòng, hđầu ra có thể đọc được của con người, echỉ định dịch vụ bạn muốn sử dụng (trong trường hợp này là dịch vụ ssh). Đọc thêm ở đây
yên tĩnh Kiểm tra

Cảm ơn bạn. Máy chủ cũ đang bị phá hủy. Máy chủ mới cần nội dung. Mất tất cả các liên kết mềm nhưng nhiều liên kết bị hỏng, vì vậy đây sẽ chỉ là một nhiệm vụ bảo trì chậm trên máy chủ mới. Cảm ơn một lần nữa.
jlettvin

1
--safe-links cho phép duy trì các liên kết bên trong thư mục và không sao chép những liên kết trỏ ra bên ngoài nó.
Colin Pitrat

29

Tôi thấy rằng các rsyncphương pháp không làm việc cho tôi, tuy nhiên tôi thấy một sự thay thế mà đã làm việc trên trang web này ( www.docstore.mik.ua/orelly ).

Cụ thể là phần 7.5.3 của "O'Reilly: SSH: The Secure Shell. The Definitive Guide" .

7.5.3. Bản sao đệ quy của thư mục

...

Mặc dù scp có thể sao chép thư mục nhưng nó không nhất thiết phải là phương pháp tốt nhất. Nếu thư mục của bạn chứa liên kết cứng hoặc liên kết mềm, chúng sẽ không bị trùng lặp. Các liên kết được sao chép dưới dạng tệp thuần túy (mục tiêu liên kết) và tệ hơn, các liên kết thư mục hình tròn khiến scp1 lặp lại vô thời hạn. (scp2 phát hiện các liên kết tượng trưng và sao chép các mục tiêu của chúng thay thế.) Các loại tệp đặc biệt khác, chẳng hạn như các đường ống được đặt tên, cũng không được sao chép chính xác. Giải pháp tốt hơn là sử dụng tar, xử lý các tệp đặc biệt một cách chính xác và gửi nó đến điều khiển từ xa máy không được khai báo, thông qua SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -

1
Đây là một gợi ý tốt nếu rsync không được cài đặt trên đầu từ xa hoặc (có sửa đổi nhẹ) nếu bạn đã có một tarball của thư mục nguồn.
Trebor Rude

1
Nó cần một "p" (tar xpf) để bảo toàn quyền tại đích.
Paul Lynch

Một lưu ý, lệnh này phải được chạy từ máy tính nguồn , đẩy các tập tin vào máy tính đích . Đối với trường hợp của tôi (nhiều tệp nhỏ, không được nén), nó hoạt động tốt hơn và nhanh hơn scphoặc rsync.
Gerardo Lima

18

Việc sử dụng tarqua sshcả người gửi và người nhận cũng thực hiện thủ thuật:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -

Tôi đã thêm ở phía nguồn --one-file-systemvà phía đích pđể bảo toàn quyền.
thúc

trang man cho tar nói; --one-file-system = không vượt qua các điểm gắn kết
AnneTheAgile

2

Một giải pháp là sử dụng một ống vỏ. Tôi gặp trường hợp nhận được một số tệp * .gz và các liên kết tượng trưng được tạo bởi một số phần mềm để liên kết đến các tệp * .gz giống nhau có tên ngắn hơn một chút. Nếu tôi chỉ sử dụng scp, thì các liên kết tượng trưng sẽ được sao chép như các tệp thông thường và dẫn đến trùng lặp. Tôi biết rsync có thể bỏ qua các liên kết tượng trưng, ​​nhưng các tệp gz của tôi không được nén với các tùy chọn có thể đồng bộ hóa và đồng bộ hóa rất chậm trong việc sao chép các tệp gz này. Vì vậy, tôi chỉ cần sử dụng tập lệnh sau để sao chép qua các tệp:

find . -type f -exec scp {} target_host:/directory/name/data \;

Tùy chọn -f sẽ chỉ tìm các tệp thông thường và bỏ qua các liên kết tượng trưng. Bạn cần đưa ra lệnh này trên máy chủ nguồn. Hy vọng điều này có thể giúp một số người dùng trong tình huống của tôi. Hãy cho tôi biết nếu tôi bỏ lỡ bất cứ điều gì.


0

Một giải pháp lót có thể được thực thi tại máy khách để sao chép thư mục từ máy chủ bằng lệnh tar + ssh.

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

Lưu ý: mkdir là bắt buộc, nếu thư mục đích từ xa không có thì lệnh sẽ chỉ nén toàn bộ trang chủ của máy chủ từ xa và giải nén nó ra máy khách.

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.