Полезные мелочи в работе веб-разработчика или «Как я мог без этого жить»

в 11:42, , рубрики: mysql, ssh, Веб-разработка, консоль, Песочница, метки: , ,

Злой троянец увел у меня аккаунт на хабр, после чего под моим аккаунтом начали публиковаться какие-то тупые мультики. К сожалению узнал я об этом только когда НЛО перевело меня в read-only. Не беда: повод наконец написать пост, который давно собирался.

Веб-разработчику консоль нужна, но не на столько что бы бросив все дела начинать читать толстенные книжки по линуксу. Именно поэтому я учился консольным хитростям от случая к случаю и, судя по моим сотрудникам, многие поступают точно так же. Раскрою пару удобных секретов, без которых я уже не могу жить.

1) Используй ssh-ключи, Люк!

Ключи я открыл для себя давно, хотя регулярно встречаются люди для которых они в новинку. Ключи ssh позволяют настроить один раз подключение и больше не хранить в «блокнотике» пароли ко всем сайтам
$ ssh-keygen -t dsa

Соглашаемся на стандартное расположение ключа: /home/user/data/.ssh/id_dsa,
Вводим (или не вводим) passphrase. Лучше все-таки вводить: система будет помнить ваш пароль от логина до логаута, то есть вводить постоянно этот пароль не нужно. Зато на порядок возрастет безопасность.
После этого мы получим два файла: ~/.ssh/id_dsa и ~/.ssh/id_dsa.pub.
Первый это личный (приватный) ключ — его лучше скопировать на флешку и спрятать про запас. Второй это ключ публичный, его-то мы и будем сообщать всем своим серверам.

Наиболее простой способ перенести ключ на сервер это выполнить у себя в консоли вот эту команду:
$ ssh user@hostname "umask 077; cat >> .ssh/authorized_keys" < ~/.ssh/id_dsa.pub

и в последний раз ввести пароль к SSH удаленного компьютера

2) Используй конфиги ssh, Люк!

Все работает прекрасно, но надо каждый раз вводить длинные логины и хостнеймы. Надо оптимизировать!
Редактируем файл ~/.ssh/config, добавляем:
Host host
User user
Hostname hostname

Проверяем права на файл ~/.ssh/config, если они разрешают писать кому-то кроме нас, меняем на другие:
$ chmod 644 ~/.ssh/config

Допустим компьютер, к которому мы хотим подключиться находится за натом. Нам нужно зайти по SSH на один сервер, затем уже с него перейти на нужный компьютер. Если это нужно делать по множеству раз в день это очень, очень быстро надоест.
Прописываем новое правило в конфиг:
Host computer.hostname
Hostname 192.168.1.10
User user
ProxyCommand ssh hostname nc %h %p

Вот и все! Теперь можем написать ssh computer.hostname, пользователь будет подставлен автоматически, соединение будет установлено напрямую с нужным компьютером. Главное не забыть ему тоже положить свой публичный ключ.
В добавок опишу две полезные директивы
LocalForward localhost:8080 192.168.10.10:80 #Пробрасывать удаленный порт к себе каждый раз, когда происходит подключение по SSH.
Port 8022 #указать порт SSH сервера, удобно когда он живет не на стандартном порту.

3) Сила в автодополнениях

Вводить каждый раз четыре буквы host? Это же утомительно! Как правило автодополнение парсит файлы ssh конфига, достаточно начать писать хостнейм и нажать таб, что бы имя хоста было дописано автоматически. Если этого не происходит нужно баш этому научить.
Добавляем строчку
complete -W "$(echo `cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'`)" ssh

в файл ~/.bash_profile

Туда же можно дописать следующий код:
function __mysql_list_all_opts {
local i IFS=$'n'
mysql --help|egrep '^ -'|awk '{print $1 "n" $2}'|egrep '^-'|sed s/,$//|sort
}

__mysql_all_opts=
function __mysql_compute_all_opts {
: ${__mysql_all_opts:=$(__mysql_list_all_opts)}
}

function _mysql_complete {
local cur prev opts

COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}

case $prev in
*)
if [[ "$cur" == -* ]]; then
__mysql_compute_all_opts
opts=${__mysql_all_opts}
else
opts=$(mysql -uroot -s -e 'show databases')
fi
;;
esac

COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
COMPREPLY=( $(compgen -W "$opts" -- $cur) )
}

complete -F _mysql_complete mysql

Аналогично можно прописать и mysqldump

После того как мы откроем новую консоль bash у нас консоль будет дополнять имя удаленного компьютера и имя локальной базы!
Если у вас стоит пароль на подключение к базе нужно сделать следующий шаг.

4) Не вводим пароль для консольного мускуля

Каждый раз запуская консольный клиент mysql или mysqldump нужно не забывать передавать ему логин и пароль. Что бы этого избежать достаточно раз и навсегда создать файл ~/.my.cnf со следующим содержимым:
[client]
user = 'root'
password = 'password'

[mysql]
pager = less -iMSx4 -FX

Секцию mysqld добавлять по желанию. Она позволит вам не мучаться оптимальным подбором лимита, при работе с базой из командной строке. Если вывод длиннее чем количество строк на экране — вывод автоматически будет направлен в команду less. По которой можно удобно перемещаться вертикально и горизонтально и даже делать поиск!

5) Итоги:

Что бы получить дамп базы данных с удаленного сервера раньше приходилось выполнять серию компанд. В худшем случае (пример основан на реальных событиях):
localhost $ ssh -P 8022 user@hostname #идем на сервер
hostname $ ssh user2@computer #идем на удаленный комп
computer $ mysqldump -u root -p password long_database_name > ~/filename.sql
computer $ exit
hostname $ scp user2@computer:~/filename.sql ~/filename.sql
hostname $ ssh user2@computer
computer $ rm ~/filename.sql
computer $ exit
hostname $ exit
localhost $ scp -P 8022 user@hostname:~/filename.sql ~/filename.sql
localhost $ ssh -P 8022 user@hostname
hostname $ rm ~/filename.sql
hostname $ exit
localhost $ cat ~/filename.sql | mysql -u root -p password long_database_name
localhost $ rm ~/filename.sql #залили наконец, удаляем

Теперь вместо всего этого ужаса достаточно выполнить одну команду:
$ ssh computer mysqldump long_database_name | mysql long_database_name

В реальности и того меньше, т. к. перед каждой командой можно нажать таб:
ssh com[tab] mysqldu[tab] lon[tab] | mys[tab] lon[tab]

Нет желания слать файл в распакованном виде? Не беда, будем на лету паковать с той стороны в зип, а с этой — распаковывать.
$ ssh computer 'mysqldump long_database_name | gzip' | gunzip | mysql longdatabase_name

В качестве дополнительных плюшек получили возможность качать прямо с удаленного компьютера за натом файлы к себе, не пересохраняя их по дорге.
$ scp computer:~/test.txt ~/

Если тема сообществу покажется интересной — продолжу.
Могу рассказать про то как настроить iTerm под маком, что б работать с ssh было необыкновенно удобно
Про то как азы баш скриптинга могут сэкономить кучу времени при работе с командной строкой
Про плюсы команды screen и как ее удобно настроить
А так же про забытого дедушку z-modem и чем он может помочь современному разработчику в повседневной жизни.

Автор: Alex_EXEcuter

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js