web-dev-qa-db-fra.com

Utilisé accidentellement la redirection de sortie> au lieu d'un tuyau |

Il y a un mois, j'ai écrit un Python Script pour mapper Mac et les adresses IP de STDIN. Et il y a deux jours, je m'en souvenais et utilisé pour filtrer la production de tcpdump mais cela a mal tourné parce que d'une faute de frappe. J'ai tapé

tcpdump -ne > ./mac_ip.py

et la sortie n'est rien. Mais la sortie devrait être "inconnue" s'il ne peut pas analyser l'entrée, donc je l'ai fait cat ./mac_ip.py et trouvé toutes les données tcpdump au lieu du programme. Puis j'ai réalisé que je devrais utiliser

tcpdump -ne | ./mac_ip.py

Y a-t-il un moyen de récupérer mon programme? Quoi qu'il en soit, je peux écrire mon programme à nouveau, mais s'il arrive à nouveau avec un programme plus important, je devrais pouvoir faire quelque chose. =OR Y a-t-il un moyen de dire la redirection de sortie de vérifier le fichier et de vous avertir s'il est exécutable?

21
Bharath Teja

Malheureusement, je suppose que vous aurez besoin de la réécrire. (Si vous avez des sauvegardes, c'est le moment de les faire sortir. Sinon, je vous recommanderais fortement de créer un régime de sauvegarde pour l'avenir. Beaucoup d'options disponibles, mais hors sujet pour cette réponse.)

Je trouve que mettre des exécutables dans un répertoire séparé et ajouter ce répertoire au PATH est utile. De cette façon, je n'ai pas besoin de faire référence aux exécutables par voie explicite. Mon répertoire de programmes préférés pour les scripts personnels (privés) est "$HOME"/bin et il peut être ajouté au chemin de recherche de programme avec PATH="$HOME/bin:$PATH". Typiquement, cela serait ajouté aux scripts de démarrage de shell .bash_profile et/ou .bashrc.

Enfin, rien ne vous empêche de supprimer l'autorisation d'écriture pour vous-même sur tous les programmes exécutables:

touch some_executable.py
chmod a+x,a-w some_executable.py    # chmod 555, if you prefer

ls -l some_executable.py
-r-xr-xr-x+ 1 roaima roaima 0 Jun 25 18:33 some_executable.py

echo "The hunting of the Snark" > ./some_executable.py
-bash: ./some_executable.py: Permission denied
22
roaima

J'ai fortement conseillé d'avoir les scripts des scripts importants Sous A Git Repo , synchronisé à distance (A La plate-forme de fantaisie auto-hébergée fera), comme indique le commentaire de @ Casey.

De cette façon, vous êtes protégé des mauvaises erreurs humaines, comme Renvoyant le fichier à l'état de fonctionnement précédent et l'exécuter à nouveau.

8
RcrdBrt

Le fichier est-il recouvrable?

Réponse courte: pas généralement.

@Mark Plotnick pointe dans les commentaires, vous pouvez récupérer .py fichiers de .pyc Utiliser inclus . Cela devrait être parfait pour votre situation.

En général, cependant, c'est beaucoup plus difficile. Théoriquement, vous pouvez utiliser des outils de criminalistique pour définir des fichiers. Probablement le plus facile que j'ai utilisé est testdisk (alias "photorec"). Cela ne fonctionne que parfois et c'est un processus lent. Cela ne vaut généralement pas la peine, oui, oui, c'est possible , mais la vraie réponse est "non".

Peut > être modifié pour ne pas écraser les exécutables?

Non. Il n'y a pas de moyen standard de dire à la coquille de ne jamais rediriger que pour les fichiers marqués exécutables. Il y a "Noclobber" qui empêchera de rediriger les fichiers existants, exécutables ou non, mais voir mes commentaires sur cela ci-dessous.

Que faire à l'avenir?

  1. Cela pourrait sonner idiot, mais pour prévenir les erreurs futures, vous n'avez probablement pas besoin de faire rien. Mon pari est que vous avez déjà appris cette leçon.

    J'utilise et j'enseigne Unix pendant très longtemps et que les gens font souvent cette erreur une fois, ils le répètent rarement. Pourquoi pas? Probablement pour la même raison qu'une personne expérimentée avec des couteaux ne se coupe pas: les humains sont bons à l'apprentissage. Finalement, faire la bonne chose devient une seconde nature.

  2. Utilisez un éditeur de texte qui fait des sauvegardes pour vous. Par exemple, si vous utilisez emacs , la version précédente de votre programme est enregistrée dans MAC_IP.PY ~. D'autres éditeurs peuvent être configurés pour fonctionner de la même manière (par exemple, "Set Sauvegarde" dans .nanorc). Pour les éditeurs qui ne prennent pas en charge les sauvegardes automatiques, vous pouvez créer une fonction simpliste dans votre .CASHRC:

    myeditor() { cp -p "$1" "$1~";  editor "$1"; }
    
  3. Faites-vous facilement faire des copies. Par exemple, dans le répertoire du projet sur lequel vous travaillez, vous pourriez avoir un maquillage avec une cible comme celle-ci:

    # Use `make tar` to backup all files in this directory.
    # Tar filename will be ../<currentdirectory>-<date>.tar.gz 
    DIRNAME = $(Shell basename `pwd`)
    TIMESTAMP = $(Shell date +%s)
    tar:
        @echo "[Tarring up ${DIRNAME}.tar.gz]"
        (cd .. ; tar -zcvf "${DIRNAME}-${TIMESTAMP}.tar.gz" "${DIRNAME}")
    

    (Remarque: Stackexchange fait une mauvaise interprétation des onglets ci-dessus comme 4 espaces.)

  4. De même, vous pouvez créer une cible de maquillage qui fait un rsync à un hôte UNIX distant que vous avez ssh accès à. (Utilisation ssh-copy-id Vous ne serez donc pas demandé votre mot de passe à plusieurs reprises.)

  5. Utilisez git . Il existe de nombreux excellents tutoriels sur la mise en route. Essayer man gittutorial , man gittutorial-2 et man giteveryday . Configuration de votre propre référentiel git n'est pas difficile, mais vous pouvez également créer un référentiel à distance sans frais sur github.com

  6. Si les solutions ci-dessus sont trop lourdes, vous pouvez enregistrer de petits scripts à gist.github.com . Bien qu'il soit possible de coller ou de télécharger à partir d'un navigateur Web, je vous recommande d'utiliser A Interface gist de ligne de commande pour rendre les choses super faciles.

Je décourage fortement en utilisant "Noclobber".

Oui, si vous choisissez, vous pouvez faire set -o noclobber Vous obtiendrez donc des messages d'erreur chaque fois que vous essayez d'écraser un fichier existant. C'est une mauvaise idée, à mon avis.*

Il rend le shell traverse de manière non standard sans indication visible si elle est activée. Vous devez utiliser une syntaxe différente pour faire des choses normales. Pire de tous, si vous vous habituez à NOCLOBBER, vous utiliserez un jour une autre machine UNIX sans noclobber et ce type d'accident pourrait se reproduire.

Comme vous le savez probablement, la coquille Unix a été conçue pour être un outil pointu pour les experts. Il est rapide d'utiliser et n'obtiendra pas dans votre chemin - et cela vous coupera si vous oubliez quelle extrémité est pointue. Mais plus vous l'utilisez, plus je pense que vous apprécierez que cela peut être une bonne chose.


* Note de bas de page: Peut-être que mes opinions avec un grain de sel. Je suis aussi le genre de personne qui pense que les roues d'entraînement à vélo sont une mauvaise idée.

4
hackerb9

Vous n'avez pas spécifié si vous travaillez sur un PC ou un serveur. Si vos fichiers arrivent à être stockés sur un serveur de fichiers dédié, il existe souvent des sauvegardes automatiques ("instantanés") étant conservées par le matériel (OS sur le serveur de fichiers).

Sous Linux

Le répertoire d'instantané virtuel et caché existe dans chaque répertoire de votre système de fichiers.

Essayer:

cd .snapshot   
ls -l

Si ce répertoire existe, alors vous pouvez avoir de la chance. Vous devriez voir une série de répertoires qui contiennent des sauvegardes stockées automatiquement à certains moments. Les noms indiquent l'heure relative dans le passé à laquelle l'instantané a été stocké. Par exemple:

hourly.0
hourly.1
hourly.2
hourly.3
hourly.4
hourly.5
nightly.0
nightly.1
nightly.2
nightly.3
nightly.4
nightly.5
nightly.6
weekly.0
weekly.1
weekly.2

Allez dans n'importe quel répertoire TimePoint qui est assez vieux (avant votre erreur de remplacement de fichiers). Dans le répertoire TimePoint, vous devriez voir l'état du ../.. Annuaire (et tous les sous-répertoires) à partir de ce point dans le passé.

cd nightly.6
ls  # look around   
tee < mac_ip.py  # check for the correct content
cp mac_ip.py ~/safekeeping/mac_ip.py  # save the old file

Remarques:

  1. ls -a ne montrera pas le .snapshot répertoire; Vous devez le nommer explicitement. Il est inséré pratiquement par le serveur de fichiers. Il n'existe pas comme réel répertoire dans votre système de fichiers.
  2. Ces instantanés automatiques sont un historique de roulement. Les anciens changements tombent finalement de la fin et sont perdus. Vous devez utiliser cette technique dès que possible après que vous réalisiez que vous avez besoin d'un fichier.

Sous Windows

Le répertoire instantané caché peut être nommé ~ instantané et n'existe qu'au niveau racine d'un lecteur donné.

Conseil

Les instantanés sont un filet de sécurité qui fonctionne la plupart du temps, mais pas à chaque fois. Je suis d'accord avec les autres recommandations pour utiliser un système de contrôle de version (telle que git) même pour des fichiers triviaux.

1
jskroch