Выполнить запрос Google Cloud SQL в командной строке неинтерактивно

Я пишу сценарий для организации экземпляра Google Cloud SQL с помощью gcloud SDK.

В SDK есть команда connect, которая принимает имя пользователя, но пароль необходимо вводить в приглашении, т. е. его нельзя передавать в качестве аргумента.

Успешная аутентификация позволяет выполнить запрос — поток выглядит следующим образом:

$ gcloud sql connect instance-name --user=root
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [root].Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 8054
Server version: 5.7.14-google-log (Google)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> USE tablename;

Мне нужно сделать это неинтерактивно. Я пытался:

gcloud sql connect instance-name --user=root && echo "password" && echo "USE tablename;"

Но он выполняет только первую команду.

Как я могу подключиться, аутентифицировать и выполнить запрос в одной команде?

Обновление:

Согласно комментарию @danlor со ссылкой на этот вопрос, я пробовал оба:

yes password | gcloud...

а также

printf 'password\n' | gcloud...

но оба по-прежнему запрашивают пароль.


person Adam Hopkinson    schedule 14.05.2019    source источник
comment
&& означает, что следующая команда будет выполнена только после чистого выхода (успеха) предыдущей команды. Вот почему выполняется только первая команда. Проверьте askubuntu.com/questions/338857/   -  person danrodlor    schedule 14.05.2019
comment
Спасибо @danlor - я пробовал оба подхода yes и printf в связанном ответе, но ни один из них не работает   -  person Adam Hopkinson    schedule 14.05.2019


Ответы (1)


Не похоже, что команда gcloud sql connect дает вам возможность передать флаг execute утилите командной строки MySQL. Вместо этого я бы предложил использовать для этого Cloud SQL proxy. Ваш сценарий, скорее всего, будет выглядеть примерно так:

./cloud_sql_proxy -dir=/cloudsql -instances=<INSTANCE_CONNECTION_NAME> &
PID=$!
mysql -u root --password "YOUR-PASSWORD" -S /cloudsql/<INSTANCE_CONNECTION_NAME> --execute "USE tablename;"
kill $PID
person kurtisvg    schedule 14.05.2019