Единорог, какаяющий радужками

unicornlike

Хотите радугу в консоли? Нет ничего проще:

~> gem install lolcat
~> cd /usr/ports/*/cowsay && make install clean
~> rehash
~> fortune | cowsay -f turtle | lolcat

Конечно, если у вас вдруг не установлен Ruby и gem, то придется чуть дольше повозиться.

Цитата о шоколаде как раз в тему. Розетка отменила мои заказы, сделал заказы в Соколе, сэкономил гривен 40, купил себе шоколадку Classic Wheels =) Мелочь, а приятно))


Теги: , , , , , , , , , ,

Colored less, grep and ls

В одной старой заметке я рассказывал, как раскрасить вывод ls в tcsh (csh). Все работает хорошо до тех пор, пока вы не перенаправите вывод команды ls через пайп | другой команде, например less.

Раскрашенный вывод содержит специальные Escape-последовательности, которые обозначают начало и конец блока текста, который нужно, например, выделить, раскрасить или подчеркнуть. Если передать такой текст команде, которая его не понимает (или не отображает без специального ключа), она выведет на экран или в файл все эти добавленные символы.

Раскрашиваем less и more (colored less and more)

less и more поддерживают отображение раскрашенного вывода, но чтобы они его отображали корректно, т.е. в раскрашенном виде, нужен ключ –R:

<command> | less -R
<command | more -R

Можно добавить в файл настроек .cshrc:

alias less less -R

less (он же more*) еще умеет отображать man в раскрашенном виде (по умолчанию, там есть раскрашивание). man использует more для отображения вывода:

     -P pager  Specify which pager to use.  By default, man uses ``more -s''.
               This option overrides the PAGER environment variable.

* убедитесь сами, less и more – один и тот же файл:

ls -laio /usr/bin/less /usr/bin/more

Для того, чтобы man был раскрашен в цвета, добавьте в .cshrc строки:

Читать остальную часть заметки »

Теги: , , , , , , , , , , , , , , , , , , , , ,

Отправка письма из shell

Как отправить письмо с вложением из оболочки UNIX? Есть несколько вариантов, я рассмотрю самые простые, – системными средствами и сторонним ПО.

mail + uuencode

Почти наверняка самый рабочий способ на любой системе.

~> ( echo "body text message" ; echo ; cat file.txt | uuencode file.txt ) | mail -s 'Subject' to@domain.tld

в почтовый ящик придет сообщение в виде:

To: to@domain.tld
Subject: Subject
Message-Id: <20111205165235.0DB932ECAC@dom.tld>
Date: Mon,  5 Dec 2011 16:52:35 +0000 (UTC)
From: sender@domain.tld (sender)

body text message

begin 644 file.txt
M+W-B:6XO;61M9G,@+7,@-#`Y-DT@+6D@,3`R-"`M=R!M>7-Q;#IM>7-Q;"`M
M<"`W-S<@;60P("]M>7-Q;%]T;7`*(R,M+2TM+2TC(PT*26YC;W)R96-T(&EN
...
M;F1E>"YP:'`[(&-D("T[(&QS("UL82`D:2]I;F1E>"YP:'`[(&1O;F4*(R,M
)+2TM+2TC(PH*
`
end

Плюсы: универсальный способ, не требует установки дополнительного ПО

Минусы: не все почтовые клиенты понимают этот формат и письмо возможно придется раскодировывать. Если вы пользуетесь почтой Гугла (GMail) – вам повезло, такой формат он понимает и файл можно будет скачать как обычный прикрепленный файл.

mail + base64
~> cat file.txt | base64 | mail -s 'Subject' to@dom.tld
~> cat file.txt | uuencode -m file.txt | mail -s 'Subj' to@dom.tld

Плюсы: файл в письме отправится

Минусы: письмо наверняка будет не понято почтовым клиентом и вложение будет просто выведено в виде текста, который нужно дополнительно распаковывать. GMail такие письма не понимает.

sendmail
~> ( cat header ; cat ssh.txt | base64 ) | /usr/sbin/sendmail -t
~> ( cat header ; cat ssh.txt | uuencode -m ssh.txt ) | /usr/sbin/sendmail -t
~>
~> ( cat header ; cat ssh.txt | uuencode ssh.txt ) | /usr/sbin/sendmail -t
# это не правильно, но GMail понимает и такой формат

В файл header предварительно внесены необходимые заголовки:

~> cat header
Subject: With attachment
From: me@dom.tld
To: to@domain.tld
Content-Type: text/plain; charset=UTF-8
Content-Disposition: attachment; filename="file.txt"
Content-Transfer-Encoding: base64

Здесь мы явно указываем кодировку файла (UTF-8), имя файла, которое будет показываться в письме (может не совпадать с именем файла, который мы кодируем) и метод кодирования (base64). В третьем примере файл будет закодирован в uuencode, это тоже может вызвать сложности у почтовых клиентов. uuencode –m, в отличие от base64, помечает начало и конец закодированных данных, так же, как и просто uuencode. В первом случае начало данных будет помечено строкой:

begin-base64 644 file.txt

конец:

====

во втором случае:

begin 644 file.txt

конец:

end

Плюсы: письмо понимается большинством почтовых клиентов

Читать остальную часть заметки »

Теги: , , , , , , , , ,

rsync – памятка

%> rsync -av user@IP:/remote/path/ /local/path2
# так скопируются файлы из /remote/path/ в /local/path2
%> rsync -av user@IP:/remote/path /local/path2
# а так - в /local/path2 будет каталог path

Ключи:

  • -a – "архивный режим" – сохранение атрибутов файлов (владелец, права и т.п.)
  • -z – компрессия (сжатие)
  • -v – вывод подробностей
  • –progress – показывать сколько осталось времени на передачу файла
  • -H – сохранить хардлинки
  • –exclude – исключить файлы (не передаваать), например, исключить каталог и файлы определенного типа:
    –exclude ‘- cgi-bin/*’ –exclude ‘*.tgz’

Теги: , , , , ,

Поиск в файлах

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

find . -name "*.*htm*" -exec grep -i "iframe" {} \; -print
find . -name "*.*htm*" -exec grep -i "iframe" '{}' \; -print
find /home -name '*.htm*' -exec grep -H 'fromCharCode' \{\} \;

Так можно удалить из очереди postfix письма с определенным текстом (спам-рассылку, например):

find /var/spool/postfix/deferred/ -name "*" -exec grep -i "SOMESPAM" {} \; |\
awk -F / '{print $7}' | awk '{print $1}' | postsuper -d -

А как найти файлы, в которых определенная строка не встречается?

Можно так:

find . -name "*.html" -print0 | xargs -0 grep -c "string" | grep ":0" | cut -d : -f 1

где “string” – строка, которой в файлах нет.

cut просто отрезает имя файла от количества нулевых вхождений подстроки “string”, если кому-то по душе awk, используйте в пайпе:

awk -F : '{print $1}'

Теги: , , , , , , , , ,

Интерактивное наблюдение

Все *nix’оиды знают команду top и аналоги – htop, mytop и т.д.  Аналогичны эти программы в своем принципе работы – постоянном (интерактивном) обновлении информации на экране.

А если нужно постоянно выводить на экран результат работы какой-то команлы или команд? Да еще и в удобном виде – с обновлением (очисткой) экрана. Как быть?

Способ #1

watch (для FreeBSD его родственник – gnu-watch)

Команда (gnu-)watch позволяет многократно запускать заданную команду или команды, выводя результат на экран. Примеры:

gnu-watch --differences=cumulative ls –la

Данная команда позволяет следить за файлами, при этом у измененных файлов будет подсвечен размер. Если не указывать cumulative, то изменение на экране будет подсвечено только один раз, при первом обнаруженном изменении во время обновления.
Я люблю наблюдать, как идет процесс сборки рейда:

gnu-watch -t gmirror status
Способ #2

работает везде при наличии bash

bash -c 'while true; do echo '^L'; gmirror status; echo; date; sleep 2; done'
# или так
bash -c 'while :; do clear; gmirror status; echo; date; sleep 2; done'

^L – в данном случае это !один! символ “Control-L”. Если вы просто нажмете эту комбинацию, то ничего не произойдет, точнее – вы очистите экран. Чтобы напечатался символ нужно прибегнуть к хитрости:

CTRL+V+L – о таком способе ввода непечатаемых символов я уже упоминал в этой статье.

Может пригодится ;)


Теги: , , , , , , , ,

Make and Enter

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

bash:

echo 'mkcd() { mkdir -p "$@" && cd "$_"; }' >> ~/.bashrc

csh (tcsh):

alias mkcd 'mkdir -p \!*; cd \!*'
(добавьте эту же строку в .cshrc)

ksh

alias mkcd='_(){ mkdir -p $1; cd $1; }; _'

Теперь пользуйтесь:

mkcd foo/bar

Enjoy!


Теги: , , , , , , , ,