Vor einem Monat habe ich ein Python-Skript geschrieben, um MAC- und IP-Adressen von stdin abzubilden. Und vor zwei Tagen habe ich mich daran erinnert und die Ausgabe von gefiltert, tcpdump
aber es ist wegen eines Tippfehlers schiefgegangen. Ich tippte
tcpdump -ne > ./mac_ip.py
und die Ausgabe ist nichts. Aber die Ausgabe sollte "Unbekannt" sein, wenn die Eingabe nicht analysiert werden kann, also habe ich cat ./mac_ip.py
alle tcpdump
Daten anstelle des Programms gefunden. Dann wurde mir klar, dass ich verwenden sollte
tcpdump -ne | ./mac_ip.py
Gibt es eine Möglichkeit, mein Programm zurückzubekommen? Wie auch immer, ich kann mein Programm wieder schreiben, aber wenn es mit einem wichtigeren Programm erneut passiert, sollte ich in der Lage sein, etwas zu tun. ODER gibt es eine Möglichkeit, die Ausgabeumleitung anzuweisen, nach der Datei zu suchen und zu warnen, ob es sich um eine ausführbare Datei handelt?
quelle
set -o noglobber
Bash nicht mehr in vorhandene Dateien umgeleitet wird. Weitere Informationen finden Sie hier: cyberciti.biz/tips/howto-keep-file-safe-from-overwriting.htmlset -o noclobber
>
wenn Sie meinen|
." Vergiss die Realität nicht.Antworten:
Leider vermute ich, dass Sie es umschreiben müssen. (Wenn Sie Backups haben, ist dies die Zeit, um sie herauszubekommen. Wenn nicht, würde ich Ihnen dringend empfehlen, ein Backup-Regime für die Zukunft einzurichten. Viele Optionen verfügbar, aber nicht thematisch für diese Antwort.)
Ich finde, dass
PATH
es hilfreich ist , ausführbare Dateien in einem separaten Verzeichnis abzulegen und dieses Verzeichnis dem hinzuzufügen . Auf diese Weise muss ich nicht explizit auf die ausführbaren Dateien verweisen. Mein bevorzugtes Programmverzeichnis für persönliche (private) Skripte ist"$HOME"/bin
und es kann mit dem Programmsuchpfad hinzugefügt werdenPATH="$HOME/bin:$PATH"
. Normalerweise wird dies zu den Shell-Startskripten.bash_profile
und / oder hinzugefügt.bashrc
.Schließlich hindert nichts Sie daran, die Schreibberechtigung für alle ausführbaren Programme selbst zu entfernen:
quelle
/usr/local/bin
/usr/local
ist für hostspezifische Dinge gedacht (im Gegensatz zu einem Verzeichnis, das über einen Netzwerk-Mount von mehreren Hosts gemeinsam genutzt wird) und kann von Nicht-Root-Benutzern beschrieben werden oder auch nicht./use/local/bin
für lokal installierte Skripte und Programme, die wahrscheinlich von mehreren Benutzerkonten verwendet werden, und$HOME/bin
für Dinge, die für einen einzelnen Benutzer persönlich sind. In beiden steckt Wert.$HOME/.local/bin
~/.local
da dies ein weiterer Gegenstand ist, der von seinem "traditionellen" Platz verdrängt wurde.Um zu verhindern, dass vorhandene Dateien durch Umleitung überschrieben werden,
>
verwenden Sie dienoclobber
Option inbash
oder eine POSIX-ähnliche Shell (auch dort,(t)csh
wo das Feature ursprünglich erstellt wurde, obwohl Sie diesset noclobber
anstelle vonset -o noclobber
/set -C
dort tun ). Wenn Sie das Ersetzen einer Datei erzwingen müssen, verwenden Sie den>|
Umleitungsoperator (>!
in(t)csh
).Beispiel:
Übrigens können Sie die aktuellen Einstellungen überprüfen mit
set -o
:quelle
>|
statt|
ist nicht viel weniger wahrscheinlich als Tippen>
. 2. Es ist einfach und sehr ratsam, Backups zu erstellen (ein Editor, der seinen Namen verdient, kann die letzte Version speichern; es gibtcron
usw.). 3. Jeder Code sollte unter Versionskontrolle gestellt werden, auch winzige Skripte. YMMV.Ich rate nachdrücklich dazu, die wichtigen Skripte im Rahmen eines Git-Repos remote zu synchronisieren (eine ausgefallene selbst gehostete Plattform reicht aus ), wie in @ caseys Kommentar heißt.
Auf diese Weise sind Sie vor schlimmen menschlichen Fehlern wie dem Zurücksetzen der Datei in den vorherigen Arbeitszustand und dem erneuten Ausführen geschützt.
quelle
Ist die Datei wiederherstellbar?
Kurze Antwort: In der Regel nicht.
@ Mark Plotnick weist in den Kommentaren darauf hin, dass Sie
.py
Dateien.pyc
mit Uncompyle wiederherstellen können . Dies sollte perfekt für Ihre Situation sein.Im Allgemeinen ist dies jedoch viel schwieriger. Theoretisch können Sie mit Forensik-Tools Dateien wiederherstellen. Wahrscheinlich ist die einfachste, die ich verwendet habe
testdisk
(auch bekannt als "PhotoRec"). Es funktioniert nur manchmal und es ist ein langsamer Prozess. Es ist normalerweise nicht wert, also ist es möglich , aber die wirkliche Antwort ist "nein".Kann > geändert werden, um ausführbare Dateien nicht zu überschreiben?
Nein. Es gibt keine Standardmethode, mit der die Shell angewiesen wird, niemals nur Dateien umzuleiten, die als ausführbar gekennzeichnet sind. Es gibt "noclobber", das verhindert, dass in vorhandene Dateien umgeleitet wird, die ausführbar sind oder nicht, aber meine Kommentare dazu finden Sie weiter unten.
Was ist in Zukunft zu tun?
Das mag albern klingen, aber um zukünftige Fehler zu vermeiden, müssen Sie wahrscheinlich nichts tun. Ich wette, Sie haben diese Lektion bereits gelernt.
Ich benutze und unterrichte Unix schon sehr lange und obwohl die Leute diesen Fehler oft machen, wiederholen sie ihn selten. Warum nicht? Wahrscheinlich aus demselben Grund schneidet sich eine Person, die mit Messern zu tun hat, nicht selbst: Menschen können gut lernen. Irgendwann wird es zur zweiten Natur, das Richtige zu tun.
Verwenden Sie einen Texteditor, der Backups für Sie erstellt. Wenn Sie beispielsweise verwenden
emacs
, wird die vorherige Version Ihres Programms in mac_ip.py ~ gespeichert. Andere Editoren können so konfiguriert werden, dass sie ähnlich funktionieren (z. B. "set backup" in.nanorc
). Für Editoren, die keine automatischen Sicherungen unterstützen, können Sie in Ihrer .bashrc-Datei eine vereinfachende Funktion ausführen:Machen Sie es sich einfach, Kopien zu erstellen. Im Verzeichnis des Projekts, an dem Sie arbeiten, befindet sich beispielsweise möglicherweise ein Makefile mit einem Ziel wie dem folgenden:
(Hinweis: stackexchange gibt die obigen Tabulatoren als 4 Leerzeichen falsch wieder.)
Ebenso können Sie ein Makefile-Ziel erstellen, das
rsync
einen entfernten Unix-Host ansteuert, auf den Siessh
Zugriff haben . (Verwendenssh-copy-id
Sie diese Option, damit Sie nicht wiederholt nach Ihrem Passwort gefragt werden.)Verwenden Sie
git
. Es gibt viele hervorragende Tutorials zum Einstieg. Versuchen Sieman gittutorial
,man gittutorial-2
undman giteveryday
. Ein eigenes Git-Repository einzurichten ist nicht schwer, aber Sie können auch kostenlos ein Remote-Repository auf github.com erstellenWenn die oben genannten Lösungen zu schwer sind, können Sie kleine Skripte auf gist.github.com speichern . Es ist zwar möglich, Inhalte aus einem Webbrowser einzufügen oder hochzuladen, ich empfehle jedoch, eine Befehlszeilenschnittstelle zu verwenden , um die Dinge supereinfach zu machen.
Ich rate dringend davon ab, "noclobber" zu verwenden.
Ja, wenn Sie dies wünschen, erhalten Sie
set -o noclobber
Fehlermeldungen, wenn Sie versuchen, eine vorhandene Datei zu überschreiben. Das ist meiner Meinung nach eine schlechte Idee. *Dadurch funktioniert die Shell nicht standardgemäß, und es wird nicht angezeigt, ob sie aktiviert ist. Sie müssen eine andere Syntax verwenden, um normale Dinge zu tun. Am schlimmsten ist, dass Sie eines Tages eine andere Unix-Maschine ohne Noclobber verwenden, wenn Sie sich an Noclobber gewöhnen.
Wie Sie wahrscheinlich wissen, wurde die Unix-Shell als scharfes Werkzeug für Experten konzipiert. Es ist schnell zu bedienen und steht Ihnen nicht im Weg - und es schneidet Sie, wenn Sie vergessen, welches Ende spitz ist. Aber je öfter Sie es benutzen, desto mehr werden Sie es zu schätzen wissen, dass dies eine gute Sache sein kann.
* Fußnote: Nimm meine Meinung vielleicht mit einem Körnchen Salz. Ich bin auch die Art von Person, die Fahrrad-Stützräder für eine schlechte Idee hält.
quelle
Möglicherweise konnten Sie die Daten nach dem ersten Auftreten wiederherstellen, wenn Sie das Skript kürzlich angesehen oder bearbeitet hatten und es sich noch im Speicherpuffer befand. Ansonsten hast du ziemlich viel Pech.
Wenn Sie weitergeleitet haben
tee
, um in eine Datei (sowieSTDOUT
) anstatt>
(odertee -a
anstelle>>
) zu schreiben , können Sie diese einfach durchtee
einen Alias, eine Funktion oder einen Symlink zu einem Skript ersetzen , der den Benutzer warnt, wenn die Datei geschrieben werden soll to ist ausführbar.Das Folgende ist keineswegs ideal und könnte in vielem verbessert werden , aber es ist ein Ausgangspunkt, nur als Beispiel dafür, wie dies möglich ist:
wee.sh:
... dann einfach
echo 'alias tee="/path/to/wee.sh"' >> ~/.bashrc
oder so ähnlich.Zumindest werden Sie mehr Übung haben und die zweite Version Ihres Python-Skripts wird wahrscheinlich viel besser sein als die erste!
quelle
Sie haben nicht angegeben, ob Sie an einem PC oder einem Server arbeiten. Wenn Ihre Dateien zufällig auf einem dedizierten Dateiserver gespeichert sind, werden häufig automatische Sicherungen ("Snapshots") von der (Betriebssystem auf der) Dateiserverhardware gespeichert.
Unter Linux
Das virtuelle, versteckte Snapshot-Verzeichnis ist in jedem Verzeichnis Ihres Dateisystems vorhanden.
Versuchen:
Wenn dieses Verzeichnis existiert, haben Sie möglicherweise Glück. Sie sollten eine Reihe von Verzeichnissen sehen, in denen Backups gespeichert sind, die zu bestimmten Zeitpunkten automatisch gespeichert werden. Die Namen geben die relative Zeit in der Vergangenheit an, zu der der Schnappschuss gespeichert wurde. Beispielsweise:
Wechseln Sie in ein Zeitpunktverzeichnis, das alt genug ist (vor Ihrem Fehler beim Überschreiben von Dateien). Innerhalb des Timepoint-Verzeichnisses sollte der Status des
../..
Verzeichnisses (und aller Unterverzeichnisse) zu diesem Zeitpunkt in der Vergangenheit angezeigt werden .Anmerkungen:
ls -a
zeigt das.snapshot
Verzeichnis nicht an; Sie müssen es explizit benennen. Es wird virtuell vom Dateiserver eingefügt. Es existiert nicht als reales Verzeichnis in Ihrem Dateisystem.Unter Windows
Das versteckte Snapshot-Verzeichnis kann ~ snapshot heißen und ist nur auf der Stammebene eines bestimmten Laufwerks vorhanden.
Rat
Schnappschüsse sind ein Sicherheitsnetz, das die meiste Zeit funktioniert, aber nicht jedes Mal. Ich stimme den anderen Empfehlungen zu, ein Versionskontrollsystem (z. B.
git
) auch für einfache Dateien zu verwenden.quelle
Es wurde bereits gesagt, und ich werde es noch einmal sagen. Verwenden Sie ein Revisionskontrollsystem.
Backups dienen zur Wiederherstellung eines Hardwarefehlers. Die Revisionskontrolle ist für Situationen wie Ihre vorgesehen (und hat viele andere Verwendungszwecke). Mit den Tools zur Versionskontrolle können Sie den Verlauf einer Datei speichern und zu einem beliebigen Punkt in diesem Verlauf zurückkehren.
Beispiele für Tools zur Versionskontrolle sind Subversion (SVN) (etwas in die Jahre gekommen, aber immer noch gut), Quecksilber (hg) und Git (git) (schwer zu verwenden). svn ist gut für Office-Dokumente, und andere um-mergables, git und hg haben es für die meisten anderen Rollen übertroffen. Mit hg und git können Sie offline arbeiten und mit einem Remote-Server für die Verteilung und Sicherung synchronisieren.
Informieren Sie sich über die Versionskontrolle, dann über die verteilte Versionskontrolle, und probieren Sie sie dann aus.
quelle