Я пытаюсь выполнить удаленную команду mysqldump, перенаправить stdout в файл dmp, а затем запустить tar.
Я немного запутался в том, как делать биты перенаправления по ssh:
т.е.
ssh user@host.com mysqldump $dbname -u admin -p > dbdump.dmp && tar cvzf dbdump.tar.gz dbdump.dmp
Вопросы:
1) Я не предоставляю пароль, потому что хочу, чтобы он подсказал мне. Сможет ли с этим справиться удаленная команда ssh? 2) Что с синтаксисом? Я хочу использовать цитаты или нет? Что происходит с перенаправлениями и каналами? Должны ли они быть экранированы или отформатированы каким-то особым образом.
Когда вы подключаетесь к другому хосту, SSH выполняет заданную команду на стороне сервера (если ничего не задано, запускает оболочку), перенаправляя все потоки stdin / stdout / stderr. В ssh
команда заканчивается в >
. Это означает, что вывод команды mysql перенаправляется в файл dbdump.dmp
на стороне клиента. Затем, все еще на стороне клиента, из этого файла создается tar-архив.
Если вы поместите всю командную строку в кавычки, как предлагает Dom, она будет полностью запущена на удаленной стороне, таким образом у вас будут файлы на вашем сервере.
Теоретически, пароль тоже должен работать (поскольку поток stdin не перенаправляется, а просто передается), но здесь этого не произошло.
Вы можете ввести пароль в .my.cnf
(если вам нужна дополнительная безопасность, создайте дополнительного пользователя только для резервного копирования). Вы также можете использовать логин с открытым ключом для этой учетной записи, таким образом он будет работать полностью без вашего участия.
BTW: Почему вы создаете tar-архив дампа? Если вам нужно только сжатие, gzip
или чего-то подобного вполне достаточно.
На каком компьютере вы хотите запустить tar? если он находится на сервере, вам нужно процитировать всю строку, например: ssh user@host.com "mysqldump $dbname -u admin -p > dbdump.dmp && tar cvzf dbdump.tar.gz dbdump.dmp"
Если вы этого не сделаете, я думаю, что конец строки будет выполняться локально и не будет работать, поскольку у вас нет файла dbdump. Для 1) нет проблем. Если потребуется пароль, он будет запрошен. [EDIT] OOPS, я дважды проверяю, вы говорите о пароле MySQL, а не SSH! Однако я думаю, что его спросят [EDIT2] Просто проверьте, работает ли он с кавычками: сначала запрашивается пароль SSH, а затем пароль MySQL
Это сработало для меня (после нескольких тестов):
ssh -t kom "mysql -uroot -p -e 'show databases;'"
ssh -t kom "mysql -uroot -p < /home/ling/websites/jin_test/.deploy/tmp.sql"
«Уловкой» были кавычки вокруг команды.
В -t опция позволяет запрашивать пароль в интерактивном режиме через удаленную оболочку.
В ком вот только идентификатор конфигурации ssh, определенный в моем ~ / .ssh / config файл (подробнее см. здесь: https://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/).