Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Редактор vi
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!

Утилиты и приёмы

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

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

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

У меня есть два устройства с экранами 320x240 и возможностью показывать видео, кодированное в 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'

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

Добавление 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 — скачайте и запустите скрипт — он очень неприхотлив.

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

Эта страница набрала немалую популярность, её посещает множество людей, поэтому я решил провести небольшое исследование. Если у вас есть комментарий, если вы сочли полученную информацию полезной, не полной, или вообще бесполезной, вы можете высказать своё мнение, пожелания, дополнения.

Если вы ожидаете получить от меня ответ или разъяснение, пожалуйста укажите e-mail.
Ваше сообщение не появится на странице, а просто отправится мне.

© 1999 − 2010 Мичурин Алексей — http://www.michurin.com.ru/