Sebulan yang lalu saya menulis skrip Python untuk memetakan alamat MAC dan IP dari stdin. Dan dua hari yang lalu saya ingat itu dan digunakan untuk menyaring output tcpdump
tetapi salah karena kesalahan ketik. saya mengetik
tcpdump -ne > ./mac_ip.py
dan hasilnya tidak apa-apa. Tetapi output harus "Tidak Diketahui" jika tidak dapat menguraikan input, jadi saya lakukan cat ./mac_ip.py
dan menemukan semua tcpdump
data, bukan program. Kemudian saya menyadari bahwa saya harus menggunakannya
tcpdump -ne | ./mac_ip.py
Apakah ada cara untuk mendapatkan program saya kembali? Bagaimanapun saya dapat menulis program saya lagi, tetapi jika itu terjadi lagi dengan program yang lebih penting saya harus dapat melakukan sesuatu. ATAU adakah cara untuk memberi tahu pengalihan output untuk memeriksa file dan memperingatkan jika file tersebut dapat dieksekusi?
sumber
set -o noglobber
dan bash tidak akan mengarahkan ulang ke file yang ada lagi. Lihat di sini untuk perincian: cyberciti.biz/tips/howto-keep-file-safe-from-overwriting.htmlset -o noclobber
>
ketika Anda maksudkan|
." Jangan lupakan kenyataan.Jawaban:
Sayangnya saya curiga Anda harus menulis ulang. (Jika Anda memiliki cadangan, ini adalah waktu untuk mengeluarkannya. Jika tidak, saya akan sangat menyarankan Anda mengatur rezim cadangan untuk masa depan. Banyak pilihan yang tersedia, tetapi di luar topik untuk jawaban ini.)
Saya menemukan bahwa menempatkan executable di direktori terpisah, dan menambahkan direktori itu ke
PATH
sangat membantu. Dengan cara ini saya tidak perlu referensi executable dengan jalur eksplisit. Direktori program pilihan saya untuk skrip pribadi (pribadi) adalah"$HOME"/bin
dan dapat ditambahkan ke jalur pencarian program denganPATH="$HOME/bin:$PATH"
. Biasanya ini akan ditambahkan ke skrip startup shell.bash_profile
dan / atau.bashrc
.Akhirnya, tidak ada yang menghentikan Anda menghapus izin menulis untuk diri sendiri pada semua program yang dapat dieksekusi:
sumber
/usr/local/bin
adalah lokasi standar untuk executable dan skrip yang dibuat pengguna/usr/local
ditujukan untuk hal-hal khusus host (sebagai lawan direktori yang dibagikan di seluruh host melalui jaringan mount), dan mungkin atau mungkin tidak dapat ditulisi oleh pengguna non-root./use/local/bin
skrip dan program yang dipasang secara lokal yang kemungkinan akan digunakan oleh banyak akun pengguna, dan$HOME/bin
untuk hal-hal pribadi bagi satu pengguna. Ada nilai di keduanya.$HOME/.local/bin
~/.local
karena itu adalah item lain yang dipindahkan dari tempat "tradisional".Untuk mencegah file yang ada ditimpa oleh pengalihan
>
gunakannoclobber
opsi dibash
atau shell seperti POSIX (juga di(t)csh
mana fitur tersebut sebenarnya berasal, meskipun Anda melakukanset noclobber
alih - alihset -o noclobber
/ diset -C
sana). Kemudian, jika Anda perlu memaksa untuk mengganti file, gunakan>|
operator redirection (>!
in(t)csh
).Contoh:
BTW, Anda dapat memeriksa pengaturan saat ini dengan
set -o
:sumber
>|
alih-alih|
tidak jauh lebih kecil kemungkinannya daripada mengetik>
. 2. Mudah dan sangat disarankan untuk membuat cadangan (editor yang layak namanya dapat menyimpan versi terakhir; adacron
, dll.). 3. Setiap bagian kode harus diletakkan di bawah kontrol versi, bahkan skrip kecil. YMMV.Saya sangat menyarankan untuk memiliki skrip penting di bawah git repo , disinkronkan dari jarak jauh ( platform self-host mewah akan melakukan), seperti komentar @ casey.
Dengan cara ini Anda dilindungi dari kesalahan manusia yang buruk seperti mengembalikan file ke kondisi kerja sebelumnya dan menjalankannya kembali.
sumber
Apakah file dapat dipulihkan?
Jawaban singkat: Tidak biasanya.
@Mark Plotnick menunjukkan dalam komentar, Anda dapat memulihkan
.py
file dari.pyc
menggunakan Uncompyle . Ini harus sempurna untuk situasi Anda.Secara umum, ini jauh lebih sulit. Secara teoritis Anda dapat menggunakan alat forensik untuk membatalkan penghapusan file. Mungkin yang termudah yang saya gunakan adalah
testdisk
(alias "PhotoRec"). Kadang-kadang hanya berfungsi dan ini adalah proses yang lambat. Biasanya tidak sepadan, jadi, ya, itu mungkin , tetapi jawaban sebenarnya adalah "tidak".Dapatkah > diubah menjadi tidak menimpa executable?
Tidak. Tidak ada cara standar untuk memberitahu shell untuk tidak mengarahkan hanya untuk file yang ditandai dapat dieksekusi. Ada "noclobber" yang akan mencegah pengalihan ke file yang ada, dieksekusi atau tidak, tetapi lihat komentar saya di bawah ini.
Apa yang harus dilakukan di masa depan?
Ini mungkin terdengar konyol, tetapi untuk mencegah kesalahan di masa depan, Anda mungkin tidak perlu melakukan apa pun. Taruhan saya adalah bahwa Anda sudah mempelajari pelajaran ini.
Saya telah menggunakan dan mengajar Unix untuk waktu yang sangat lama dan sementara orang sering membuat kesalahan ini sekali, mereka jarang mengulanginya. Kenapa tidak? Mungkin karena alasan yang sama seseorang yang berpengalaman dengan pisau tidak memotong diri mereka sendiri: manusia pandai belajar. Akhirnya, melakukan hal yang benar menjadi kebiasaan.
Gunakan editor teks yang membuat cadangan untuk Anda. Misalnya, jika Anda menggunakan
emacs
, versi program Anda sebelumnya disimpan di mac_ip.py ~. Editor lain dapat dikonfigurasikan untuk bekerja dengan cara yang sama (misalnya, "mengatur cadangan" di.nanorc
). Untuk editor yang tidak mendukung backup otomatis, Anda dapat membuat fungsi sederhana di .bashrc Anda:Buatlah mudah bagi Anda untuk membuat salinan. Misalnya, dalam direktori proyek yang sedang Anda kerjakan, Anda mungkin memiliki Makefile dengan target seperti ini:
(Catatan: stackexchange salah menuliskan TAB di atas sebagai 4 spasi.)
Demikian pula, Anda bisa membuat target Makefile yang melakukan
rsync
ke host Unix jarak jauh yang memilikissh
akses. (Gunakanssh-copy-id
sehingga Anda tidak akan diminta kata sandi berulang kali.)Gunakan
git
. Ada banyak tutorial bagus untuk memulai. Cobaman gittutorial
,man gittutorial-2
danman giteveryday
. Menyiapkan repositori git Anda sendiri tidak sulit, tetapi Anda juga dapat membuat repositori jarak jauh tanpa biaya di github.comJika solusi di atas terlalu berat, Anda dapat menyimpan skrip kecil ke gist.github.com . Meskipun dimungkinkan untuk menempel atau mengunggah dari peramban web, saya sarankan menggunakan antarmuka inti baris perintah untuk menjadikannya super mudah.
Saya sangat tidak menyarankan menggunakan "noclobber".
Ya, jika Anda memilih, Anda bisa melakukannya
set -o noclobber
sehingga Anda akan mendapatkan pesan kesalahan setiap kali Anda mencoba untuk menimpa file yang ada. Ini adalah ide yang buruk, menurut saya. *Itu membuat shell bekerja dengan cara yang tidak standar tanpa indikasi yang terlihat apakah itu diaktifkan. Anda harus menggunakan sintaks yang berbeda untuk melakukan hal-hal normal. Yang terburuk, jika Anda terbiasa dengan noclobber, maka suatu hari nanti Anda akan menggunakan mesin Unix lain tanpa noclobber dan kecelakaan semacam ini mungkin terjadi lagi.
Seperti yang mungkin Anda ketahui, cangkang Unix dirancang untuk menjadi alat yang tajam bagi para ahli. Ini cepat digunakan dan tidak akan menghalangi Anda - dan itu akan memotong Anda jika Anda lupa ujung mana yang runcing. Tapi, semakin Anda menggunakannya, semakin saya pikir Anda akan menghargai bahwa itu bisa menjadi hal yang baik.
* Catatan Kaki: mungkin mengambil pendapat saya dengan sebutir garam. Saya juga tipe orang yang menganggap roda pelatihan sepeda adalah ide yang buruk.
sumber
Anda mungkin dapat memulihkan data setelah pertama kali terjadi jika Anda baru saja melihat atau mengedit skrip dan masih dalam buffer memori. Kalau tidak, Anda kurang beruntung.
Jika Anda memilih
tee
untuk menulis ke file (dan jugaSTDOUT
) alih-alih>
(atautee -a
bukannya>>
), maka Anda dapat dengan mudah menggantitee
dengan alias, fungsi, atau symlink ke skrip yang memperingatkan pengguna jika file yang akan mereka tulis untuk dapat dieksekusi.Berikut ini sama sekali tidak ideal dan dapat ditingkatkan pada banyak hal , tetapi ini adalah titik awal, sama seperti contoh bagaimana ini mungkin:
wee.sh:
... kalau begitu
echo 'alias tee="/path/to/wee.sh"' >> ~/.bashrc
atau sesuatu yang serupa.Sisi baiknya, setidaknya Anda akan mendapatkan lebih banyak latihan dan versi kedua skrip Python Anda mungkin akan jauh lebih baik daripada yang pertama!
sumber
Anda tidak menentukan apakah Anda bekerja pada PC atau server. Jika file Anda kebetulan disimpan di server file khusus, maka sering ada cadangan otomatis ("snapshots") disimpan oleh perangkat keras server file (OS pada).
Di bawah Linux
Direktori snapshot virtual dan tersembunyi ada di setiap direktori di sistem file Anda.
Mencoba:
Jika direktori itu ada, maka Anda mungkin beruntung. Anda akan melihat serangkaian direktori yang menyimpan cadangan yang disimpan secara otomatis pada waktu tertentu. Nama-nama menunjukkan waktu relatif di masa lalu di mana foto itu disimpan. Sebagai contoh:
Pergilah ke direktori titik waktu apa pun yang cukup lama (sebelum kesalahan penimpa file). Di dalam direktori timepoint, Anda akan melihat status
../..
direktori (dan semua subdirektori) pada saat itu di masa lalu.Catatan:
ls -a
tidak akan menampilkan.snapshot
direktori; Anda harus menyebutkannya dengan jelas. Ini dimasukkan secara virtual oleh server file. Itu tidak ada sebagai direktori nyata di sistem file Anda.Di bawah Windows
Direktori snapshot tersembunyi dapat dinamai ~ snapshot dan hanya ada pada level root dari drive yang diberikan.
Nasihat
Snapshots adalah jaring pengaman yang berfungsi sebagian besar waktu, tetapi tidak setiap saat. Saya setuju dengan rekomendasi lain untuk menggunakan sistem kontrol versi (seperti
git
) bahkan untuk file sepele.sumber
Telah dikatakan sebelumnya, dan saya akan mengatakannya lagi. Gunakan sistem kontrol revisi.
Cadangan adalah untuk memulihkan kegagalan perangkat keras. Kontrol revisi adalah untuk situasi seperti milik Anda (dan memiliki banyak kegunaan lain). Alat kontrol revisi memungkinkan Anda menyimpan riwayat file, dan kembali ke titik mana pun dalam riwayat itu.
Contoh alat kontrol revisi termasuk subversi (SVN) (agak lama sekarang, tapi masih bagus), lincah (hg), dan git (git) (sulit digunakan). svn baik untuk dokumen kantor, dan um-mergables lainnya, git dan hg telah melampaui itu untuk sebagian besar peran lainnya. hg dan git memungkinkan Anda bekerja secara off-line, dan untuk melakukan sinkronisasi dengan server jarak jauh, untuk distribusi dan cadangan.
Baca tentang kontrol revisi, kemudian bagikan kontrol revisi, dan kemudian coba.
sumber