Saya telah mentransfer banyak file dan folder secara rekursif scp
, dengan menggunakan perintah:
scp -rp /source/folder [email protected]:/destination/folder
Setelah transfer selesai, apakah saya perlu memeriksa apakah semua file ditransfer tanpa korupsi, atau apakah scp
menanganinya (yaitu menampilkan beberapa pesan kesalahan jika ada file yang tidak ditransfer dengan benar)?
scp
dan pesan kesalahan yang menyertainya ke stderr , itu akan menyalin semuanya dengan benar dan lengkap.rsync
jika Anda bisa. Itu menyalin validasi untuk setiap file setelah transaksi selesai, jadi itu ide yang baik untuk menggunakannya hanya agar sedikit lebih aman.Jawaban:
scp
memverifikasi bahwa itu menyalin semua data yang dikirim oleh pihak lain. Integritas transfer dijamin oleh protokol saluran kriptografi. Jadi, Anda tidak perlu memverifikasi integritas setelah transfer. Itu akan berlebihan, dan sangat tidak mungkin untuk menangkap kesalahan perangkat keras karena data yang Anda bandingkan mungkin akan dibaca dari cache. Memverifikasi data secara berkala dapat bermanfaat, tetapi memverifikasi segera setelah transfer tidak ada gunanya.Namun Anda perlu memastikan bahwa
scp
tidak memberi tahu Anda bahwa ada sesuatu yang salah. Harus ada pesan kesalahan, tetapi indikator yang dapat diandalkan adalah bahwascp
pengembalian kode nol keluar jika sesuatu yang tidak beres.Lebih tepatnya, Anda tahu bahwa file itu dikirim dengan benar jika
scp
mengembalikan 0 (yaitu kode status keberhasilan). Memeriksa bahwa status keluar adalah 0 diperlukan ketika Anda menjalankan perintah apa pun. Jikascp
mengembalikan status kesalahan, atau jika terbunuh oleh sinyal, atau jika tidak pernah mati karena sistem crash atau kehilangan daya saat sedang berjalan, maka Anda tidak memiliki jaminan. Secara khusus, karenascp
menyalin file secara langsung ke nama akhirnya, ini berarti bahwa Anda dapat berakhir dengan sebagian file jika terjadi sistem crash. Bagian yang disalin dijamin benar tetapi file mungkin terpotong.Untuk keandalan yang lebih baik, gunakan rsync bukan scp. Kecuali diinstruksikan sebaliknya, rsync menulis ke file sementara, dan memindahkannya ke tempatnya setelah selesai. Jadi, jika rsync mengembalikan kode sukses, Anda tahu file tersebut ada dan salinan lengkap yang benar; jika rsync belum mengembalikan kode kesalahan maka tidak ada file yang akan hadir (kecuali ada versi file yang lebih lama, dalam hal ini versi yang lebih lama tidak akan dimodifikasi).
sumber
Saya tidak pernah memiliki masalah dengan korupsi setelah
scp
sesuatu, tetapi jika Anda khawatir tentang hal itu, Anda selalu dapat berjalanmd5sum <filename>
di kedua sistem untuk memastikan keduanya sama.sumber
Saran per @ david-king, ini adalah
md5
solusi berbasis untuk memeriksa integritas file setelah transfer. Jalankan perintah berikut sekali setelahcd
ing untuk/source/folder
pada mesin lokal dan sekali setelahcd
ing ke/destination/folder
pada remote host:find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum
. Hash yang dihasilkan harus identik setelah transfer berhasil.Memperbarui:
Menurut jawaban ini untuk pertanyaan serupa di ServerFault ,(Silakan periksa jawaban ini oleh @Gilles untuk detailnya). Alternatif untuk memeriksa hash file setelah transfer, Anda dapat menggunakanscp
tidak menjamin integritas filersync
untuk mentransfer file dan memeriksa kode pengembaliannya.Pembaruan 2: Berikut ini hanya memeriksa apakah file dan ukurannya masing-masing cocok setelah transfer:
find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum
sumber
scp
kode pengembalian sudah cukup, dan memeriksa hash tidak berguna.scp
mengembalikan 0 itu tidak menjamin bahwa sistem file tidak mengacaukan segalanya, jadi memeriksa hash masih berguna untuk memeriksa integritas data sensitif jika seseorang memilih untuk menggunakanscp
lebihrsync
.