Hace un mes escribí un script de Python para mapear las direcciones MAC e IP de stdin. Y hace dos días lo recordaba y solía filtrar la salida de, tcpdump
pero salió mal debido a un error tipográfico. escribí
tcpdump -ne > ./mac_ip.py
Y la salida es nada. Pero la salida debería ser "Desconocida" si no puede analizar la entrada, así que lo hice cat ./mac_ip.py
y encontré todos los tcpdump
datos en lugar del programa. Entonces me di cuenta de que debería usar
tcpdump -ne | ./mac_ip.py
¿Hay alguna forma de recuperar mi programa? De todos modos, puedo volver a escribir mi programa, pero si vuelve a ocurrir con un programa más importante, debería poder hacer algo. ¿O hay alguna forma de decirle a la redirección de salida que verifique el archivo y advierta si es un ejecutable?
linux
pipe
io-redirection
Bharath Teja
fuente
fuente
set -o noglobber
y bash ya no redirigirá a los archivos existentes. Ver aquí para más detalles: cyberciti.biz/tips/howto-keep-file-safe-from-overwriting.htmlset -o noclobber
>
cuando quieras|
". No olvides la realidad.Respuestas:
Lamentablemente sospecho que tendrá que volver a escribirlo. (Si tiene copias de seguridad, este es el momento de sacarlas. De lo contrario, le recomendaría que configure un régimen de copias de seguridad para el futuro. Muchas opciones disponibles, pero fuera de tema para esta respuesta).
Me parece
PATH
útil colocar ejecutables en un directorio separado y agregar ese directorio al . De esta manera no necesito hacer referencia a los ejecutables por ruta explícita. Mi directorio de programas preferido para scripts personales (privados) es"$HOME"/bin
y se puede agregar a la ruta de búsqueda del programa conPATH="$HOME/bin:$PATH"
. Por lo general, esto se agregaría a los scripts de inicio de shell.bash_profile
y / o.bashrc
.Finalmente, no hay nada que le impida eliminar el permiso de escritura para usted en todos los programas ejecutables:
fuente
/usr/local/bin
es la ubicación estándar para los archivos ejecutables y los scripts creados por el usuario/usr/local
está destinado a cosas específicas del host (a diferencia de un directorio compartido entre hosts a través de un montaje de red), y puede ser o no escribible por usuarios no root./use/local/bin
para scripts y programas instalados localmente que es probable que sean utilizados por múltiples cuentas de usuario, y$HOME/bin
para cosas personales de un solo usuario. Hay valor en ambos.$HOME/.local/bin
~/.local
ya que ese es otro elemento más movido de su lugar "tradicional".Para evitar que los archivos existentes se sobrescriban mediante la redirección,
>
use lanoclobber
opción enbash
o en cualquier shell similar a POSIX (también en(t)csh
donde se originó la característica, aunque lo haga enset noclobber
lugar deset -o noclobber
/set -C
allí). Luego, si necesita forzar el reemplazo de un archivo, use el>|
operador de redirección (>!
in(t)csh
).Ejemplo:
Por cierto, puede verificar la configuración actual con
set -o
:fuente
>|
lugar de|
no es mucho menos probable que escribir>
. 2. Es fácil y altamente recomendable hacer copias de seguridad (un editor que valga su nombre puede guardar la última versión; haycron
, etc.). 3. Cada fragmento de código debe ser puesto bajo control de versión, incluso pequeños scripts. YMMV.Recomiendo encarecidamente tener los scripts importantes bajo un repositorio de git , sincronizados de forma remota ( lo hará una elegante plataforma autohospedada), como dice el comentario de @ casey.
De esta forma, está protegido de errores humanos graves, como revertir el archivo al estado de trabajo anterior y ejecutarlo nuevamente.
fuente
¿El archivo es recuperable?
Respuesta corta: generalmente no.
@ Mark Plotnick señala en los comentarios, puede recuperar
.py
archivos.pyc
usando Uncompyle . Esto debería ser perfecto para su situación.En general, sin embargo, esto es mucho más difícil. Teóricamente puedes usar herramientas forenses para recuperar archivos. Probablemente la más fácil que he usado es
testdisk
(también conocido como "PhotoRec"). Solo funciona a veces y es un proceso lento. Por lo general, no vale la pena, así que sí, es posible , pero la respuesta real es "no".¿Se puede > cambiar para no sobrescribir ejecutables?
No. No hay una forma estándar de decirle al shell que nunca redirija solo los archivos marcados como ejecutables. Hay "noclobber" que evitará la redirección a archivos existentes, ejecutables o no, pero vea mis comentarios al respecto a continuación.
¿Qué hacer en el futuro?
Esto puede sonar tonto, pero para evitar futuros errores, probablemente no necesite hacer nada. Mi apuesta es que ya has aprendido esta lección.
He estado usando y enseñando Unix durante mucho tiempo y, aunque la gente suele cometer este error una vez, rara vez lo repite. Por qué no? Probablemente por la misma razón que una persona experimentada con cuchillos no se corta: los humanos son buenos para aprender. Finalmente, hacer lo correcto se convierte en una segunda naturaleza.
Use un editor de texto que haga copias de seguridad por usted. Por ejemplo, si usa
emacs
, la versión anterior de su programa se guarda en mac_ip.py ~. Se pueden configurar otros editores para que funcionen de manera similar (por ejemplo, "establecer copia de seguridad" en.nanorc
). Para los editores que no admiten copias de seguridad automáticas, puede realizar una función simplista en su .bashrc:Facilítese hacer copias. Por ejemplo, en el directorio del proyecto en el que está trabajando, puede tener un Makefile con un objetivo como este:
(Nota: stackexchange está representando erróneamente las TAB anteriores como 4 espacios).
Del mismo modo, puede crear un destino Makefile que haga un
rsync
host remoto de Unix al que tengassh
acceso. (Úselossh-copy-id
para que no se le solicite su contraseña repetidamente).Uso
git
. Hay muchos tutoriales excelentes para comenzar. Tratarman gittutorial
,man gittutorial-2
yman giteveryday
. Configurar su propio repositorio git no es difícil, pero también puede crear un repositorio remoto sin costo en github.comSi las soluciones anteriores son demasiado pesadas, puede guardar pequeños scripts en gist.github.com . Si bien es posible pegar o cargar desde un navegador web, recomiendo usar una interfaz de línea de comando para facilitar las cosas.
Desaconsejo firmemente el uso de "noclobber".
Sí, si lo desea, puede hacerlo
set -o noclobber
, recibirá mensajes de error cada vez que intente sobrescribir un archivo existente. Esta es una mala idea, en mi opinión. * *Hace que el shell funcione de una manera no estándar sin indicación visible de si está habilitado. Tienes que usar una sintaxis diferente para hacer cosas normales. Lo peor de todo es que si te acostumbras al noclobber, algún día usarás otra máquina Unix sin noclobber y este tipo de accidente podría volver a ocurrir.
Como probablemente sepa, el shell de Unix fue diseñado para ser una herramienta precisa para los expertos. Es rápido de usar y no se interpondrá en su camino, y le cortará si olvida qué extremo es puntiagudo. Pero, cuanto más lo use, más creo que apreciará que eso puede ser algo bueno.
* Nota al pie: quizás tome mis opiniones con un grano de sal. También soy el tipo de persona que piensa que las ruedas de entrenamiento para bicicletas son una mala idea.
fuente
Es posible que haya podido recuperar los datos después de que ocurrieran por primera vez si había visto o editado recientemente el script y todavía estaba en el búfer de memoria. De lo contrario, no tienes suerte.
Si eligió
tee
escribir en un archivo (así comoSTDOUT
) en lugar de>
(o entee -a
lugar de>>
), podría reemplazarlo fácilmentetee
con un alias, función o enlace simbólico a un script que advierta al usuario si el archivo está a punto de escribir to es ejecutable.Lo siguiente no es ideal y podría mejorarse mucho , pero es un punto de partida, solo como un ejemplo de cómo esto es posible:
wee.sh:
... entonces solo
echo 'alias tee="/path/to/wee.sh"' >> ~/.bashrc
o algo similar.En el lado positivo, al menos tendrás más práctica y la segunda versión de tu script Python probablemente será mucho mejor que la primera.
fuente
No especificó si está trabajando en una PC o un servidor. Si sus archivos están almacenados en un servidor de archivos dedicado, entonces el hardware del servidor de archivos (SO) guarda a menudo copias de seguridad automáticas ("instantáneas").
Bajo Linux
El directorio virtual de instantáneas ocultas existe en cada directorio de su sistema de archivos.
Tratar:
Si ese directorio existe, entonces puede que tengas suerte. Debería ver una serie de directorios que contienen copias de seguridad almacenadas automáticamente en determinados momentos. Los nombres indican el tiempo relativo en el pasado en el que se almacenó la instantánea. Por ejemplo:
Vaya a cualquier directorio de puntos de tiempo que sea lo suficientemente antiguo (antes de su error de sobrescritura de archivos). Dentro del directorio de puntos de tiempo, debería ver el estado del
../..
directorio (y todos los subdirectorios) a partir de ese punto en el pasado.Notas:
ls -a
no mostrará el.snapshot
directorio; debes nombrarlo explícitamente. Se inserta virtualmente por el servidor de archivos. No existe como un directorio real en su sistema de archivos.Bajo Windows
El directorio de instantáneas ocultas puede llamarse ~ instantánea y existir solo en el nivel raíz de una unidad determinada.
Consejo
Las instantáneas son una red de seguridad que funciona la mayor parte del tiempo, pero no siempre. Estoy de acuerdo con las otras recomendaciones para usar un sistema de control de versiones (como
git
) incluso para archivos triviales.fuente
Se ha dicho antes, y lo diré nuevamente. Use un sistema de control de revisión.
Las copias de seguridad son para recuperar una falla de hardware. El control de revisión es para situaciones como la suya (y tiene muchos otros usos). Las herramientas de control de revisiones le permiten mantener un historial de un archivo y volver a cualquier punto de ese historial.
Los ejemplos de herramientas de control de revisión incluyen subversión (SVN) (un poco viejo ahora, pero sigue siendo bueno), mercurial (hg) y git (git) (difícil de usar). svn es bueno para documentos de oficina, y otros um-mergables, git y hg lo han superado para la mayoría de los otros roles. hg y git le permiten trabajar fuera de línea y sincronizarse con un servidor remoto, para distribución y respaldo.
Lea sobre el control de revisión, luego el control de revisión distribuido y luego pruébelos.
fuente