Месяц назад я написал скрипт Python для сопоставления MAC-адресов и IP-адресов со стандартного ввода. И два дня назад я запомнил это и использовал для фильтрации выходных данных, tcpdump
но это пошло не так из-за опечатки. Я набрал
tcpdump -ne > ./mac_ip.py
и на выходе ничего нет. Но вывод должен быть «Неизвестен», если он не может проанализировать ввод, поэтому я сделал cat ./mac_ip.py
и нашел все tcpdump
данные вместо программы. Тогда я понял, что я должен использовать
tcpdump -ne | ./mac_ip.py
Есть ли способ вернуть мою программу? В любом случае я снова могу написать свою программу, но если это случится снова с более важной программой, я смогу что-то сделать. ИЛИ есть ли способ сообщить перенаправлению вывода, чтобы проверить файл и предупредить, если это исполняемый файл?
linux
pipe
io-redirection
Бхарат Теджа
источник
источник
set -o noglobber
и bash больше не будет перенаправлять в существующие файлы. Подробности смотрите здесь: cyberciti.biz/tips/howto-keep-file-safe-from-overwriting.htmlset -o noclobber
>
когда имеете в виду|
». Не забывай реальность.Ответы:
К сожалению, я подозреваю, что вам нужно будет переписать это. (Если у вас есть резервные копии, самое время их извлечь. Если нет, я настоятельно рекомендую вам настроить режим резервного копирования на будущее. Множество доступных вариантов, но не по теме для этого ответа.)
Я считаю, что размещение исполняемых файлов в отдельном каталоге и добавление этого каталога в каталог
PATH
полезно. Таким образом, мне не нужно ссылаться на исполняемые файлы по явному пути. Я предпочитаю каталог программ для личных (личных) скриптов,"$HOME"/bin
и его можно добавить в путь поиска программ с помощьюPATH="$HOME/bin:$PATH"
. Обычно это добавляется в сценарии запуска оболочки.bash_profile
и / или.bashrc
.Наконец, ничто не мешает вам удалить разрешение на запись для всех исполняемых программ:
источник
/usr/local/bin
является стандартным местом для пользовательских исполняемых файлов и скриптов/usr/local
предназначен для специфичных для хоста вещей (в отличие от каталога, совместно используемого хостами через сетевое монтирование), и может быть или не быть доступным для записи пользователям без полномочий root./use/local/bin
для локально установленных сценариев и программ, которые могут использоваться несколькими учетными записями, а также$HOME/bin
для личных вещей одного пользователя. В обоих есть ценность.$HOME/.local/bin
~/.local
как это еще один элемент, перемещенный из своего «традиционного» места.Чтобы предотвратить перезапись существующих файлов путем перенаправления,
>
используйтеnoclobber
параметр вbash
любой POSIX-подобной оболочке (также в том месте,(t)csh
где эта функция фактически возникла, хотя вы делаете этоset noclobber
вместоset -o noclobber
/set -C
там). Затем, если вам нужно принудительно заменить файл, используйте>|
оператор перенаправления (>!
in(t)csh
).Пример:
Кстати, вы можете проверить текущие настройки с
set -o
:источник
>|
вместо того, чтобы|
не намного менее вероятно чем печатание>
. 2. Создать резервные копии легко и настоятельно рекомендуется (редактор, достойный своего имени, может сохранить последнюю версию; есть иcron
т. Д.). 3. Каждый кусочек кода должен быть поставлен под контроль версий, даже крошечные скрипты. YMMV.Настоятельно советую иметь важные скрипты под git-репо синхронизировались удаленно ( подойдет платформа с собственным хостингом ), как говорится в комментарии @ casey.
Таким образом, вы защищены от ошибок человека, таких как возврат файла в предыдущее рабочее состояние и выполнение его снова.
источник
Можно ли восстановить файл?
Краткий ответ: обычно нет.
@Mark Plotnick указывает в комментариях, вы можете восстановить
.py
файлы с.pyc
помощью Uncompyle . Это должно быть идеально подходит для вашей ситуации.Но в целом все гораздо сложнее. Теоретически вы можете использовать криминалистические инструменты для восстановления файлов. Наверное, самое простое, что я использовал
testdisk
(так называемый «PhotoRec»). Это работает только иногда, и это медленный процесс. Обычно это того не стоит, так что да, это возможно , но реальный ответ - «нет».Можно ли > изменить не перезаписывать исполняемые файлы?
Нет. Не существует стандартного способа указать оболочке никогда не перенаправлять только файлы, помеченные как исполняемые. Существует «noclobber», который предотвращает перенаправление в существующие файлы, исполняемые или нет, но смотрите мои комментарии по этому вопросу ниже.
Что делать в будущем?
Это может звучать глупо, но, чтобы предотвратить будущие ошибки, вам, вероятно, ничего не нужно делать. Держу пари, что вы уже усвоили этот урок.
Я очень давно использую и преподаю Unix, и хотя люди часто делают эту ошибку один раз, они редко ее повторяют. Почему бы нет? Вероятно, по той же причине, по которой человек, имеющий опыт работы с ножами, не порезался: люди хорошо учатся. В конце концов, правильные поступки становятся второй натурой.
Используйте текстовый редактор, который делает резервные копии для вас. Например, если вы используете
emacs
, предыдущая версия вашей программы сохраняется в mac_ip.py ~. Другие редакторы могут быть настроены для работы аналогичным образом (например, «установить резервную копию» в.nanorc
). Для редакторов, которые не поддерживают автоматическое резервное копирование, вы можете сделать упрощенную функцию в вашем .bashrc:Сделать это легко для себя, чтобы сделать копии. Например, в каталоге проекта, над которым вы работаете, у вас может быть Makefile с такой целью:
(Примечание: stackexchange неверно отображает вкладки выше как 4 пробела.)
Точно так же вы можете создать цель Makefile, которая обращается
rsync
к удаленному хосту Unix, к которому у вас естьssh
доступ. (Используйте,ssh-copy-id
чтобы вам не нужно было повторно запрашивать пароль.)Использование
git
. Есть много отличных учебников по началу работы. Попробуйman gittutorial
,man gittutorial-2
иman giteveryday
. Настроить свой собственный git-репозиторий несложно, но вы также можете бесплатно создать удаленный репозиторий на github.com.Если приведенные выше решения имеют слишком большой вес, вы можете сохранить небольшие сценарии на gist.github.com . Хотя можно вставлять или загружать из веб-браузера, я рекомендую использовать интерфейс командной строки, чтобы упростить задачу.
Я настоятельно не рекомендую использовать "Noclobber".
Да, если вы выберете, вы можете сделать
set -o noclobber
так, что вы будете получать сообщения об ошибках всякий раз, когда вы пытаетесь перезаписать существующий файл. На мой взгляд, это плохая идея. *Это заставляет оболочку работать нестандартным способом без видимого указания, включена ли она. Вы должны использовать другой синтаксис для выполнения обычных вещей. Хуже всего то, что если вы привыкнете к noclobber, то когда-нибудь вы будете использовать другую Unix-машину без noclobber, и такого рода аварии могут произойти снова.
Как вы, наверное, знаете, оболочка Unix была разработана для того, чтобы стать хорошим инструментом для экспертов. Он быстрый в использовании и не будет мешать вам - и он порежет вас, если вы забудете, какой конец острый. Но чем больше вы его используете, тем больше я думаю, вы по достоинству оцените это.
* Сноска: возможно, примите мое мнение с недоверием. Я также человек, который считает велосипедные тренировочные колеса плохой идеей.
источник
Возможно, вы смогли восстановить данные после того, как они впервые появились, если вы недавно просматривали или редактировали скрипт, и он все еще находился в буфере памяти. В противном случае вам не повезло.
Если вы отправили трубку для
tee
записи в файл (а такжеSTDOUT
) вместо>
(илиtee -a
вместо>>
), то вы могли бы легко заменитьtee
псевдоним, функцию или символическую ссылку на скрипт, который предупреждает пользователя, если файл, который он собирается записать к исполняемому.Ниже отнюдь не идеал и может быть улучшено на много , но это отправная точка, так же , как пример того , как это возможно:
wee.sh:
... тогда просто
echo 'alias tee="/path/to/wee.sh"' >> ~/.bashrc
или что-то подобное.С другой стороны, по крайней мере, вы получите больше практики, и вторая версия вашего скрипта Python, вероятно, будет намного лучше, чем первая!
источник
Вы не указали, работаете ли вы на ПК или на сервере. Если ваши файлы хранятся на выделенном файловом сервере, то зачастую аппаратное обеспечение файлового сервера (ОС на нем) хранит автоматические резервные копии («снимки»).
Под линуксом
Виртуальный скрытый каталог снимков существует в каждом каталоге вашей файловой системы.
Пытаться:
Если этот каталог существует, то вам может повезти. Вы должны увидеть серию каталогов, в которых хранятся резервные копии, автоматически сохраняемые в определенные моменты времени. Имена указывают относительное время в прошлом, когда был сохранен снимок. Например:
Перейдите в любой каталог времени, который достаточно стар (до вашей ошибки перезаписи файла). Внутри каталога timepoint вы должны видеть состояние
../..
каталога (и всех подкаталогов) на тот момент в прошлом.Заметки:
ls -a
не будет показывать.snapshot
каталог; Вы должны назвать это явно. Он вставляется практически файловым сервером. Он не существует как реальный каталог в вашей файловой системе.Под виндой
Каталог скрытых снимков может называться ~ снимок и существовать только на корневом уровне данного диска.
Совет
Снимки - это защитная сеть, которая работает большую часть времени, но не каждый раз. Я согласен с другими рекомендациями использовать систему контроля версий (например,
git
) даже для тривиальных файлов.источник
Это было сказано ранее, и я скажу это снова. Используйте систему контроля версий.
Резервные копии предназначены для восстановления аппаратного сбоя. Управление ревизиями предназначено для таких ситуаций, как ваша (и имеет много других применений). Инструменты контроля версий позволяют вести историю файла и возвращаться к любой точке этой истории.
Примеры инструментов контроля версий включают в себя Subversion (SVN) (немного устаревший сейчас, но все еще хорошо работающий), Mercurial (HG) и GIT (GIT) (трудно использовать). svn хорош для офисных документов, а другие um-mergables, git и hg превзошли его для большинства других ролей. hg и git позволяют работать автономно и синхронизироваться с удаленным сервером для распространения и резервного копирования.
Прочтите информацию о контроле версий, затем распределите контроль версий и попробуйте их.
источник