Using MySQL Workbench, I can connect mysql running on amazon rds. I supply SSH Hostname, SSH Username, SSH Password, SSH Key File, MySQL Hostname, MySQL Server Port, Username, and Password.
However, I have a python script with which I'd like to connect to this same database. I tried using ssh tunneling:
with SSHTunnelForwarder(
(SSH Hostname, 22),
ssh_password=SSH Password,
ssh_username=SSH Username,
ssh_pkey= SSH Key File path,
remote_bind_address=(MySQL Hostname, MySQL Port) as server:
conn = MySQLdb.connect(
host = MySQL Hostname,
port = MySQL Port,
user = Username,
passwd = Password)
When I run the script, it hangs for about a minute, then says
'Can't connect to MySQL server on ~MySQL Hostname~'
I am unsure about the remote_bind_address. Since I don't supply that info when successfully connecting from MySQLWorkbench, is there a way to connect from Python without specifying remote_bind_address?
Additionally, I tried using the scripting tool in MySQL Workbench. I am able to load my python script, but then an error occurs at one of my imports, specifically 'import module requests'. The error indicates there is no module named requests. However, this module has been installed for a while, and I have imported and successfully used it outside of MySQL Workbench.
Related
Here is what I am trying to achieve:
SSH into an EC2 instance Node1.
Public IP is available for Node1.
I am using a .pem file to create Connection with Node1.
From Node1 ssh into localhost on port 2022: ssh admin#localhost -p 2022
Now execute a command, while inside localhost.
Here is the code snippet I am using:
from fabric2 import Connection
jump_host_ip = "A.B.C.D"
user = "root_user"
pem_key = "example.pem"
with Connection(jump_host_ip, user=user, connect_kwargs={"key_filename": pem_key}) as jump_host:
with Connection('localhost', user='dummy_user', port=2022,
connect_kwargs={'password': 'password'}, gateway=jump_host) as local_host:
local_host.run('ls -la')
This code is hosted on another EC2 server. And when executed from the EC2 server it throws the following exception:
paramiko.ssh_exception.AuthenticationException: Authentication failed.
But this code works when executed from a local machine (not from EC2 server).
Is it possible EC2 could be blocking the Connection to localhost through gateway ?
If yes, what should be the fix for this ?
I'm having trouble connecting to my local MySQL database in python, but have no problem connecting from the command line.
When I try this:
db = MySQLdb.connect(host="localhost",
user="username",
passwd="password",
db="dbname",
port=3306,
unix_socket="/var/run/mysqld/mysqld.sock")
I get the following error:
OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
I get the same error when I don't explicitly pass in the socket path. I get a similar error when I use 127.0.0.1 instead of localhost as the host (also removing the unix socket argument):
OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)")
I know that MySQL is running, as when I can connect to the database from the command line no problem with mysql -u username -p dbname. I also know MySQL is listening on 127.0.0.1, when I run mysql -h 127.0.0.1 -p I can connect as well. I'm also sure it's listening on port 3306.
I have been having problems connecting to the database. I have tested the username and password. It works fine and can login to the database. The database has been running.
This is the code for python in my own laptop not the virtual machine.
import mysql.connector
try:
connection = mysql.connector.connect(
user='myname', password='mypw', host='169.254.X.X', database='GarageParking')
print('success')
except mysql.connector.Error as e:
print("Database not successful")
The host is the ip addr of the raspberrypi. I had edited the mysql config file to 0.0.0.0. I just have problems connecting to the database only not the login.
The error is
2003: Can't connect to MySQL server on '169.254.X.X:3306' (10061 No connection could be made because the target machine actively refused it)
phpMyadmin
I appreciate your help.
I have solved alr. For those who wants to access the mysql running on raspberry pi,
import mysql.connector
try:
connection = mysql.connector.connect(
user='x', password='x', host='169.254.X.X', database='xx',
port=3306) // The host is the ip addr of the raspberry pi which also runs mysql.
print('success')
except mysql.connector.Error as e:
print(e)
Remember to comment out the bind-addr in the my.cnf.
The command is
sudo nano /etc/mysql/my.cnf
Please check if there are anything u have added accidentally in the my.cnf file and remove them appropriately.
After you have modified, restart your server
sudo service mysql restart
Please create a user which can be from any host. In this case, it is a #. Please specify choose any host in the phpmyadmin web.
I'm trying to establish a connection with a MongoDB database via an SSH connection programmatically from python. I can create a MongoClient object to connect locally but I can't see how to establish an SSH connection for my MongoClient to use.
How would I do this?
First make sure you have no local MongoDB running on your machine, then ssh to the server where MongoDB is running:
ssh -L 27017:MYHOST:27017 MYUSER#MYHOST
Replace MYUSER and MYHOST with your username and host. Then, in another terminal window, run the "mongo" shell from your local computer. By default it connects to localhost:27017, which you've port-forwarded to the remote host. The "mongo" shell should connect correctly.
Then, create a PyMongo connection normally in Python:
>>> from pymongo import MongoClient
>>> c = MongoClient()
>>> c.test.command('buildinfo')
...
More info about SSH tunneling here:
https://help.ubuntu.com/community/SSH/OpenSSH/PortForwarding
This is not MongoDB-specific at all, any network protocol can be tunneled with SSH port-forwarding.
I am not able connect to PostgreSQL remotely using python and psycopg2:
Here is my code.
>>> import psycopg2
>>> conn_string = "host='localhost' dbname='mydb' user='postgres'"
>>> print "Connecting to database\n ->%s" % (conn_string)
Connecting to database
->host='localhost' dbname='mydb' user='postgres'
>>> conn = psycopg2.connect(conn_string)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/tools/lib/python2.7/site-packages/psycopg2/__init__.py", line 164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
The password is not set for postgres user.
Generally, I can connect to database by running following method on host.
1. SSH to box
2. su - postgres
3. psql
4. \c mydb
The server runs PostgreSQL 9.1.
You're trying to connect to PostgreSQL on localhost using a script running on your computer, but there's no PostgreSQL server running there.
For this to work, you'd have to ssh to the remote server, then run your Python script there, where the PostgreSQL server is "local" relative to the Python script.
(That's why running psql works - because you're running it on the remote server, where PostgreSQL is "local" relative to psql).
Alternately, you could:
Use an SSH tunnel to forward the PostgreSQL port from the local computer to the remote one; or
Connect directly over TCP/IP to the remote PostgreSQL server using its host name or IP address, after enabling remote connections on the server.
Note that just putting the server's IP address or host name into the connection string instead of localhost will not work unless you also configure the server to accept remote connections. You must set listen_addresses to listen for non-local connections, add any required firewall rules, set pg_hba.conf to permit connections from remote machines, and preferably set up SSL. All this is covered in the Client Authentication chapter of the PostgreSQL user manual.
You'll probably find an SSH tunnel simpler and easier to understand.