Apakah saya perlu memeriksa korupsi file setelah scp selesai?

17

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 scpmenanganinya (yaitu menampilkan beberapa pesan kesalahan jika ada file yang tidak ditransfer dengan benar)?

Franck Dernoncourt
sumber
Kecuali Anda mendapatkan status keluar non-nol dari scpdan pesan kesalahan yang menyertainya ke stderr , itu akan menyalin semuanya dengan benar dan lengkap.
roaima
sedikit tl; dr ke posting saya: gunakan rsyncjika Anda bisa. Itu menyalin validasi untuk setiap file setelah transaksi selesai, jadi itu ide yang baik untuk menggunakannya hanya agar sedikit lebih aman.
polemon

Jawaban:

24

scpmemverifikasi 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 scptidak memberi tahu Anda bahwa ada sesuatu yang salah. Harus ada pesan kesalahan, tetapi indikator yang dapat diandalkan adalah bahwa scppengembalian kode nol keluar jika sesuatu yang tidak beres.

Lebih tepatnya, Anda tahu bahwa file itu dikirim dengan benar jika scpmengembalikan 0 (yaitu kode status keberhasilan). Memeriksa bahwa status keluar adalah 0 diperlukan ketika Anda menjalankan perintah apa pun. Jika scpmengembalikan 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, karena scpmenyalin 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).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Saya tidak pernah memiliki masalah dengan korupsi setelah scpsesuatu, tetapi jika Anda khawatir tentang hal itu, Anda selalu dapat berjalan md5sum <filename>di kedua sistem untuk memastikan keduanya sama.

David King
sumber
3

Saran per @ david-king, ini adalah md5solusi berbasis untuk memeriksa integritas file setelah transfer. Jalankan perintah berikut sekali setelah cding untuk /source/folderpada mesin lokal dan sekali setelah cding ke /destination/folderpada 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 , scptidak menjamin integritas file(Silakan periksa jawaban ini oleh @Gilles untuk detailnya). Alternatif untuk memeriksa hash file setelah transfer, Anda dapat menggunakan rsyncuntuk 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

Mani M
sumber
2
Jika scp kembali 0, maka integritas yang dijamin. Selain itu, jika scp tidak mengembalikan 0, maka masalahnya bukan korupsi umum tetapi pemotongan khusus; memverifikasi ukuran file sudah cukup (kecuali sudah ada versi yang lebih lama dari file target: jika scp terputus sangat awal maka versi yang lebih lama masih dapat hadir). Memverifikasi checksum di sini adalah buang-buang waktu.
Gilles 'SO- stop being evil'
Adil. Saya memperbarui jawaban saya.
Mani M
Anda tidak memperbaiki kesalahan mendasar. Memeriksa scpkode pengembalian sudah cukup, dan memeriksa hash tidak berguna.
Gilles 'SO- stop being evil'
1
Bahkan jika scpmengembalikan 0 itu tidak menjamin bahwa sistem file tidak mengacaukan segalanya, jadi memeriksa hash masih berguna untuk memeriksa integritas data sensitif jika seseorang memilih untuk menggunakan scplebih rsync.
Mani M