Отправка письма из 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

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

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

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

watch me

Иногда бывает, что у вас пропал интернет и соединение к консоли сервера оборвалось, а когда вы залогиниваетесь снова, то обнаруживаете, что консоль не умерла, а в ней еще запущен какой-то процесс. Убивать ту консоль очень не хочется, а запустить команду в скрине (screen) вы забыли. Что делать?

watch vs screen

screen – очень удобная утилита. Если нужно надолго запустить команду и/или отсоедниться от консоли не закрывая, нужно зайти в screen, запустить команду, выйти из скрина и можно даже уйти с сервера. Когда вернетесь, в скрине будет выполняться (или уже выполнена) ваша команда, например:

screen
find / -name a1*.txt
[CTRL-A-D]

# screen detached

# logout/login

screen -r

# search results

[CTRL-D]

# screen closed

Для подробностей, читайте man screen. Если вы до сих пор не знали эту утилиту, уверен, вы ее полюбите =)

Но как может помочь watch с "умершей" консолью?

Командой watch -W можно подключиться к консоли в режиме управления, тогда можно не только наблюдать, но и полноценно управлять ею, словно это ваш сеанс.

watch ttyp1

# or

watch p1

[CTRL-G]

# watch detached

watch -W p1

# "rw mode"

Может кому-то пригодится. =)

N.B.

ядро должно быть собрано с устройством snp:

device snp

иначе при запуске команды watch вы получите сообщение:

watch: snp module not available: No such file or directory
watch: open /dev/snp0: No such file or directory

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

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

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

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}'

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

csh in single mode on FreeBSD

Если вы любите оболочку csh и редактор ee (Easy Editor), возможно вы сталкивались со следующей проблемой. При загрузке в однопользовательском режиме (4 – single mode), требуется ввести путь к оболочке, по умолчанию это /bin/sh. Если вы вводите /bin/csh – он ругается на невозможность открыть /etc/termcap. Когда вы пытаетесь редактировать в редакторе ee какой-нибудь файл, текст на консоли выглядит как сплошное месиво.

Красная таблетка

Лечится это очень легко. Достаточно указать правильный тип терминала:

setenv TERM cons25

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


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

Simon says? Cow says!

Говорит и показывает корова

cowsay – бесполезный 🙂 перловый скрипт, который выводит заранее напечатанный текст в виде ASCII-картинки говорящей или думающей коровы. И не только коровы, а любого персонажа из заготовленного набора.

Оригинальная корова:

~> set M="Hello, world\!"
~> cowsay $M
 _______________
< Hello, world! >
 ---------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

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


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

Оповещение о логине в ssh

В блоге itblog.suпопалась заметка об оповещении по почте о входе в консоль.

echo ‘ALERT — Root Shell Access on:’ `date` `who` | mail -s «Alert: Root Access from `who | awk ‘{print $6}’`» user@dom.dom

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

echo «ALERT — Root Shell Access on: `date; echo; who | bwtail -1`» | mail -s «Root From: `who | bwtail -1`» root@domain.com

who может вывалить пакаван данных о логинах, но они мне не нужны, т.к. замысел в оповещении о последнем логине, поэтому я отрезаю одну строку с помощью tail.

Что такое bwtail? =) Это черно-белая версия tail (по сути просто хардлинк на tail), который у меня сделан цветным:

# from .cshrc
alias tail      /root/bin/coloredtail.sh

Вот так:

~> cat /root/bin/coloredtail.sh
#!/bin/sh

/usr/bin/tail $@ | /usr/local/bin/colorize


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

Настраиваемое приветствие в консоли

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

Last login: Mon Aug 17 15:02:25 2009 from ip.com
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California.  All rights reserved.

FreeBSD x.y-RELEASE-pZ (KERNEL) #A: Thu Apr 17 11:21:34 EDT 2008

Welcome to FreeBSD!
For information on the web, visit us at www.pcbsd.org
«man tuning» gives some tips how to tune performance of your FreeBSD system.
— David Scheidt <dscheidt@tumbolia.com>

Т.е., информацию Last login, копирайт, содержимое /etc/motd (версию системы) и какой-нибудь fortune. Скучно? Скучно!

Кастрация Кастомизация

“Проснись, Нео!”

Wake up, Neo!

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


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