Command Line

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

Получение сжатого дампа MySQL

Теперь о том, как снять дамп базы MySQL под названием app в сжатом виде и залить его обратно.

mysqldump app | bzip2 > dump.sql.bz2
bunzip2 -c dump.sql.bz2 | mysql app

Не забываем для удобства создать файлик ~/.my.cnf и прописать туда параметры для подключения в СУБД.

Копирование ключа на сервер

В OS X, например, вы не найдете утилиты ssh-copy-id, пока не установите ее через homebrew. Но есть решение!

cat ~/.ssh/id_rsa.pub | ssh -p 22 deploy@10.10.10.10 'mkdir -m 700 -p ~/.ssh; cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

Замена подстроки во всех файлах

Давайте заменим dlysenko.ru на 1ys3nko.com во всех файлах HTML внутри текущей директории рекурсивно.

find . -name '*.html' -exec sed -i 's/dlysenko.ru/1ys3nko.com/g' '{}' \;

Говорят, если показать это человеку, который только что проделал такую ручную замену в тысяче файлов, он может заплакать :)

Защищенная передача пароля

Представьте, что вам нужно отправить кому-то пароль. Но вы параноик и еще помните о том, что трафик у вас нешифрованный. За вами следит ФБР и на одном из узлов этот пароль может быть перехвачен. Вот вам решение.

echo 'password' | openssl enc -aes-256-cbc > credentials.dat
openssl enc -aes-256-cbc -d -in credentials.dat

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

Добавление пользователя в группу

Постоянно приходится добавлять пользователя в группу и постоянно, почему-то, забываю флаги к команде. Итак, чтобы добавить пользователя user в группу group пользуемся командой.

usermod -a -G group user

Наверное, если флаг -G вынести вправо, запомнить будет легче. Но это все привычка. Ведь в FreeBSD и OS X все флаги должны идти строго до аргументов, в отличии от Linux.

Рекурсивная конвертация всех файлов в UTF-8

Здесь уже одной командой не обойдется, хотя, можно все это и уместить в одну строку, давайте лучше добавим новую функцию в ~/.bash_profile.

function cp1251-utf8-recursive {
    find . -type f -name '*.html' -o -name '*.html.erb' | while read file
    do
        echo $file
        iconv -f CP1251 -t UTF-8 "$file" > tmp
        mv -f tmp "$file"
    done
}

Теперь можно вызвать cp1251-utf8-recursive в директории и конвертировать таким образом все файлы в UTF8 из Windows-1251. Не забудьте перед этим сделать source ~/.bash_profile.

Обрезание шаблонов

Совсем недавно мне нужно было перенести сайт на CMS. Дело в том, что у меня был только доступ к сайту по HTTP. Я скачал весь сайт, выделил layout. Оставалось обрезать все то, что относится к layout из остальных страниц, чтобы добавить все в CMS. Все решилось написанием новой функции.

function remove-layout-recursive {
    if [ -z $1 ]
    then
        echo "Empty pattern"
        return 1
    fi

    find . -type f -name '*.html' -o -name '*.htm' | while read file
    do
        echo $file
        sed -n "$1" "$file" | sed '1d' | sed '$d' > tmp
        mv -f tmp "$file"
    done
}
remove-layout-recursive '/<div class="content"/,/<\/div><\/td>/p'

Таким образом, из всех файлов в каталоге были вырезаны все строки до той, которая содержала <div class="content включительно. Снизу были вырезаны все строки, начиная с той, которая содержит </div></td>.