Отправка письма из 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
Плюсы: письмо понимается большинством почтовых клиентов
Читать остальную часть заметки »Теги: attach, attachement, FreeBSD, linux, mail, shell, ssh, unix, вложение, консоль
LF in ee and mcedit
Если внезапно при старте какой-то софтины в консоль валится такое:
readlink: illegal option -- f usage: readlink [-n] [file ...] Could not locate binary file, aborting
значит кто-то добрый своими ручками правил /etc/rc.conf в редакторе mcedit и тот в свою очередь не поставил заветный магический символ LF в конце последней строки.
Палится такой фейспалм следующим образом:
20:29 [ME] ~ ~> cat ee-dited.txt Line 1 Line 2 Last Line 20:29 [ME] ~ ~> cat mcedit-edited.txt Line 1 Line 2 Last Line20:29 [ME] ~ ~> 20:29 [ME] ~ ~>
Строка приглашения выводится сразу после последней строчки файла, а не с новой строки.
Косяк этот зачастую обнаружить очень не просто, особенно, если человек с таким не сталкивался. Если mcedit’ом отредактировать крон, например:
env EDITOR=mcedit crontab -e
последнее крон-задание выполняться не будет.
Редактор ee (EasyEdit) таким не страдает, поэтому я отдаю предпочтение именно ему.
P.S.
На некоторых Linux есть редактор nano – он чем-то схож с ee по своей простоте, так вот он по умолчанию ставит переносы строк, которые не вмещаются на экране (на консоли). Чтобы он не страдал такой фигней, его нужно запускать с ключем –w:
nano -w
Теги: easy editor, ee, FreeBSD, LF, linefeed, mc, mcedit, Midnight Commander, nano, newline, POSIX
Sleeping awake
Решил один из компьютеров отправлять на ночь в спячку ака Stand by. А потом пришла еще одна хорошая идея. Когда-то давно настраивал BIOS чтобы компьютер просыпался только от кнопки питания т.к. пару раз ночью он просыпался от мышки или клавиатуры. Теперь, чтобы включить комп, нужно идти на балкон и тыкать кнопку питания. А мне, конечно же, лень 🙂
WOL – Wake-on-LAN
Включил на сетевой карте wake-on-LAN и поставил флажок “будить только административным пакетом”, иначе он просыпался от сетевой активности, что мне не нужно. А будить решил с гостевой FreeBSD, которая на второй машине крутится в VMWare. Для гостевой машины я настроил “bridged” доступ в сеть, на роутере присвоил личный IP-адрес и она “напрямую” может видеть адрес первого компа по внутренней сети.
Софтину выбрал wol:
~> cd /usr/ports/net/wol ~> make install clean ~> rehash ~> cd
Усыпил 🙂 первый компьютер и… понял, что нужно посмотреть какой там MAC-адрес (командой arp –a). Разбудил, попинговал с гостевой машины, усыпил снова, отправил магический пакет:
~> wol --verbose 00:11:11:11:11:11
…и обломался. Машинка не проснулась =/ Посмотрел man, попробовал указать IP-адрес – и чудо произошло!
~> wol --ipaddr=192.168.7.100 --verbose 00:11:11:11:11:11
Однако позже выяснился один момент, если в таблице маршрутизации нет адреса первого компьютера, разбудить его нельзя. Добавил:
~> arp -s 192.168.7.100 00:11:11:11:11:11 ~> netstat -rn | grep 192.168.7.100 192.168.7.100 00:11:11:11:11:11 UHLS 1 576 em0
Пробую снова:
~> wol --ipaddr=192.168.7.100 --verbose 00:11:11:11:11:11 Waking up 00:11:11:11:11:11 with 192.168.7.100:40000...
Работает, комп проснулся.
Теги: arp, awake, FreeBSD, IP, Mac, magic, mode, net, network, packet, Sleep, wake-on-lan, Windows, WOL
kernel: calcru: runtime went backwards
После перевода виртуалки на VMWare 8 появился баг, на консоль стали валиться сообщения вида:
kernel: calcru: runtime went backwards from 89 usec to 85 usec for pid 516 (moused)
Варианты лечения:
прописать:
kern.hz=100
в файл
/boot/loader.conf
и перезагрузиться и/или выполнить:
sysctl kern.timecounter.hardware
если у вас таймер TSC (такой был у меня), поставить:
sysctl kern.timecounter.hardware=i8254
и добавить строку
kern.timecounter.hardware=i8254
в файл
/etc/sysctl.conf
Пока таких сообщений не замечено, полет нормальный.
Теги: boot, calcru, clock, FreeBSD, sysctl, time, счетчик, таймер
VMWare 8 + real HDD disk
При попытке подключить физический диск к виртуалке VMWare 8 (VMWare 8.0.0 build-471780), выдавались ошибки вида:
vmx| W110: DISKLIB-FLAT : Open: Failed to dismount physical drive 2. Perhaps its volumes have open files on them?
vmx| I120: DISKLIB-FLAT : "\\.\PhysicalDrive2" : failed to open (73): .
vmx| I120: DISKLIB-LINK : "D:\VM\backup-FreeBSD72\FreeBSD72.vmdk" : failed to open (The physical disk is already in use).
Лечится довольно просто: на файл *.vmdk (в моем случае – FreeBSD72.vmdk) добавил пользователя __vmware__ с полным доступом (Full Control, Modify, Read & Execute, Read, Write). По умолчанию там были только Users, SYSTEM и Administrators.
Теги: access, file, FreeBSD, HDD, rights, virtualisation, vmdk, vmware, Windows