Czy muszę sprawdzić, czy plik nie jest uszkodzony po zakończeniu scp?

17

Za scppomocą polecenia: rekursywnie przesłałem wiele plików i folderów :

scp -rp /source/folder [email protected]:/destination/folder

Czy po zakończeniu przesyłania muszę sprawdzić, czy wszystkie pliki zostały przesłane bez żadnego uszkodzenia, czy się tym scpzajmuje (tzn. Wyświetla komunikat o błędzie, jeśli któryś z plików nie został poprawnie przesłany)?

Franck Dernoncourt
źródło
O ile nie otrzymasz niezerowego statusu wyjścia scpi towarzyszącego mu komunikatu o błędzie do stderr , skopiuje wszystko poprawnie i całkowicie.
roaima
trochę tl; dr do mojego postu: użyj, rsyncjeśli możesz. Kopiuje sprawdzanie poprawności dla każdego pliku po zakończeniu transakcji, więc warto go użyć, aby być trochę bezpieczniejszym.
polemon

Odpowiedzi:

24

scpsprawdza, czy skopiował wszystkie dane wysłane przez drugą stronę. Integralność transferu jest gwarantowana przez protokół kanału kryptograficznego. Nie musisz więc weryfikować integralności po przeniesieniu. Byłoby to zbędne i bardzo mało prawdopodobne jest wykrycie jakiegokolwiek błędu sprzętowego, ponieważ porównywane dane prawdopodobnie zostałyby odczytane z pamięci podręcznej. Okresowa weryfikacja danych może być przydatna, ale weryfikacja natychmiast po przesłaniu jest bezcelowa.

Musisz jednak upewnić się, że scpnie oznacza to, że coś poszło nie tak. Powinien pojawić się komunikat o błędzie, ale wiarygodnym wskaźnikiem jest to, że scpzwraca niezerowy kod wyjścia, jeśli coś poszło nie tak.

Mówiąc dokładniej, wiesz, że plik został poprawnie przesłany, jeśli scpzwraca 0 (tj. Kod statusu powodzenia). Sprawdzenie, czy kod wyjścia ma wartość 0, jest konieczne po uruchomieniu dowolnego polecenia. Jeśli scpzwróci status błędu lub zostanie zabity przez sygnał, lub jeśli nigdy nie umrze, ponieważ system ulega awarii lub traci moc podczas działania, nie masz żadnych gwarancji. W szczególności, ponieważ scpplik jest kopiowany bezpośrednio do jego ostatecznej nazwy, oznacza to, że w przypadku awarii systemu możesz otrzymać plik częściowy. Na pewno skopiowana część jest poprawna, ale plik może zostać obcięty.

Aby uzyskać większą niezawodność, użyj rsync zamiast scp. O ile nie podano inaczej, rsync zapisuje plik tymczasowy i przenosi go na miejsce po zakończeniu. Zatem, jeśli rsync zwróci kod sukcesu, wiesz, że plik jest obecny i poprawna, kompletna kopia; jeśli rsync nie zwrócił kodu błędu, plik nie będzie obecny (chyba że istnieje starsza wersja pliku, w którym to przypadku starsza wersja nie zostanie zmodyfikowana).

Gilles „SO- przestań być zły”
źródło
3

Nigdy nie miałem problemu z korupcją po scpczymś, ale jeśli martwisz się tym, zawsze możesz uruchomić md5sum <filename>oba systemy, aby upewnić się, że są takie same.

David King
źródło
3

Według sugestii Davida-króla jest to md5oparte na rozwiązaniu rozwiązanie do sprawdzania integralności plików po przesłaniu. Uruchom następującą komendę raz po cdING /source/folderna lokalnym komputerze i raz po cding aby /destination/folderna zdalnym serwerem find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum. Wynikowy skrót powinien być identyczny po udanym przeniesieniu.

Aktualizacja: Zgodnie z tą odpowiedzią na podobne pytanie dotyczące ServerFault , scpnie gwarantuje integralność pliku(Proszę sprawdzić tę odpowiedź przez @Gilles, aby uzyskać szczegółowe informacje). Alternatywnie do sprawdzania skrótów plików po przesłaniu, możesz użyć rsyncdo przesłania plików i sprawdzenia kodu powrotu.

Aktualizacja 2: Poniższe sprawdza tylko, czy pliki i ich odpowiednie rozmiary są zgodne po przesłaniu:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

Mani M.
źródło
2
Jeśli scp zwraca 0, wówczas integralność jest gwarantowana. Ponadto, jeśli scp nie zwraca 0, problem nie polega na ogólnym uszkodzeniu, ale konkretnie na obcięciu; wystarczające jest sprawdzenie rozmiaru pliku (chyba że istniała już starsza wersja pliku docelowego: jeśli scp został przerwany bardzo wcześnie, starsza wersja mogłaby być nadal obecna). Weryfikacja sum kontrolnych tutaj jest stratą czasu.
Gilles „SO- przestań być zły”
Targi. Zaktualizowałem swoją odpowiedź.
Mani M
Nie naprawiłeś podstawowej wady. Sprawdzanie scpkodu powrotu jest wystarczające, a sprawdzanie skrótów jest bezużyteczne.
Gilles „SO- przestań być zły”
1
Nawet jeśli scpzwraca 0 nie gwarantuje, że system plików nie namieszałem, więc sprawdzanie skrótów jest nadal przydatny do sprawdzania integralności danych wrażliwych jeśli ktoś zdecydować się na stosowanie scpprzez rsync.
Mani M