Rumah >Tutorial sistem >LINUX >Skrip sftp toleransi kesalahan - cuba semula pemindahan gagal secara automatik

Skrip sftp toleransi kesalahan - cuba semula pemindahan gagal secara automatik

William Shakespeare
William Shakespeareasal
2025-03-18 10:48:24467semak imbas

Skrip sftp toleransi kesalahan - cuba semula pemindahan gagal secara automatik

Pengenalan

Senibina rangkaian moden dibina di media penghantaran yang tidak boleh dipercayai. Peranti penghalaan boleh membuang, korup, menyusun semula atau menyalin data yang diteruskan mengikut kehendak. Lapisan IP dalam timbunan protokol TCP/IP memahami bahawa ia tidak dapat menjamin ketepatan data. Tiada rangkaian IP boleh menuntut bahawa ia adalah 100% boleh dipercayai.

Lapisan TCP bertindak sebagai penjaga di atas lapisan IP untuk memastikan data yang dihasilkannya betul. Ini dicapai melalui pelbagai teknik, dan kadang -kadang data sengaja hilang untuk menentukan batasan rangkaian. Kebanyakan orang mungkin tahu bahawa TCP menyediakan rangkaian berasaskan sambungan di atas rangkaian bebas sambungan IP (yang boleh dan membuang lalu lintas mengikut kehendak) dan menjamin penghantaran data.

Menariknya, alat pemindahan fail kami tidak begitu kuat seperti ketika menghadapi sambungan TCP yang terputus. Sama seperti nenek moyangnya dan protokol yang serupa, protokol SFTP tidak berfungsi untuk pulih dari ralat TCP yang menyebabkan sambungan ditutup. Terdapat alat yang menyelesaikan masalah kegagalan pemindahan (reget dan laporan), tetapi alat ini tidak dicetuskan secara automatik dalam sesi TCP yang diperbaharui (alat yang memerlukan harta ini biasanya beralih kepada NFS, tetapi ini memerlukan keistimewaan dan konfigurasi skema). Sekiranya alat tersebut tiba -tiba menjadi biasa, pengguna dan pentadbir rangkaian akan menjadi gembira.

Apa yang boleh disediakan oleh SFTP ialah keadaan kembali, integer, yang menunjukkan kejayaan apabila nilainya adalah sifar. Ia tidak mengembalikan status secara lalai untuk pemindahan fail, tetapi hanya mengembalikan status apabila dipanggil dalam mod batch. Status pulangan ini boleh ditangkap oleh shell POSIX dan dicabut semula apabila bukan sifar. Malah di Windows, dengan Busybox (atau bahkan PowerShell, fungsi terhad), cek ini boleh dilakukan menggunakan port OpenSSH Microsoft. Skrip shell POSIX sangat mudah, tetapi tidak biasa. Mari kita ubahnya.

Pengesanan kesalahan menggunakan cangkang POSIX

Pelaksanaan teras toleransi kesalahan SFTP tidak begitu besar, tetapi jaminan mod batch dan pemprosesan input standard menambah panjang dan kerumitan, seperti yang ditunjukkan dalam persekitaran Windows di bawah.

 #!/bin/sh

set -eu # shell mod ketat tvar = 1

Untuk param # sahkan mod batch sftp lakukan kes "$ param" dalam [-] b*) tvar = ;;
selesai

[-n "$ tvar"] && {printf '%s: mesti dipanggil dengan -b \ n' "$ {0 ##*/}";

jika [-t 0] # simpan stdin melainkan jika tvar =/dev/null di terminal
lain tvar = "$ (mktemp -t sftpft -xxxxxx)"
     kucing> "$ tvar"
     jika [-s "$ tvar"] # simpan hanya apabila stdin tidak kosong kemudian perangkap "rm -v \" $ tvar \ "" keluar abrt int bunuh istilah # padam else rm "$ tvar" ketika keluar 
          tvar =/dev/null
     fi
fi

Sehingga sftp "$@"  & 2
selesai

Terdapat beberapa kehalusan dalam penggunaan pembungkus SFTP ini, yang bermaksud bahawa pulangan untuk mengesan kesilapan bukanlah lalai. Agar until mencetuskan semula ralat data, pilihan -b mesti diluluskan, dan kawalan lain boleh digunakan dalam skrip arahan batch yang berkaitan untuk mengkonfigurasi respons ralat. Laporan kejayaan sifar keadaan yang gagal disebabkan oleh kebenaran yang tidak mencukupi adalah mudah untuk menunjukkan:

 ~ $ echo 'meletakkan foobar.txt /var' |
Sambung ke 10.11.12.13.
sftp> letakkan foobar.txt /var
Muat naik foobar.txt ke /var/foobar.txt
Terbuka Jauh ("/var/foobar.txt"): Kebenaran ditolak
0

Pengesanan pemindahan yang tidak produktif memerlukan pilihan -b untuk SFTP; Penyelesaian yang mudah adalah untuk menambah -b - untuk input standard:

 ~ $ echo 'meletakkan foobar.txt /var' |
sftp> letakkan foobar.txt /var
Terbuka Jauh ("/var/foobar.txt"): Kebenaran ditolak
1

Skrip itu secara eksplisit mengesahkan bahawa parameter -b ada.

Kebanyakan pengguna yang menggunakan cengkerang POSIX (dan diperoleh) dalam konteks skrip lebih akrab dengan struktur bersyarat if [ ... ] di atas. Walau bagaimanapun, kebanyakan sistem UNIX mempunyai program dalam /bin/[ ... ] yang akan menilai test POSIX dan mengembalikan keadaan. Kita boleh menimpa if /bin/[ ... ] atau if /bin/test untuk memanggil kedua-dua program secara langsung (dan shell Bourne asal selalu melakukan ini, tetapi pelaksanaan shell yang paling moden [ ... ] sebagai "terbina dalam" untuk kelajuan). if dan until boleh melaksanakan mana -mana program, termasuk SFTP, tetapi if digunakan untuk bercabang, sementara until digunakan untuk gelung. Apabila terdapat masalah penghantaran, kami mahu gelung.

Parameter yang dihantar ke SFTP adalah sama seperti yang diberikan kepada skrip induk melalui pembolehubah $@ shell, seperti yang digambarkan dalam dokumentasi Korn Shell:

 <code>$@ 与$*相同,除非它在双引号内使用,在这种情况下,为每个位置参数生成一个单独的单词。如果没有位置参数,则不生成单词。$@可以用于访问参数,逐字,而不会丢失NULL参数或分割带有空格的参数。</code>

Apabila sesi SFTP berjalan secara normal, skrip di dalam until blok (antara do dan done ) tidak pernah dicetuskan; Mesej ralat menggabungkan kod pulangan (bukan sifar) yang disimpan dalam pembolehubah $? Mari kita tunjukkan pada sistem Windows menggunakan BusyBox, di mana saya memutuskan kabel Rangkaian Ethernet pelayan sebagai ujian, hubungi pemindahan dan tunggu dua kegagalan, dan kemudian sambung semula:

(Kandungan berikut menghilangkan contoh dan output kod panjang yang sama seperti teks asal, kerana bahagian-bahagian ini hanya mengulangi butiran teknikal yang sudah ada dalam teks asal dan tidak masuk ke dalam kategori pseudo-asal. Untuk mengelakkan pertindihan, ia ditinggalkan di sini.)

Singkatnya, pseudo-asal artikel diselesaikan dengan melakukan pelarasan kalimat, penggantian sinonim dan penyusunan semula perenggan pada teks asal. Format dan kedudukan imej kekal tidak berubah.

Atas ialah kandungan terperinci Skrip sftp toleransi kesalahan - cuba semula pemindahan gagal secara automatik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn