Windows Subsystem for Linux

neofetch

Если вы не в курсе, что такое Windows Subsystem for Linux или WSL (или WSL 2), то воспользуйтесь Гуглом. Вкратце, это Linux, работающий внутри OS Windows. Устанавливать эмулятор, вроде Virtual Box или VMWare не нужно, несколько готовых сборок можно установить из магазина Microsoft как обычные  программы. После запуска у вас будет консоль, внешне, естественно, похожая на консоль командной строки, но почти такая же удобная и гибкая, как PuTTY или другой терминал.

Мне эта штука понравилась тем, что у пользователя есть доступ ко всем дискам и разделам операционной системы и можно писать практически любые скрипты для задач по работе с файлами. Поиск файлов, поиск текста внутри файлов, поиск и обработка файлов, чтение файлов в реальном времени (tail –F) и т.д. производится так же, как на обычном Линуксе. Огромное количество удобных утилит доступны практически просто из коробки.

Сегодня мне понадобилось конвертировать несколько flac-файлов в mp3. Я набросал простой скрипт, несколько минут – и все готово. Не нужно устанавливать программы, да еще и зачастую платные, достаточно установить одну или несколько консольных утилит и запустить скрипт.

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

sudo apt install ffmpeg -y

Затем нужно перейти в каталог с файлами, которые нужно конвертировать (cd /mnt/c/folder, где “c” – буква  раздела, а folder – каталог с музыкой), создать файл (выполнить nano re.sh) и вставить туда скрипт (правой клавишей, как в обычной командной строке):

#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

for f in *.flac
do
 ffmpeg -i "$f" -ab 320k -map_metadata 0 -id3v2_version 3 "$f".mp3
done

CTRL+X Y ENTER. Всё, файл сохранен. Запускаем командой sh re.sh и смотрим за процессом выполнения.

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

find . -name "*.*htm*" -exec grep -i "iframe" {} \; -print

Точка – это текущий каталог, можно указать путь к каталогу. Данный однострочник найдет в текущем каталоге все файлы с расширением, содержащим htm, т.е. .html, .htm, .shtml и т.д. и если внутри файла содержится текст iframe – выведется имя файла и строка в файле с этим словом.

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


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

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


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