简体   繁体   中英

Nested SQL Statement within MYSQL within SSH from bash script

I have the unfortunate situation, that I don't have the permission to access the MYSQL database from outside the server. But SSH is possible. Therefore I try to run a simple SQL statement from a bash file, that creates a SSH connection, connects to the MYSQL DB and run the SQL statement.

The syntax is pretty straight forward but I'm not able to use them combined in one bash file, but on the command line each individual is working

that the snippets I'm using:

1) establish the SSH connection:

$:sshpass -p my_password ssh my_user@my_server

2) connect to the MYSQL DB:

my_server>mysql -h rdbms -u db_user -D db_name -p db_password

3) run the SQL statement

mysql>SELECT * FROM table

... as said. all good when running on command line.

But when I combine them into a bash file:

#!/usr/bin/
sshpass -p my_password ssh my_user@my_server
mysql -h rdbms -u db_user -D db_name -p db_password
SELECT * FROM table

It stops right after the first line (establishing the SSH connection). Any ideas how I can combine these?

To run a command on a remote server via ssh, you need to list the command as arguments on the same command-line.

For example:

sshpass -p my_password ssh my_user@my_server date

That will run date on the remote server, and return the output of that command.

You can run the mysql client this way too. Just put the mysql command on the same command-line, as arguments to your ssh.

sshpass -p my_password ssh my_user@my_server mysql ...arguments...

You can use \\ at the end of a line to continue a long command on the following line. It works as if you had written the full command on one very long line, but it's easier to post in Stack Overflow so readers don't have to scroll horizontally to read it. :-)

Also note that the remote command must be in quotes so it appears like a single argument to ssh. When it runs on the remote server, it will be expanded to multiple arguments.

sshpass -p my_password ssh my_user@my_server \
 "mysql ...arguments..."

The mysql client has an option -e that you can use to execute an SQL statement.

sshpass -p my_password ssh my_user@my_server \
 "mysql -h rdbms -u db_user -D db_name -pdb_password -e 'SELECT * FROM table'"

A couple of tips about the password:

  1. There must be no space between -p and the password. If you use -p with a space after it, you will be prompted for the password interactively. The word following the space is not taken as the password unless you stick it against the -p .

  2. I don't like to put passwords in plaintext on the command-line. It's not safe to do that, because anyone who can access your shell history can view the password. It's better to use an option file or a login file . But you'll have to put these on the remote server where the mysql client runs.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM