четверг, 31 марта 2011 г.

О вируса, антивирусах и методике борьбы с ними.

Немного полезной информации о вирусах, антивирусах и методике борьбы с ними.

1. Любая компьютерная программа потенциально может быть инфицирована. Это означает, что необходимо постоянно следить за выпуском заплат и обновлений к ней. Обычно информация такого рода всегда доступна на сайте компании-производителя.

2. Любой компьютер, способный к обмену информацией (через дискеты, лазерные диски, по сети или другим беспроводным каналам связи) потенциально может быть инфицирован. Следовательно, даже если машина включается всего раз в год, то во время этого сеанса она все равно может быть заражена вирусом. В защите не нуждаются разве что нерабочие и никогда не включаемые компьютеры.

3. В наибольшей степени подвержены заражению компьютеры под управлением операционной системы семейства Microsoft Windows. Это происходит потому, что это пожалуй самое распространенное на сегодняшний день в мире программное обеспечение. Такое положение вещей достигается не только грамотной политикой компании, но и функциональностью и удобством в работе с их продуктом. Однако усложнение любой программы непременно ведет и к увеличению числа различных уязвимостей. Поэтому в работе с такой операционной системой особенно важно вовремя устанавливать все последние обновления и заплаты.

4. Теоретические основы создания компьютерных вирусов были заложены в 40-х годах прошлого столетия американским ученым Джоном фон Нейманом (John von Neumann), который также известен как автор базовых принципов работы современного компьютера. В то время компьютеров было очень мало, они имели большие размеры, занимали обширные площади и использовались исключительно в научных целях.

5. Первый настоящий компьютерный вирус Pervading Animal появился в конце 1960-х годов и представлял собой игру, написанную с непреднамеренной ошибкой. Первым сетевым червем стал Creeper (конец 1970-х), умевший самостоятельно выйти в сеть через модем и записать свою копию на удаленной машине. Первый троян - Aids Information Diskette (1989 год) сразу вызвал эпидемию: будучи зараженным такой компьютер после 90 перезагрузок операционной системы показывал пользователю требование перевести на указанный в нем адрес $189, при этом все остальные файлы жесткого диска становились недоступны.

6. Первую глобальную эпидемию вызвал Brain (1986 год), по совместительству первый вирус для IBM-совместимых компьютеров, а также стелс-вирус. Он был написан в Пакистане двумя братьями-программистами с целью определения уровня пиратства у себя в стране.

7. Среди вредоносных программ выделяют четыре основных типа:
Вирусы
Черви
Трояны
Другие: условно опасные программы (riskware, adware, pornware), шпионские программы (spyware), хакерские утилиты и злые шутки

8. Каждый из вышеперечисленных типов вредоносных программ отличается от других методом распространения, средой обитания и наносимым вредом.

9. Вирусные шутки и мистификации - это специальный класс вредоносных явлений, рассчитанных на очень доверчивых пользователей. При получении сообщения такого рода прежде, чем предпринимать какие-либо действия, необходимо проконсультироваться у специалиста в этой области либо самостоятельно ознакомиться с последней информацией на веб-сайтах ведущих производителей антивирусного программного обеспечения.

10. Для проверки работоспособности установленной антивирусной защиты существует специальный тестовый вирус - Eicar. Все ведущие антивирусные продукты его детектируют, при этом никаких действий он не совершает. Загрузить сам тестовый вирус в разных форматах или инструкцию по его написанию можно на сайте www.eicar.org
Основанием для подозрения на наличие вируса в системе могут служить:
Внезапное и несанкционированное изменение настроек браузера
Необычные всплывающие окна и другие сообщения
Неожиданный несанкционированный дозвон в Интернет
Самопроизвольное блокирование антивирусной программы
Невозможность загрузки файлов с веб-сайтов антивирусных компаний
Необоснованные на первый взгляд сбои в работе операционной системы или других программ
Почтовые уведомления с заслуживающих доверие сайтов об отправке пользователем инфицированных сообщений

11. При подозрении на заражение системы вирусом в первую очередь рекомендуется:
Проверить наличие в оперативной памяти подозрительных процессов
Проанализировать элементы автозапуска: в меню автозагрузки, в системном реестре Windows, в конфигурационных файлах win.ini и system.ini
Вывести список всех сетевых соединений и убедиться в отсутствии подозрительной сетевой активности
Ознакомиться с последними новостями на сайтах антивирусных компаний и в случае оглашения эпидемии какого-либо вируса сравнить его проявления и теми, которые наблюдаются на компьютере
Проверить отсутствие на жестком диске подозрительных файлов (в соответствии с описаниями последних вирусов)

12. Для предотвращения проникновения в систему вредоносной программы необходимо соблюдать следующие правила:
Вовремя устанавливать последние обновления и заплаты используемого программного обеспечения, особенно - операционной системы семейства Microsoft Windows
Перед чтением данных с любого сменного носителя (дискета, компакт диск, flash-память и др.) обязательно проводить проверку на наличие на нем вирусов
Не загружать из Интернет файлы неизвестного происхождения, тем более - программы, и не устанавливать их. Особенно это касается не заслуживающих доверия сайтов
Не открывать электронные письма, полученные от незнакомых людей или имеющие подозрительную тему сообщения
Если на компьютере установлен антивирус - никогда не выключать постоянную проверку, поддерживать актуальность антивирусных баз (загружая обновления не реже одного раза в три дня), каждую неделю проводить тщательную проверку всего диска на наличие на нем вирусов
Использование брандмауэра, пусть даже встроенного в операционную систему, также крайне желательно
При интенсивном обмене электронными сообщениями или привычке оставлять свой электронный адрес на публичных сайтах, рекомендуется установить и использовать антиспамовую программу
Самостоятельно даже не пытаться создавать вредоносные программы или сознательно участвовать в их распространении, поскольку в Уголовном Кодексе Российской Федерации есть ряд статей, предусматривающих наказание за такую деятельность, вплоть до лишения свободы на срок до пяти лет, а современные технологии позволяют достаточно быстро вычислить автора или распространителя

13. При обнаружении на компьютере вирусов необходимо обратиться к специалистам. В случае домашнего компьютера можно попытаться самостоятельно с помощью антивируса найти, вылечить или уничтожить зараженный файл или файлы, а если такая программа не установлена - обратиться в ближайшую антивирусную компанию (найти адрес всегда можно с помощью телефонной справки или путем поиска в Интернет)

14. Установка и правильная настройка антивирусного программного обеспечения - это самый надежный способ обеспечить защиту против вредоносных программ. В своей работе антивирус использует следующие технологии:
Сигнатурный анализ
Эвристический анализ

При этом сигнатурный анализ требует наличия самых последних антивирусных баз - списка сигнатур вирусов.

Для обеспечения эффективной, но в то же время ненавязчивой антивирусной защиты используются два основные режима работы антивирусного программного обеспечения:
Проверка в режиме реального времени или постоянная защита
Проверка по требованию

В первом случае обеспечивается защита от заражения системы, во втором - от проникновения вредоносных программ.

15. Среди всех антивирусных средств выделяют три основные группы - предназначенные для домашнего использования, для комплексной защиты локальной сети и для установки на мобильные устройства. При этом программы для защиты сети делятся на четыре антивирусных комплекса в соответствии с функциями компьютеров, на которые они устанавливаются. Это:
Антивирусный комплекс для защиты рабочих станций
Антивирусный комплекс для защиты сетевых серверов
Антивирусный комплекс для защиты почтовых систем
Антивирусный комплекс для защиты шлюзов
Комплексная антивирусная защита типовой сети содержит три уровня:
Уровень защиты рабочих станций и сетевых серверов (используются комплексы для защиты рабочих станций и сетевых серверов) - покрывает все компьютеры сети, вне зависимости от выполняемых ими функций (в том числе почтовые сервера и шлюзы)
Уровень защиты почтовых систем (комплекс для защиты почтовых систем) - интегрируется с почтовой системой и проверяет на вирусы всю входящую и исходящую из локальной сети корреспонденцию
Уровень защиты шлюзов (комплекс для защиты шлюзов) - блокирует проникновение вирусов через HTTP-, FTP- и SMTP-трафик, связывающий локальную сеть с внешним миром (обычно с сетью Интернет)
В случае большой локальной сети оказывается очень полезным наличие программы для удаленного централизованного управления. Она позволяет администратору проводить обновление антивирусных баз, модифицировать настройки, запускать или останавливать антивирусную защиту на всех подведомственных ему компьютерах удаленно и централизованно. При этом сбор статистики также происходит централизованно, что позволяет эффективно контролировать вирусную ситуацию в сети, оперативно отслеживать все вирусные инциденты, автоматически создавать отчеты и рассылать уведомления.

16. Вирусы для мобильных телефонов существуют. Это дает основания ожидать появления вирусов и для других мобильных устройств. Таким образом, в работе с любыми компьютеризированными устройствами необходимо соблюдать перечисленные выше правила компьютерной гигиены, а именно - не допускать загрузку файлов, сообщений и программ из неизвестных или подозрительных источников.

17. Антивирусы для мобильных телефонов существуют. Для большинства смартфонов уже налажен выпуск антивирусных средств. Следовательно, если на телефоне хранится важная информация или, тем более, конфиденциальные данные, установка такой программы является обязательной.

18. Уголовный Кодекс Российской Федерации содержит ряд статей, определяющих меру ответственности за действия, так или иначе связанные с распространением вредоносных программ. В Главу 28 "Преступления в сфере компьютерной информации" входят:
Статья 146. Нарушение авторских и смежных прав
Статья 138. Нарушение тайны переписки, телефонных переговоров, почтовых, телеграфных или иных сообщений
Статья 272. Неправомерный доступ к компьютерной информации
Статья 273. Создание, использование и распространение вредоносных программ для ЭВМ
Статья 274. Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети
Однако следует помнить, что кроме Уголовного Кодекса, существуют еще различные положения и указы, принятые на уровне организаций, которым принадлежит компьютерная техника. Им также необходимо следовать.

среда, 30 марта 2011 г.

Краткий справочник по массовому переименовыванию файлов

ногда нужно производить массовые переименования файлов. Изучая командную строку юникса когда то, меня удивило отсутствие такой приятной возможности в DOS как массовые переименовывания файлов (помню было что то типа copy *.c *.bak).

1. По первому разу я просто в vi создавал множество команд mv производящие нужные действия. Самый очевидный, и самый трудоемкий путь Ж:-)

2. Позже я начал разбираться с командной строкой юникса и мог запрограммировать массовые переименования.

for i in *.c; do
mv $i `echo $i | sed 's/\.c$/.bak/'`
done

в sed задается то как хочется переименовать файл.

Вариант для zsh

for i (*.c) mv $i $i:r.bak

3. Как оказалось позже в поставке perl имеется простенькая утилитка rename. Первым параметром можно указать кусочек кода на perl который применяется к каждому имени файла переданные как параметры.

$ rename 's/\.c\.orig$/.c/' *.c # переименовать все *.c.orig в *.c
$ rename 'y/A-Z/a-z/' *.JPG # имена фотографий маленькими буквами
$ rename 's/\U/\u/g' *.JPG # тоже самое
$ rename '$_=lc' * # тоже самое, но для всех файлов
$ rename 's/deftones-//' *.mp3 # убрать префис 'deftones-' у *.mp3
$ rename 's/^/jerk-/' *.swf # добавить префикс 'jerk-' у *.swf
$ rename 's/ /_/g' * # пробелы в именах файлах заменить на '_'
# перевести в большой регистр часть имени файла
$ rename -v 's/s\d.*e\d/\U$&\E/' House.M.D.s0*
House.M.D.s03e04.rus.avi renamed as House.M.D.S03E04.rus.avi
House.M.D.s03e05.rus.avi renamed as House.M.D.S03E05.rus.avi
House.M.D.s03e06.rus.avi renamed as House.M.D.S03E06.rus.avi
House.M.D.s03e07.rus.avi renamed as House.M.D.S03E07.rus.avi

# более сложный вариант by mancubus.

rename 'tr/ /_/;$_=lc' * # переводит все файлы в директории в
# нижний регистр и заменяет " " на _

4. В zsh есть модуль zmv который как раз и занимается подобными преобразованиями.
Это довольно таки сложная в использовании команда, и думаю только zsh-гуру могут в полной мере ей пользоваться Ж:-)
Но тем не менее сами разработчики предлагают сделать пару довольно таки удобных алиасов, которые ведут себя
так же как команды copy и move в DOS.

Достаточно в ~/.zshrc прописать.

autoload zmv
alias ccp='noglob zmv -CW'
alias mmv='noglob zmv -W'

noglob перед командой обозначает что * не будет пребразован в имена файлов.

ccp *.c *.bak # для каждого файла с расширением .c создается копия с расширением .bak
mmv **/*.jpeg **/*.jpg # переименовывает файлы .jpeg во всех вложенных директориях в .jpg
zmv -v '(* *)' '${1// /_}' # в файлах в которых есть пробелы,заменить на '_' и вывести полученые имена

Маньяки могут почитать комментарии в начале скрипта для всех возможностей.
/usr/share/zsh/**/zmv


Скриптик для переименования кириллических имен файлов в руглиш:

#!/usr/bin/perl

@ARGV || die " Usage:
scriptname файл1 файл2 ...
scriptname \"имя файла\" ...
scriptname имя\\ файла ...
scriptname \*.mp3
scriptname \*";

sub translit
{
my $text = shift;
$text = Text::Iconv->new("","koi-8")->convert($text);
$text =~ y/ абвгдеёзийклмнопрстуфхъыьэ/_abvgdeezijklmnoprstufh'y'e/;
$text =~ y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEEZIJKLMNOPRSTUFH'Y'E/;
my %mchars = ('ж'=>'zh','ц'=>'tz','ч'=>'ch','ш'=>'sh','щ'=>'sch','ю'=>'ju','я'=>'ja',
'Ж'=>'ZH','Ц'=>'TZ','Ч'=>'CH','Ш'=>'SH','Щ'=>'SCH','Ю'=>'JU','Я'=>'JA');
for my $c (keys %mchars) {
$text =~ s/$c/$mchars{$c}/g;
}
return $text;
}

while (@ARGV)
{
rename($ARGV[0],translit($ARGV[0])) || die "Can't rename $ARGV[0] to translit($ARGV[0]): $!";
shift;
}

вторник, 29 марта 2011 г.

ШПАРГАЛКА ПО SED

ШПАРГАЛКА ПО SED
собранные Эриком Пементом (Eric Pement) версия 5.1
Последняя версия доступна на:
www.student.northpark.edu/pemente/sed/sed1line.txt
www.cornerstonemag.com/sed/sed1line.txt

This file is also available in Portuguese at:
www.lrv.ufsc.br/wmaker/sed_ptBR.html

Теперь и по-русски:
rkorepanov.narod.ru/doc/sed.html


РАЗРЫВЫ ФЙЛА:

# заменяем ПРОБЕЛ на двойной пробел
sed G

# ставим двойной пробел с уже имеющимися в файле пустыми строками. Выходной файл
# должен содержать не более одной пустой строки между строками текста
sed '/^$/d;G'

# Тройной пробел в файле
sed 'G;G'

# отменить двойные пробелы (предполагается, что пронумерованные строки всегда пустые)
sed 'n;d'

ЧИСЛА:

# ставим номер каждой строки файла (левое выравнивание). Использование табуляции (смотри
# особенности применения 't' в конце этого файла) в отличие от пробела сохранит отступ(ы).
sed = filename | sed 'N;s/n/t/'

# ставим номер каждой строки файла (число слева, выравненное по правому краю)
sed = filename | sed 'N; s/^/ /; s/ *(.{6,})n/1 /'

# ставим номер каждой строки файла,но только если строка не пустая
sed '/./=' filename | sed '/./N; s/n/ /'

# считаем количество строк (аналог "wc -l")
sed -n '$='

ПРЕОБРАЗОВАНИЯ И ЗАМЕНА ТЕКСТА:

# В СРЕДЕ UNIX: переводит DOS стандарт перевода строки (CR/LF) в формат Unix
sed 's/.$//' # полагем , что все строки оканчиваются CR/LF
sed 's/^M$//' # в bash/tcsh, нажимем Ctrl-V затем Ctrl-M
sed 's/x0D$//' # для gsed 3.02.80, но выше попроще

# В СРЕДЕ UNIX: преобразовываем символы новой строки Unix (LF) в DOS формат
sed "s/$/`echo -e \r`/" # командная строка в ksh
sed 's/$'"/`echo \r`/" # командная строка в bash
sed "s/$/`echo \r`/" # командная строка в zsh
sed 's/$/r/' # для gsed 3.02.80

# В СРЕДЕ ДОС: преобразуем символы перевода строк Unix (LF) в DOS формат
sed "s/$//" # способ 1
sed -n p # способ 2

# В СРЕДЕ ДОС: преобразуем символы перевода строки ДОС (CR/LF) формат Unix
# этого нельзя сделать DOS версией sed. Используем "tr"
tr -d r outfile # GNU tr версии 1.22 или выше

# удаляем отступы (пробелы,табуляции) с начала каждой строки
# выравниваем текст полностью по левому краю
sed 's/^[ t]*//' # смотри проблемы с 't' в конце файла

# удалить замыкающие пробелы, табуляции с конца каждой строки
sed 's/[ t]*$//' # смотри проблемы с 't' в конце файла

# удаляем отступы, пробелы, табуляции и с конца , и с начала строки
sed 's/^[ t]*//;s/[ t]*$//'

# вставляем 5 пробелов в начале каждой строки (отступ для строки)
sed 's/^/ /'

# выравниваем весь текст справа по ширине колонки 79 символов
sed -e :a -e 's/^.{1,78}$/ &/;ta' # 78 плюс 1 пробел

# центрируем весь текст посредине при ширине колонки 79 символов.В первом способе
# пробелы в начале строки нужны, а пробелы в конце строки дополняются до конца строки.
# Второй способ, пробелы в начале строки отбрасываются в центр строки, и нет
# завершающих пробелов до конца строки.
sed -e :a -e 's/^.{1,77}$/ & /;ta' # Способ 1
sed -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/( *)1/1/' # Способ 2

# подстановка (найти и заменить) "foo" на "bar" в каждой строке
sed 's/foo/bar/' # заменяет только первое вхождение в строке
sed 's/foo/bar/4' # заменяет только 4 вхождение в строке
sed 's/foo/bar/g' # заменяет ВСЕ вхождения в строке
sed 's/(.*)foo(.*foo)/1bar2/' # заменяет друг за другом
sed 's/(.*)foo/1bar/' # заменяет только завершающее слово

# ЗАМЕНЯЕТ "foo" на "bar" ТОЛЬКО для строк ,содержащих "baz"
sed '/baz/s/foo/bar/g'

# подставляет "foo" на "bar" КРОМЕ строк, содержащих "baz"
sed '/baz/!s/foo/bar/g'

# меняет "scarlet" или "ruby" или "puce" на "red"
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # большинство sedов
gsed 's/scarlet|ruby|puce/red/g' # только GNU sed

# обратный порядок строк (эмулирует "tac")
# баг/фича в HHsed v1.5 - пустые строки удаляются
sed '1!G;h;$!d' # способ 1
sed -n '1!G;h;$p' # способ 2

# обратный порядок символов в строке (походит на "rev")
sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

# соединяет строки друг с дружкой (как "paste")
sed '$!N;s/n/ /'

# если строка оканчивается обратным слэшем, добавляем последующую строку к ней
sed -e :a -e '/\$/N; s/\n//; ta'

# если строка начинается с знака равно , добавляем ее к предыдущей строке
# и заменяем "=" на один пробел
sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

# добавляем запятые к числовым строкам, меняя "1234567" на "1,234,567"
gsed ':a;s/B[0-9]{3}>/,&/;ta' # GNU sed
sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta' # остальные sed

# добавляем запятые к числам с десятичной точкой и знаком минуса (GNU sed)
gsed ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/12,3/g;ta'

# добавляем пустую строку каждые пять 5 строк (после строк 5, 10, 15, 20, итд.)
gsed '0~5G' # только GNU sed
sed 'n;n;n;n;G;' # другие sedы

ВЫБОРОЧНАЯ ПЕЧАТЬ ОПРЕДЕЛЕННЫХ СТРОК:

# печать первых 10 строк файла ( поведение "head")
sed 10q

# печать первой строки файла (поведение "head -1")
sed q

# печать последних 10 строк файла ( "tail")
sed -e :a -e '$q;N;11,$D;ba'

# печать последних 2 строк файла ( "tail -2")
sed '$!N;$!D'

# печать последней строки файла ( "tail -1")
sed '$!d' # способ 1
sed -n '$p' # способ 2

# печать только строк ,которые совпадают с regexp ( "grep")
sed -n '/regexp/p' # способ 1
sed '/regexp/!d' # способ 2

# печать только строк , НЕ совпадающих с regexp (как "grep -v")
sed -n '/regexp/!p' # способ 1, соответствует вышеприведенному
sed '/regexp/d' # спопоб 2, простейший синтаксис

# печать строки непосредственно перед regexp, но не строки
# содержащей regexp
sed -n '/regexp/{g;1!p;};h'

# печать строки непосредственно после regexp, но не строки
# содержащей regexp
sed -n '/regexp/{n;p;}'

# печать 1 строки контекста перед и после regexp,с номером строки,
# показывающей , сколько regexp встретилось (как в "grep -A1 -B1")
sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h

# grep для AAA и BBB и CCC (в любом порядке)
sed '/AAA/!d; /BBB/!d; /CCC/!d'

# grep для AAA и BBB и CCC (в таком же порядке)
sed '/AAA.*BBB.*CCC/!d'

# grep для AAA или BBB или CCC (как в "egrep")
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # большинство sedов
gsed '/AAA|BBB|CCC/!d' # только для GNU sed

# печать параграфа если тот содержит AAA (пустые строки,разделенные параграфами)
# HHsed v1.5 должен содержать 'G;' после 'x;' в следующих 3 скриптах
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

# печать параграфа если тот содержит AAA и BBB и CCC (в любом порядке)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

# печать параграфа если тот содержит AAA или BBB или CCC
sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
gsed '/./{H;$!d;};x;/AAA|BBB|CCC/b;d' # только для GNU sed

# печать строк длинее 65 символов
sed -n '/^.{65}/p'

# печать строк короче 65 символов
sed -n '/^.{65}/!p' # способ 1, соответствует вышеприведенному
sed '/^.{65}/d' # способ 2, простой синтаксис

# печать секции файла от регулярного выражения до конца файла
sed -n '/regexp/,$p'

# печать секции файла , основанная на номерах строк (включающей строки 8-12 )
sed -n '8,12p' # способ 1
sed '8,12!d' # способ 2

# печать строки 52
sed -n '52p' # способ 1
sed '52!d' # способ 2
sed '52q;d' # способ 3, эффективно для больших файлов

# начиная со строки 3, печать каждой 7-ой строки
gsed -n '3~7p' # для GNU sed
sed -n '3,${p;n;n;n;n;n;n;}' # для других

# печать части файла между двумя регулярными выражениями
sed -n '/Iowa/,/Montana/p' # чувствительно к регистру

ИЗБРАННОЕ УДАЛЕНИЕ ОПРЕДЕЛЕННЫХ СТРОК:

# печать всего файла , КРОМЕ части между двумя регулярными выражениями
sed '/Iowa/,/Montana/d'

# удаление двойных,последовательных строк файла (типа "uniq").
# первая строка из дубирующихся строк сохраняется, остальные убираются
sed '$!N; /^(.*)n1$/!P; D'

# удалить дублирующиеся непоследовательные строки файла. Острожнее с
# переполнением размера буфера, занятой памяти, лучше используйте GNU sed!
sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

# удаление первых 10 строк файла
sed '1,10d'

# удалить последнюю строку файла
sed '$d'

# удалить последние 2 строки файла
sed 'N;$!P;$!D;$d'

# удалить последние 10 строк файла
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # способ 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # способ 2

# удалить каждую 8 строку
gsed '0~8d' # только GNU sed
sed 'n;n;n;n;n;n;n;d;' # другие sedы

# удалить все пустые строки файла (также как и "grep '.' ")
sed '/^$/d' # способ 1
sed '/./!d' # способ 2

# удалить все ПОСЛЕДОВАТЕЛЬНЫЕ строки файла , кроме первых; также
# удаляет все пустые строки с начала и до конца файла (походит на "cat -s")
sed '/./,/^$/!d' # способ 1, разрешает 0 пустых в начале, 1 от EOF
sed '/^$/N;/n$/D' # способ 2, разрешает 1 пустых в начале, 0 от EOF

# удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:
sed '/^$/N;/n$/N;//D'

# удалить все пустые строки с начала файла:
sed '/./,$!d'

# удалить все завершающие файл пустые строки
sed -e :a -e '/^n*$/{$d;N;ba' -e '}' # рaботает на всех sed
sed -e :a -e '/^n*$/N;/n$/ba' # также, кроме gsed 3.02*

# удалить последнюю строку каждого параграфа
sed -n '/^$/{p;h;};/./{x;/./p;}'

СПЕЦИАЛЬНЫЕ ПРИМЕНЕНИЯ:

# удалим спецсимволы (overstrikes) (символ, бэкспейс) из man pages. Команда 'echo'
# может понадобится для ключа -e если у вас ось Unix System V или bash shell.
sed "s/.`echo \b`//g" # двойные кавычки для среды Unix
sed 's/.^H//g' # в bash/tcsh, жмите Ctrl-V затем Ctrl-H
sed 's/.x08//g' # hex (16-ричное) выражение для sed v1.5

# получаем заголовок сообщения формата Usenet/e-mail
sed '/^$/q' # удаляем все после первой пустой строки

# получить тело сообщения формата Usenet/e-mail
sed '1,/^$/d' # удаляем все до первой пустой строки

# получить заголовок темы письма , но без слова "Subject: "
sed '/^Subject: */!d; s///;q'

# получить начальный заголовок письма отправителя
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

# разобрать свойства адреса, выкинуть нафиг e-mail адрес
# с 1-строчного адресного заголовка (смотрите выше)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' # добавить начальный уголок и пробел в каждую строку (квотинг сообщения) sed 's/^/> /'

# удалить начальный уголок и пробел из каждой строки (антиквотинг сообщения)
sed 's/^> //'

# удалить теги HTML (включая многострочные теги)
sed -e :a -e 's/<[^>]*>//g;/zipup.bat
dir /b *.txt | sed "s/^(.*).TXT/pkzip -mo 1 1.TXT/" >>zipup.bat

ТИПОВОЕ ПОЛЬЗОВАНИЕ: Sed получает одну или больше команд по порядку

и применяет их при каждой операции ввода. После этого все команды применяются
к первой строке ввода,затем первая строка выводится и вторая строка ожидает
ввода для обработки , а затем цикл повторяется. Предыдущие примеры предполагают
что ввод производится со стандартного ,например с консоли
обычно это будет ввод трубы, вернее, канала (или контейнера) ;) (piped input). Один из
больших имен файлов добавляется в командную строку если нет ввода со
стандартного устройства ввода , посылаемого на устройство вывода (Экран).
Вот примерчики:

cat filename | sed '10q' # Используются каналы-контейнера
sed '10q' filename # такой же эффект но без кота ;) ("cat")
sed '10q' filename > newfile # перенаправим вывод на диск

Для дополнительных примеров , включая применение команд для ввода
команд с файла на диске , а не только в командной строке, прочитайте "sed &
awk, 2я редакция," от Даля Дугерти( Dale Dougherty) и Арнольда Руббенса
( Arnold Robbins) (O'Reilly,1997; www.ora.com), "Обработка текста в UNIX ,"
Даля Дугерти( Dale Dougherty) и Тима Орэйли (Tim O'Reilly) (Hayden Books, 1987)
или учебники от Майка Арста (Mike Arst) в файле U-SEDIT2.ZIP (нуно поискать).
Чтоб впитать силу sed, нужно понять что такое "Регулярные выражения." Для этого,
прочитайте "Регулярные выражения" от Джефри Фриддла (Jeffrey Friedl)
(O'Reilly, 1997).Читайте ("man") маны , может помочь в Unix ("man
sed", "man regexp", или подсекцию , посвященную регулярным выражениям в "man
ed"), но маны достаточно сложны. Они написаны не для обучения
sed или использованию regexp для чайников, но как как справочник
для использующих программы на практике.

ИСПОЛЬЗОВАНЕ КАВЫЧЕК: Представленные примеры используют одинарные кавычки ('...')
в отличие от двойных ("...") для ограничения редактируемых команд еще
во времена использования ed на Unix. Одинарные кавычки предохраняют
оболочку Unix от интерпретации знака бакса ($) и обратнокавычек
(`...`),которые использует шелл , если они окружены двойными кавычками.
Пользователям "csh" и аналогам также нужно экранировать
знак восклицания (!) бэкслэшем (например, !) для правильной работы
вышепредставленных примеров,даже внутри одинарных кавычек.
Версии sed для DOS всегда требуют двойные кавычки ("...") а не одинарные
для ограничения редактируемых комманд.

ИСПОЛЬЗОВАНИЕ 't' В СКРИПТАХ SED: Для чистоты документации мы использовали
выражение 't' для вывода символа табуляции (0x09) в скриптах.
Однако, меногие версии sed не распознают 't' , и для этого,когда вы пишете
эти скрипты в командной строке ,жмите вместо этого кнопочку
TAB. 't' поддеривается регулярными выражениями в awk, perl, и HHsed, sedmod,
и GNU sed v3.02.80.

ВЕРСИИ SED: Версии sed различны, поэтому возможны некотрые различия синтаксиса.
В особых случаях, может не быть поддержки меток (:name) или ветвящихся конструкций
(b,t) в пределах редактируемых команд, кроме окончания этих команд.
Мы использовали синтаксис который будет использоваться для большинства
версий sed , тогда как популярные версии сед под лицензией
GNU разрешают более последовательный синтаксис. Когда читатель видит
длиннющую команду как эта:

sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

то хорошо бы знать, что версии GNU sed позволяют переписать это:

sed '/AAA/b;/BBB/b;/CCC/b;d' # или иначе
sed '/AAA|BBB|CCC/b;d'

В дополнение, запомните что многие версии sed понимают команды
как "/one/ s/RE1/RE2/", и НЕ разрешают "/one/! s/RE1/RE2/", в которых
содержится пробел перед 's'. Остерегайтесь пробелов при вводе команд.

ОПТИМИЗАЦИЯ СКОРОСТИ: Если скорость выполнения хочется увеличить (для
больших входных файлов или слабоватого "железа", замена будет
работатать быстрее с выражением поиска находящимся перед
инструкцией вида "s/.../.../" Например:

sed 's/foo/bar/g' filename # стандартная команда замены
sed '/foo/ s/foo/bar/g' filename # это работает быстрее
sed '/foo/ s//bar/g' filename # укороченый синтаксис sed

В строке выборки или удаления, которая используется вами для вывода строк
выбранной части файла, команда выхода (q) в скрипте намного уменьшает время
обработки для больших файлов. Вот пример:

sed -n '45,50p' filename # печать строки 45-50 позиции файла
sed -n '51q;45,50p' filename # по-другому, но работает шустрее

понедельник, 28 марта 2011 г.

Поиск файлов в Linux или Изучаем команду find.

Несомненно, при работе с Linux, иногда возникает необходимость поиска файлов с определенными характеристиками. Этими характеристиками могут быть размер или тип файла, права доступа и другое.

Наличие в Linux команды find, во многом помогает справиться с поиском файлов по различным критериям.

Сегодня мы разберем поиск файлов в Linux и приведем основные опции команды find, которые вы сможете применить в своей работе.

Формат команды find:

find путь -опции

где путь – это каталог, в котором произвести поиск. В качестве пути можно указывать следующие значения:

. – поиск в текущем каталоге;

/ – поиск от корневого каталога;

~ – поиск в домашнем каталоге.

Что до опций, то тут гораздо бОльший список, с которым крайне необходимо внимательно ознакомиться (это в будущем очень поможет!). Итак, основные опции команды find:

-name - поиск файлов по имени, используя приведенный шаблон;

-user - поиск файлов, принадлежащих указанному пользователю;

-group - поиск файлов, принадлежащих указанной группе;

-perm - поиск файлов с указанным режимом доступа;

-type - поиск файлов определенного типа. Типов тоже достаточно:

b – специальный блочный файл;
d – каталог;
c – специальный символьный файл;
f – обычный файл;
l – символическая ссылка;
p – именованный канал;
s – сокет.

-size n - поиск файлов с размером n единиц;

-mtime -n +n – поиск файлов, содержание которых изменялось менее чем (-) или более чем (+) дней назад.

Рассмотрим некоторые примеры применения команды find:

Наиболее часто применяемой опцией является опция -name, которая производит поиск файлов по имени.

Примеры с опцией -name:

$ find /mnt/usb -name “*.mp3″ -print

произведет поиск всех файлов (об этом свидетельствует знак *), имеющих расширение .mp3 на USB-устройстве, смонтированном в каталог /mnt/usb.

команда

$ find ~ -name “test*” -print

выведет на экран список файлов домашнего каталога, начинающихся на test.

Если вам надо найти файлы, начинающиеся с определенных букв (к примеру, от a до j), то здесь будет удобно применить регулярные выражения, которые крайне удобны в работе:

$ find / -name “[a-j]*” -print

Вышеуказанная команда позволит отыскать все файлы в системе, начинающиеся с букв от a до j.

Поиск файлов с определенными режимами доступа

Если потребуется найти файлы, имеющие определенные режимы доступа, вам поможет опция -perm, которая легко в этом поможет.

К примеру, выполним поиск файлов с режимом доступа 775 (владелец и группа имеют полные права и ограничение на запись имеют остальные пользователи), находящихся в текущем каталоге :

$ find . -perm 775 -print

Выполняя поиск при помощи find с опцией -perm можно использовать и другой способ – можно перед значением режима поставить дефис и тогда будет произведен поиск файлов, для которых установлены все указанные биты разрешений. Причем, остальные биты в этом случае игнорируются.

К примеру, найдем файлы, к которым пользователи группы имеют полный доступ:

$ find . -perm -070 -print

Вместо знака дефиса, можно указать знак плюса. В этом случае будет произведен поиск файлов, у которых установлен хотя бы один из указанных битов разрешений. Остальные биты при этом игнорируются.

Поиск файлов определенного пользователя или группы

Поиск файлов какого-либо определенного пользователя крайне прост в своей реализации. Для этого достаточно выполнить команду:

$ find / -user admin -print

Вышеуказанная команда произведет поиск файлов в системе, принадлежащих пользователю admin.

Для того, чтобы найти файлы, принадлежащие определенной группе (к примеру managers), выполним команду:

$ find / -group managers -print

Для поиска файлов несуществующих пользователей или групп можно воспользоваться опциями -nouser и -nogroup:

$ find / -nouser -print

и

$ find / -nogroup -print

Поиск файлов определенного типа

Одной из удобных возможностей команды find, является возможность поиска файлов определенного типа. Рассмотрим варианты использования опции -type:

Поиск символических ссылок в каталоге /etc:

$ find /etc -type l -print

Вывод на экран списка каталогов, присутствующих в каталоге /mnt/raid

$ find /mnt/raid -type d -print

Поиск файлов определенного размера

Опция -size позволяет произвести поиск файлов определенного размера и имеет следующий вид при выполнении:

$ find . -size 2000k -print

Вышеуказанная команда отыщет и отобразит на экране файлы размером 2 мегабайта, находящийся в текущем каталоге. Если, к примеру, необходимо найти файлы размером менее 500 килобайт, то вид команды будет следующий:

$ find . -size -500k -print

Если нужно найти файлы размером более 600 мегабайт, то применим команду:

$ find / -size +600M -print

Поиск файлов с использованием опции -mtime

Опция -mtime позволит вам найти файлы, изменявшиеся в какой-то срок времени.

К примеру, у нас встала задача поиска файлов, находящихся в каталоге /mnt/raid/upload , и изменявшихся за последние 5 дней. В этом нам поможет команда:

$ find /mnt/raid/upload -mtime +5 -print

Если нам необходимо обратное, к примеру, отыскать файлы, которые не изменялись неделю, применим команду:

$ find /mnt/raid/upload -7 -print

Команда find является крайне удобным инструментом для поиска файлов и может использоваться также и для поиска файлов на дисках NFS (сетевых файловых системах), но в этом случае необходимо учесть, что времени на поиск чего-либо на NFS уйдет гораздо больше, чем на локальных дисках.

В этой статье мы рассмотрели лишь основные опции команды find, которые помогут вам в вашей работе. Используйте то, что удобно и не переживайте по пустякам!

Добавление и удаление на ходу SATA/SCSI устройств

Современный Linux (2.6+) может обнаруживать новоподключенные устройства (на шинах, которые поддерживают hotplug). Их можно, так же отключать, предварительно отмонтировав файловые системы и сделав sync. Среди hotplug шин не только USB, но и SATA, SCSI и SAS (в теории, это же применимо и к PATA, но там много глупых контроллеров, которые не умеют адекватно реагировать на исчезновение устройства).

Отключать их лучше не дёргая на ходу физическое устройство, а сказав ядру полностью забыть про про него (гарантируя тем самым, что никаких операций ввода-вывода с устройством производиться не будет, даже если вспохватившийся кеш). Кроме того, иногда нужно выполнять эмуляцию процедуры plug-unplug без физического дёргания питания/шины данных (что не очень хорошо для железа). Самая типичная ситуация — это отладка скриптов udev.

Удаление устройства

echo 1 >/sys/block/sdX/device/delete


(x — буква устройства, sda, sdb, etc).

Эта команда удаляет указанное устройство. Заметим, это низкоуровневая команда, которая не проверяет кеш и статус примонтированности, так что лучше сначала сказать umount & sync.

К сожалению, я не знаю метода совместить выключение шпинделя диска с его удалением с точки зрения ядра. Шпиндель можно отключить командой scsi-spin, однако, при попытке удалить устройство, оно будет раскручено заново и удалено. А у удалённого устройства уже нельзя ничего останавливать (нет устройства). Так что эта часть проблемы пока не решена.

Добавление устройства

Мы не можем «добавить» устройство, мы можем отдать контроллеру команду «перечитать» список устройств, подключенных к тому или иному порту. Если там найдётся что-то интересное, ядру дадут знать.

echo "- - -" >/sys/class/scsi_host/hostX/scan


X — номер шины, совпадает с номером SATA порта на материнской плате. Если не знаете, можете смело делать для всех хостов по очереди, ничего, кроме небольшого лага в дисковых операциях, незаметного для софта и файловой системы, это не даст.

Обратите внимание, host'ы нумеруются с 0, а не с 1. (а в dmesg ata устройства нумеруются с 1).

Так же осуществляется и сканирование USB-SATA переходников (usb-боксов и внешних винчестеров — они просто фигурируют как ещё один scsi_host).

Если мы говорим про SCSI, то вместо "- — -" можно указать точный номер устройства/шины/LUN'а сканируемого устройства (например, «200 1 2»). SATA, в силу архитектурных особенностей (один target для одного initiator) принимает туда только «0 0 0».

Ещё об удалении… Если вы не знаете буквы устройства, но знаете его физическое место подключения, то удалять можно «прямым текстом», записью «1» в "/sys/bus/scsi/devices/targetX:0:0/X:0:0:0/delete".