Различные UNIX-утилиты: ssh-инструменты, генерация md5, subshell.c-ошибки на консоли, ntpdate – синхронизация времени


Здесь я собрал небольшую коллекцию информационных и вспомогательных утилит и различных приёмов, которые бывают очень полезны, но пользуешься ими редко и названия и ключи забываются.

(Честно говоря, информация стала уже слишком разношёрстна, надо бы её уже разделить на несколько страниц, но всё руки не дойдут.)

Преобразование видео

У меня есть два устройства с экранами 320×240 и возможностью показывать видео, кодированное в H.264: телефон Nokia N78 и плеер Sony Walkman NWZ-A726. Поэтому пришлось мне всесторонне изучить вопрос конвертирования видео.

Лучшим конвертером оказался (на мой взгляд) mencoder, чуть похуже — ffmpeg, он уже справляется не со всеми форматами. Остальные ещё слабее.

Конвертируем любое видео в H.264 старым mencoder'ом:

mencoder -ofps 25 -of lavf -lavfopts \
format=mp4:i_certify_that_my_video_stream_does_not_use_b_frames \
-af lavcresample=48000 -srate 48000 -vf-add harddup \
-vf-add scale=320:240 -oac lavc -ovc lavc -lavcopts \
aglobal=1:vglobal=1:acodec=aac:abitrate=128:vcodec=mpeg4:\
vbitrate=250:autoaspect:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:\
predia=2:dia=2:precmp=2:cmp=2:subcmp=2:preme=2:turbo \
-quiet -info name="Name_to_display" \
-o output.mp4 input.avi

Более новые реинконрации mencoder требуют небольшого изменения командной строки:

mencoder -ofps 25 -of lavf -lavfopts \
format=mp4 \
-af lavcresample=48000 -srate 48000 -vf-add harddup \
-vf-add scale=320:240 -oac lavc -ovc lavc -lavcopts \
aglobal=1:vglobal=1:acodec=libfaac:abitrate=128:vcodec=mpeg4:\
vbitrate=250:autoaspect:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:\
predia=2:dia=2:precmp=2:cmp=2:subcmp=2:preme=2:turbo \
-quiet -info name="Name_to_display" \
-o output.mp4 input.avi

Разница в двух опциях: -lavfopts и -lavcopts.

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

-af lavcresample=48000,volnorm=2:1

Если вы хотите порезать фильм на части, то лучше сперва нормализовать звук, а потом резать. Иначе нормализация может сработать не правильно в началах фрагментов. Подробнее о параметрах volnorm можно прочитать в документации. 2:1 означает: повысить громкость до 100% интеллектуальным методом. Есть и другие возможности.

Чтобы сконвертировать DVD-диск, полезно знать команду

mplayer -dumpstream -dumpfile rip.mpg dvd://1

Вместо 1 можно указать другой номер части, если на DVD несколько видео-треков.

Чтобы разрезать 100-минутный видеоролик на две части:

mencoder -ovc copy -oac copy -endpos 0:50:00 -o part1.avi video.avi
mencoder -ovc copy -oac copy -ss 0:50:00 -o part2.avi video.avi

Резать на много небольших частей можно скриптом (доработать по вкусу):

#!/bin/sh

for i in 00:00 00:20 00:40 01:00 01:20 01:40
do
p=`echo $i | sed 's/:/_/g'`
n="kolobaha_part_$p.avi"
echo $n
mencoder -ovc copy -oac copy -ss $i:00 -endpos 0:20:00 -o $n Kolobaha.avi
done

Ещё бывает, что при конвертировании возникает ошибка вида:

Pos: 593.1s 15799f (11%) 33.58fps Trem: 61min 238mb A-V:0.051 [251:127]
Too many audio packets in the buffer: (4103 in 830561 bytes).
Maybe you are playing a non-interleaved stream/file or the codec failed?
For AVI files, try to force non-interleaved mode with the -ni option.

Простой способ решить эту проблему такой: исходный файл следует разделить и слить назад следующим образом:

## отделяем видео
mencoder -ni -ovc copy -nosound -ofps 25 -o video.wmv 'American Psycho.mkv'
## отделяем аудио
mplayer -ni -ao pcm -aofile audio.wav -vc dummy -vo null 'American Psycho.mkv'
# или на более свежем mplayer
# mplayer -ni -ao pcm:file=audio.wav -vc dummy -vo null 'American Psycho.mkv'
## соединяем всё снова
mencoder -idx -audiofile audio.wav -ovc lavc -lavcopts vcodec=mpeg4 \
-ofps 25 -oac mp3lame -lameopts vbr=3 video.wmv -o 'American Psycho.avi'

Результирующий файл будет конвертироваться без ошибок.

Преобразование одного большого FLAC во много mp3

flac -dc ../*.flac | lame -h -b 256 /dev/stdin foo.mp3
mp3splt -c ../*.flac.cue foo.mp3

Добавление ID3-тегов в mp3-файлы

Оказалось, что далеко не все программы справляются с этим корректно. После некоторых экспериментов, я нашёл id3tag. Как её использовать, можно прочитать в help, а здесь я приведу пример конвертирования большой коллекции музыки, где файл раскиданы по директория Исполнитель/Альбом/Песня. Некоторым файла и директориям добавлен цифровой префикс NN-, который необходимо удалить в тегах.

for a in * # исполнители
do
if test -d "$a"
then
cd "$a"
for s in * # альбомы
do
if test -d "$s"
then
cd "$s"
i=1
c=`ls -1 *.mp3 | wc -l`
for f in *.mp3 # песни
do
ff=${f%.mp3}
id3tag -a "$a" \
-A "$a ${s#[0-9][0-9]-}" \
-s "${ff#[0-9][0-9]-}" \
-c "no coments" \
-C "no descr" \
-y 2009 -t $i -T $c -g 1 -w -n "$f"
i=$(($i+1))
done
cd ..
fi
done
cd ..
fi
done

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

Синхронизация времени по NTP

ntpdate 2.ru.pool.ntp.org

ssh, ssh-keygen, scp, openssl

Удалённый запуск программ
Допустим надо запустить программу от пользователя script на хосте down. Делается это очень просто:

ssh script@down /usr/home/script/bin/prog —prog-params

Единственный «недостаток» у вас каждый раз будет запрашиваться пароль. Чтобы включить авторизацию по открытому ключу, а не по паролю делаем следующие простые действия.
ssh, авторизация по ключу, а не по паролю

Если у вас нет открытого ключа, то создаём его:

cd ~/.ssh
ssh-keygen -t dsa

Теперь у вас есть открытый ключ.

Заходим на удалённый хост и добавляем ваш ключ к списку авторизованных ключей:

ssh script@down # у вас запросят пароль
scp you@yourhost:~/.ssh/id_dsa.pub ~/.ssh/temp
cat ~/.ssh/temp >> ~/.ssh/authorized_keys
rm ~/.ssh/temp

Теперь ssh будет пускать пользователя you с хоста yourhost на хост down пользователем script без пароля. То есть при запуске скриптов, как показано выше, пароль запрашиваться не будет.

Генерация паролей
Очень удобный способ генерации паролей:

openssl rand -base64 24

Генерация md5-суммы
Для генерации md5-сумм существуют отдельные утилиты (под FreeBSD — md5, под Linux — md5sum), но выдают информацию в разных форматах. openssl — более универсальный метод:

openssl md5 файл

Шифрование
Зашифровать файл:

openssl enc -aes-256-cbc -salt -in входной_файл -out зашифрованный_файл

Эта команда дважды спросит пароль для шифрования.

openssl enc -d -aes-256-cbc -in зашифрованный_файл -out расшифрованный_файл

Спросит пароль.

Того же самого эффекта можно доиться, управляя стандартными потоками:

# шифруем
openssl enc -aes-256-cbc -salt < входной_файл > зашифрованный_файл
# расшифровываем
openssl enc -d -aes-256-cbc < зашифрованный_файл > расшифрованный_файл

Полезный пример:

# создаём защищённый паролем tar-архив
tar czf — your_dir | openssl enc -aes-256-cbc -salt >file.tgz
# распаковываем этот архив
openssl enc -d -aes-256-cbc < file.tgz | tar xzf -

Telnet через openssl
Пример работы с gmail.com по SSL по POP3:

$ openssl s_client -crlf -ign_eof -connect pop.gmail.com:995
CONNECTED(00000003)
….
+OK Gpop ready for requests from XXX.XXX.XXX.XXX XXXXXXXXXXXXXXXX
USER XXXXXXXX
+OK send PASS
PASS XXXXXXXX
+OK Welcome.
STAT
+OK 528 44954440
LIST
+OK 528 messages (44954440 bytes)
1 2867
….
527 1020
528 2583
.
TOP 5 0
+OK message follows
….

.
QUIT
+OK Farewell.
read:errno=0

Консоль
Настройка цветов в команде ls во FreeBSD

Команда ls во FreeBSD работает с цветами, не как в Linux. Подробно об этом можно прочитать в man 1 ls, а здесь я приведу скриптик для очень простой настройки любой раскраски.

Предлагаю разместить в .profile, или другом инициализационном скрипте, примерно следующие инструкции:

# эти переменные изменять не надо
black='a'
red='b'
green='c'
brown='d'
blue='e'
magenta='f'
cyan='g'
light_grey='h'
bold_black='A'
bold_red='B'
bold_green='C'
yellow='D'
bold_blue='E'
bold_magenta='F'
bold_cyan='G'
bold_light_grey='H'
default='x'

# —————————————————-
# а вот тут вы можете установить любые цвета для
# разных элементов файловой системы (см. комментарии),
# используя имена переменных, инициализированных выше;
# для каждого элемента указывается два цвета:
# цвет букв и цвет фона
#
xx00="$bold_blue$default" # directory
xx01="$cyan$default" # symbolic link
xx02="$magenta$default" # socket
xx03="$magenta$default" # pipe
xx04="$green$default" # executable
xx05="$yellow$default" # block special
xx06="$brown$default" # character special
xx07="$bold_green$green" # executable with setuid bit set
xx08="$bold_green$default" # executable with setgid bit set
xx09="$bold_blue$blue" # directory writable to others, with sticky bit
xx10="$bold_blue$blue" # directory writable to others, without sticky bit
#
# —————————————————-

# экспортируем необходимые переменные
LSCOLORS="$xx00$xx01$xx02$xx03$xx04$xx05$xx06$xx07$xx08$xx09$xx10"
export LSCOLORS
CLICOLOR="YES"
export CLICOLOR

Вы можете установить любые цвета; сейчас выбраны цвета, в духе Linux-традиции, правда с небольшими моими дополнениями.

Приведение bash в чувства
Бывает, что перестают работать консоли, выдаётся сообщение вида:

subshell.c: read (subshell_pty…): No such file or directory

Решается проблема просто:

killall -CONT bash

Создание patch'ей
Создать patch:

diff старый_файл новый_файл > patch_файл

Наложить patch:

patch старый_файл patch_файл

Естественно порядок файлов везде важен.

FreeBSD/Linux md5/md5sum

Во FreeBSD и в Linux есть две утилиты для подсчёта md5-сумм файлов. Они выдают один а тот же результат, но в несколько разном формате, что очень неудобно, если надо сравнить файлы (по суммам), лежащие на Linux и FreeBSD машинах. Поэтому для каждой системы я написал маленький скрипт, эмитирующий поведение недостающей утилиты.

Для FreeBSD — md5sum:

!/bin/sh
md5 — "$@" | sed -E 's/^MD5 \((.*)\) = ([^[:space:]]+)/\2 \1/'

Для Linux — md5:

#!/bin/sh
md5sum — "$@" | sed -r 's/^(\S+)\s+(\S+)/MD5 (\2) = \1/'

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

Информационные утилиты

Xorg
При настройке оконного интерфейса (оконного менеджера) часто оказывается необходима информация об окнах того или иного приложения. Получить её можно двумя командами xwininfo и xprop.

При настройке обработки событий (клавиатура/мышь) очень полезна бывает утилита xev.

Ядро
Посмотреть настройки ядра: sysctl -ah.

Посмотреть, что значат все эти переменные: sysctl -ad.

Посмотреть сообщения ядра: dmesg

Посмотреть окружение ядра (hint'ы): kenv

Информация о ядре и загруженных модулях: kldstat и kldstat -v.
Нагрузка на диски

Очень полезная утилита smartctl

/usr/local/sbin/smartctl -a /dev/ad4

выдаст полную информацию по указанному диску, вот лишь, некоторые поля:

ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000f 100 100 051 Pre-fail Always — 0
3 Spin_Up_Time 0x0007 253 253 025 Pre-fail Always — 5760
4 Start_Stop_Count 0x0032 100 100 000 Old_age Always — 77
7 Seek_Error_Rate 0x000f 253 253 051 Pre-fail Always — 0
8 Seek_Time_Performance 0x0025 253 253 015 Pre-fail Offline — 0
9 Power_On_Hours 0x0032 100 100 000 Old_age Always — 5899
10 Spin_Retry_Count 0x0033 253 253 051 Pre-fail Always — 0
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always — 61
194 Temperature_Celsius 0x0022 050 043 000 Old_age Always — 50
196 Reallocated_Event_Count 0x0032 253 253 000 Old_age Always — 0
199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always — 0
200 Multi_Zone_Error_Rate 0x000a 100 100 000 Old_age Always — 0
201 Soft_Read_Error_Rate 0x000a 100 100 000 Old_age Always — 0
202 TA_Increase_Count 0x0032 253 253 000 Old_age Always — 0

На самом деле информации выдаётся на много больше.

Информация о нагрузке на диски в реальном масштабе времени: gstat и iostat -w 1.

Информация о swap'e: swapctl -lh

Информация о всех открытых файлах fstat.

Есть ещё systat.

Сеть
О сети netstat; при подъёме новых интерфейсов очень полезна netstat -i; при настройке маршрутизации — netstat -r.

При отладке новых интерфейсов полезна sockstat

Для прослушивания трафика очень полезна утилита ipsumdump. Лично мне она кажется более удобной, чем стандартные tcpdump и tcpshow.
Разное, но полезное

Очень полезная утилита lsof выдаёт список всех открытых файлов, включая сокеты, конвейеры и прочее. Она на удивление неприхотлива, и ей не требуется ни специальных возможностей ядра, ни монтирования procfs. Почему-то она не входит в минимальную установку FreeBSD.

Посмотреть, от каких библиотек зависит исполняемый файл:

ldd -f '%p\n' -a /usr/local/bin/mc | sort | uniq

Список локалей: locale -a.

Очень полезен мониторчик mbmon и его X-версия xmbmon. Он показывает температуры и вольтажи на системной плате.

Тем, кто активно пользуется MySQL очень понравится mytop — аналог top для MySQL. Эта программа не очень любит ставиться из пакетов, зачастую конфликтуя с различными DBD-модулями. Не обращайте на это внимания. Программа просто написана на Perl — скачайте и запустите скрипт — он очень неприхотлив.

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


Комментарии запрещены.




Статистика