Злой троянец увел у меня аккаунт на хабр, после чего под моим аккаунтом начали публиковаться какие-то тупые мультики. К сожалению узнал я об этом только когда НЛО перевело меня в 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 со следующим содержимым: [mysql]
[client]
user = 'root'
password = 'password'
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